diff --git a/.env b/.env index 6ac42ba97b4..3b91f44d813 100644 --- a/.env +++ b/.env @@ -1,3 +1,6 @@ VITE_BYPASS_LOGIN=0 VITE_BYPASS_TUTORIAL=0 -VITE_SERVER_URL=http://localhost:8001 \ No newline at end of file +VITE_SERVER_URL=http://localhost:8001 +VITE_DISCORD_CLIENT_ID=1248062921129459756 +VITE_GOOGLE_CLIENT_ID=955345393540-2k6lfftf0fdnb0krqmpthjnqavfvvf73.apps.googleusercontent.com +VITE_I18N_DEBUG=0 diff --git a/.env.beta b/.env.beta index 8d1e93b3277..88147215258 100644 --- a/.env.beta +++ b/.env.beta @@ -1,3 +1,6 @@ VITE_BYPASS_LOGIN=0 VITE_BYPASS_TUTORIAL=0 -VITE_SERVER_URL=https://api.beta.pokerogue.net \ No newline at end of file +VITE_SERVER_URL=https://api.beta.pokerogue.net +VITE_DISCORD_CLIENT_ID=1248062921129459756 +VITE_GOOGLE_CLIENT_ID=955345393540-2k6lfftf0fdnb0krqmpthjnqavfvvf73.apps.googleusercontent.com +VITE_I18N_DEBUG=1 diff --git a/.env.development b/.env.development index e9180f0875d..6c92036270f 100644 --- a/.env.development +++ b/.env.development @@ -1,3 +1,7 @@ VITE_BYPASS_LOGIN=1 VITE_BYPASS_TUTORIAL=0 -VITE_SERVER_URL=http://localhost:8001 \ No newline at end of file +VITE_SERVER_URL=http://localhost:8001 +VITE_DISCORD_CLIENT_ID=1234567890 +VITE_GOOGLE_CLIENT_ID=1234567890 +VITE_I18N_DEBUG=1 +VITE_PORT=8000 diff --git a/.env.production b/.env.production index 74818d41a12..65dc7875902 100644 --- a/.env.production +++ b/.env.production @@ -1,3 +1,6 @@ VITE_BYPASS_LOGIN=0 VITE_BYPASS_TUTORIAL=0 -VITE_SERVER_URL=https://api.pokerogue.net \ No newline at end of file +VITE_SERVER_URL=https://api.pokerogue.net +VITE_DISCORD_CLIENT_ID=1248062921129459756 +VITE_GOOGLE_CLIENT_ID=955345393540-2k6lfftf0fdnb0krqmpthjnqavfvvf73.apps.googleusercontent.com +VITE_I18N_DEBUG=0 \ No newline at end of file diff --git a/.env.test b/.env.test new file mode 100644 index 00000000000..54d5bd6f257 --- /dev/null +++ b/.env.test @@ -0,0 +1 @@ +VITE_I18N_DEBUG=0 \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 7941254e48a..644fdcbe563 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,7 +1,7 @@ name: Bug Report description: Create a report to help us improve title: "[Bug] " -labels: ["bug"] +labels: ["Bug"] body: - type: markdown attributes: diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 158ac312a50..e4f1fa5ebf5 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -25,6 +25,7 @@ ## 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? diff --git a/.github/workflows/deploy-beta.yml b/.github/workflows/deploy-beta.yml index d954d9bb865..3af48b400af 100644 --- a/.github/workflows/deploy-beta.yml +++ b/.github/workflows/deploy-beta.yml @@ -1,8 +1,9 @@ name: Deploy Beta on: - push: {} - pull_request: {} + push: + branches: + - beta jobs: deploy: @@ -20,7 +21,6 @@ jobs: env: NODE_ENV: production - name: Set up SSH - if: github.event_name == 'push' && github.ref_name == github.event.repository.default_branch run: | mkdir ~/.ssh echo "${{ secrets.BETA_SSH_PUBLIC_KEY }}" > ~/.ssh/id_ed25519.pub @@ -28,6 +28,5 @@ jobs: chmod 600 ~/.ssh/* ssh-keyscan -H ${{ secrets.BETA_SSH_HOST }} >> ~/.ssh/known_hosts - name: Deploy build on server - if: github.event_name == 'push' && github.ref_name == github.event.repository.default_branch run: | rsync --del --no-times --checksum -vrm dist/* ${{ secrets.BETA_SSH_USER }}@${{ secrets.BETA_SSH_HOST }}:${{ secrets.BETA_DESTINATION_DIR }} \ No newline at end of file diff --git a/.github/workflows/eslint.yml b/.github/workflows/eslint.yml index 32c0ca7707a..9068f1ae9a2 100644 --- a/.github/workflows/eslint.yml +++ b/.github/workflows/eslint.yml @@ -6,9 +6,11 @@ on: push: branches: - main # Trigger on push events to the main branch + - beta # Trigger on push events to the beta branch pull_request: branches: - main # Trigger on pull request events targeting the main branch + - beta # Trigger on pull request events targeting the beta branch jobs: run-linters: # Define a job named "run-linters" diff --git a/.github/workflows/github-pages.yml b/.github/workflows/github-pages.yml index ce52e8d9772..3b7617c45f4 100644 --- a/.github/workflows/github-pages.yml +++ b/.github/workflows/github-pages.yml @@ -7,6 +7,7 @@ on: pull_request: branches: - main + - beta jobs: pages: @@ -52,7 +53,7 @@ jobs: working-directory: ${{env.api-dir}} run: | cd pokerogue_docs - npx typedoc --out /tmp/docs --githubPages false --entryPoints ./src/ + npm run docs -- --out /tmp/docs --githubPages false --entryPoints ./src/ - name: Commit & Push docs if: github.event_name == 'push' diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index c1c32a95cd6..9ce1d1c5038 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -6,9 +6,11 @@ on: push: branches: - main # Trigger on push events to the main branch + - beta # Trigger on push events to the beta branch pull_request: branches: - main # Trigger on pull request events targeting the main branch + - beta # Trigger on pull request events targeting the beta branch jobs: run-tests: # Define a job named "run-tests" diff --git a/.gitignore b/.gitignore index 0ae49fe9e1c..c22d0b2ce4c 100644 --- a/.gitignore +++ b/.gitignore @@ -39,4 +39,5 @@ coverage # Local Documentation /typedoc -/dependency-graph.svg \ No newline at end of file +/dependency-graph.svg +/.vs diff --git a/README.md b/README.md index d1b46e630bf..ade4adc2c59 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ PokéRogue -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! +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. +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 @@ -17,9 +17,9 @@ If you have the motivation and experience with Typescript/Javascript (or are wil 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. +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. -### ❔ FAQ +### ❔ 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 @@ -56,6 +56,7 @@ Check out [Github Issues](https://github.com/pagefaultgames/pokerogue/issues) to - Pokémon Scarlet/Violet - Firel (Custom Laboratory, Metropolis, Seabed, and Space biome music) - Lmz (Custom Jungle biome music) + - Andr06 (Custom Slum and Sea biome music) ### 🎵 Sound Effects - Pokémon Emerald @@ -111,6 +112,7 @@ Check out [Github Issues](https://github.com/pagefaultgames/pokerogue/issues) to - mangalos810 - Involuntary-Twitch - selstar + - koda_want_to_sleep ### 🎨 Move Animations - Pokémon Reborn diff --git a/package-lock.json b/package-lock.json index 638a173d7e2..71de51abb35 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35,8 +35,8 @@ "lefthook": "^1.6.12", "phaser3spectorjs": "^0.0.8", "pokenode-ts": "^1.20.0", - "typedoc": "^0.25.13", - "typescript": "^5.4.5", + "typedoc": "^0.26.4", + "typescript": "^5.5.3", "typescript-eslint": "^7.10.0", "vite": "^4.5.0", "vite-plugin-fs": "^0.4.4", @@ -1179,6 +1179,16 @@ "win32" ] }, + "node_modules/@shikijs/core": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.10.3.tgz", + "integrity": "sha512-D45PMaBaeDHxww+EkcDQtDAtzv00Gcsp72ukBtaLSmqRvh0WgGMq3Al0rl1QQBZfuneO75NXMIzEZGFitThWbg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.4" + } + }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -1191,6 +1201,16 @@ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, + "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, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/jsdom": { "version": "21.1.7", "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.7.tgz", @@ -1220,6 +1240,13 @@ "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==" }, + "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, + "license": "MIT" + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "7.10.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.10.0.tgz", @@ -1706,12 +1733,6 @@ "node": ">=8" } }, - "node_modules/ansi-sequence-parser": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", - "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==", - "dev": true - }, "node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -4614,12 +4635,6 @@ "node": ">=6" } }, - "node_modules/jsonc-parser": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", - "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", - "dev": true - }, "node_modules/jsonify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", @@ -4884,6 +4899,16 @@ "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, + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, "node_modules/local-pkg": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", @@ -4985,18 +5010,31 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "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, - "bin": { - "marked": "bin/marked.js" + "license": "MIT", + "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" }, - "engines": { - "node": ">= 12" + "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, + "license": "MIT" + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -5725,6 +5763,16 @@ "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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/qs": { "version": "6.12.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", @@ -6145,15 +6193,14 @@ } }, "node_modules/shiki": { - "version": "0.14.7", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.7.tgz", - "integrity": "sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.10.3.tgz", + "integrity": "sha512-eneCLncGuvPdTutJuLyUGS8QNPAVFO5Trvld2wgEq1e002mwctAhJKeMGWtWVXOIEzmlcLRqcgPSorR6AVzOmQ==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-sequence-parser": "^1.1.0", - "jsonc-parser": "^3.2.0", - "vscode-oniguruma": "^1.7.0", - "vscode-textmate": "^8.0.0" + "@shikijs/core": "1.10.3", + "@types/hast": "^3.0.4" } }, "node_modules/side-channel": { @@ -6770,24 +6817,26 @@ } }, "node_modules/typedoc": { - "version": "0.25.13", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.25.13.tgz", - "integrity": "sha512-pQqiwiJ+Z4pigfOnnysObszLiU3mVLWAExSPf+Mu06G/qsc3wzbuM56SZQvONhHLncLUhYzOVkjFFpFfL5AzhQ==", + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.26.4.tgz", + "integrity": "sha512-FlW6HpvULDKgc3rK04V+nbFyXogPV88hurarDPOjuuB5HAwuAlrCMQ5NeH7Zt68a/ikOKu6Z/0hFXAeC9xPccQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "lunr": "^2.3.9", - "marked": "^4.3.0", - "minimatch": "^9.0.3", - "shiki": "^0.14.7" + "markdown-it": "^14.1.0", + "minimatch": "^9.0.5", + "shiki": "^1.9.1", + "yaml": "^2.4.5" }, "bin": { "typedoc": "bin/typedoc" }, "engines": { - "node": ">= 16" + "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" + "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/typedoc/node_modules/brace-expansion": { @@ -6795,15 +6844,17 @@ "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/typedoc/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "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" }, @@ -6815,10 +6866,11 @@ } }, "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", + "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -6853,6 +6905,13 @@ } } }, + "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, + "license": "MIT" + }, "node_modules/ufo": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz", @@ -8162,18 +8221,6 @@ } } }, - "node_modules/vscode-oniguruma": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", - "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", - "dev": true - }, - "node_modules/vscode-textmate": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", - "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", - "dev": true - }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", @@ -8414,6 +8461,19 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, + "node_modules/yaml": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz", + "integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==", + "dev": true, + "license": "ISC", + "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", diff --git a/package.json b/package.json index 160ca965bc8..612321906eb 100644 --- a/package.json +++ b/package.json @@ -9,10 +9,10 @@ "build": "vite build", "build:beta": "vite build --mode beta", "preview": "vite preview", - "test": "vitest run", - "test:cov": "vitest run --coverage", - "test:watch": "vitest watch --coverage", - "test:silent": "vitest run --silent", + "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", "eslint": "eslint --fix .", "eslint-ci": "eslint .", "docs": "typedoc", @@ -34,8 +34,8 @@ "lefthook": "^1.6.12", "phaser3spectorjs": "^0.0.8", "pokenode-ts": "^1.20.0", - "typedoc": "^0.25.13", - "typescript": "^5.4.5", + "typedoc": "^0.26.4", + "typescript": "^5.5.3", "typescript-eslint": "^7.10.0", "vite": "^4.5.0", "vite-plugin-fs": "^0.4.4", diff --git a/public/audio/bgm/battle_rival.mp3 b/public/audio/bgm/battle_rival.mp3 index 82ff586576a..a17bc759b59 100644 Binary files a/public/audio/bgm/battle_rival.mp3 and b/public/audio/bgm/battle_rival.mp3 differ diff --git a/public/audio/bgm/sea.mp3 b/public/audio/bgm/sea.mp3 index 8bdaaa696f1..147dad0960d 100644 Binary files a/public/audio/bgm/sea.mp3 and b/public/audio/bgm/sea.mp3 differ diff --git a/public/audio/bgm/slum.mp3 b/public/audio/bgm/slum.mp3 index 1315c7838fc..5431671d0ae 100644 Binary files a/public/audio/bgm/slum.mp3 and b/public/audio/bgm/slum.mp3 differ diff --git a/public/battle-anims/muddy-water.json b/public/battle-anims/muddy-water.json index 450e767a75a..e415f1056bf 100644 --- a/public/battle-anims/muddy-water.json +++ b/public/battle-anims/muddy-water.json @@ -673,6 +673,33 @@ "focus": 1 } ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "priority": 1, + "focus": 2 + }, + { + "x": 129, + "y": -64.6, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 1 + } + ], [ { "x": 0, @@ -688,8 +715,399 @@ "focus": 2 }, { - "x": 128, - "y": -64, + "x": 129, + "y": -64.6, + "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, + "priority": 1, + "focus": 2 + }, + { + "x": 130, + "y": -66, + "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": 130, + "y": -66, + "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": 131.6, + "y": -66.6, + "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": 131.6, + "y": -66.6, + "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": 131.6, + "y": -66.6, + "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": 132, + "y": -67, + "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": 132, + "y": -67, + "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": 132, + "y": -67, + "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": 131.6, + "y": -67, + "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": 131.6, + "y": -66.5, + "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": 131, + "y": -66.5, + "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": 131, + "y": -66, + "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": 129, + "y": -66, + "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": 129, + "y": -64.9, "zoomX": 100, "zoomY": 100, "visible": true, @@ -717,595 +1135,7 @@ }, { "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": 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": 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": 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": 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": 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": 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": 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": 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": 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": 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, + "y": -64.3, "zoomX": 100, "zoomY": 100, "visible": true, @@ -1382,6 +1212,41 @@ "volume": 100, "pitch": 100, "eventType": "AnimTimedSoundEvent" + }, + { + "frameIndex": 0, + "resourceName": "PRAS- Muddy Water FG", + "bgX": -10, + "bgY": 365, + "opacity": 0, + "duration": 2, + "eventType": "AnimTimedAddBgEvent" + }, + { + "frameIndex": 0, + "resourceName": "", + "bgX": 400, + "bgY": 340, + "duration": 45, + "eventType": "AnimTimedUpdateBgEvent" + } + ], + "1": [ + { + "frameIndex": 1, + "resourceName": "", + "opacity": 200, + "duration": 6, + "eventType": "AnimTimedUpdateBgEvent" + } + ], + "30": [ + { + "frameIndex": 30, + "resourceName": "", + "opacity": 0, + "duration": 15, + "eventType": "AnimTimedUpdateBgEvent" } ] }, @@ -2510,230 +2375,6 @@ "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": 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": 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": 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": 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, @@ -2771,10 +2412,45 @@ "volume": 100, "pitch": 100, "eventType": "AnimTimedSoundEvent" + }, + { + "frameIndex": 0, + "resourceName": "PRAS- Muddy Water FG Opp", + "bgX": -50, + "bgY": 0, + "opacity": 0, + "duration": 2, + "eventType": "AnimTimedAddBgEvent" + }, + { + "frameIndex": 0, + "resourceName": "", + "bgX": -600, + "bgY": 200, + "duration": 45, + "eventType": "AnimTimedUpdateBgEvent" + } + ], + "1": [ + { + "frameIndex": 1, + "resourceName": "", + "opacity": 200, + "duration": 6, + "eventType": "AnimTimedUpdateBgEvent" + } + ], + "30": [ + { + "frameIndex": 30, + "resourceName": "", + "opacity": 0, + "duration": 15, + "eventType": "AnimTimedUpdateBgEvent" } ] }, "position": 4, "hue": 0 } -] \ No newline at end of file +] diff --git a/public/battle-anims/sludge-wave.json b/public/battle-anims/sludge-wave.json index 4fe008da80d..a51cfd51ac5 100644 --- a/public/battle-anims/sludge-wave.json +++ b/public/battle-anims/sludge-wave.json @@ -1149,202 +1149,6 @@ "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": 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": 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": 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": 0, @@ -1382,6 +1186,41 @@ "volume": 100, "pitch": 100, "eventType": "AnimTimedSoundEvent" + }, + { + "frameIndex": 0, + "resourceName": "PRAS- Sludge Wave FG", + "bgX": -10, + "bgY": 365, + "opacity": 0, + "duration": 2, + "eventType": "AnimTimedAddBgEvent" + }, + { + "frameIndex": 0, + "resourceName": "", + "bgX": 400, + "bgY": 340, + "duration": 45, + "eventType": "AnimTimedUpdateBgEvent" + } + ], + "1": [ + { + "frameIndex": 1, + "resourceName": "", + "opacity": 200, + "duration": 6, + "eventType": "AnimTimedUpdateBgEvent" + } + ], + "30": [ + { + "frameIndex": 30, + "resourceName": "", + "opacity": 0, + "duration": 15, + "eventType": "AnimTimedUpdateBgEvent" } ] }, @@ -2538,202 +2377,6 @@ "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": 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": 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": 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": 0, @@ -2771,10 +2414,45 @@ "volume": 100, "pitch": 100, "eventType": "AnimTimedSoundEvent" + }, + { + "frameIndex": 0, + "resourceName": "PRAS- Sludge Wave FG Opp", + "bgX": -50, + "bgY": 0, + "opacity": 0, + "duration": 2, + "eventType": "AnimTimedAddBgEvent" + }, + { + "frameIndex": 0, + "resourceName": "", + "bgX": -600, + "bgY": 200, + "duration": 45, + "eventType": "AnimTimedUpdateBgEvent" + } + ], + "1": [ + { + "frameIndex": 1, + "resourceName": "", + "opacity": 200, + "duration": 6, + "eventType": "AnimTimedUpdateBgEvent" + } + ], + "30": [ + { + "frameIndex": 30, + "resourceName": "", + "opacity": 0, + "duration": 15, + "eventType": "AnimTimedUpdateBgEvent" } ] }, "position": 4, "hue": 0 } -] \ No newline at end of file +] diff --git a/public/battle-anims/surf.json b/public/battle-anims/surf.json index e5a7fe45f46..99718798bb5 100644 --- a/public/battle-anims/surf.json +++ b/public/battle-anims/surf.json @@ -1186,6 +1186,41 @@ "volume": 100, "pitch": 100, "eventType": "AnimTimedSoundEvent" + }, + { + "frameIndex": 0, + "resourceName": "PRAS- Surf FG", + "bgX": -10, + "bgY": 365, + "opacity": 0, + "duration": 2, + "eventType": "AnimTimedAddBgEvent" + }, + { + "frameIndex": 0, + "resourceName": "", + "bgX": 400, + "bgY": 340, + "duration": 45, + "eventType": "AnimTimedUpdateBgEvent" + } + ], + "1": [ + { + "frameIndex": 1, + "resourceName": "", + "opacity": 200, + "duration": 6, + "eventType": "AnimTimedUpdateBgEvent" + } + ], + "30": [ + { + "frameIndex": 30, + "resourceName": "", + "opacity": 0, + "duration": 15, + "eventType": "AnimTimedUpdateBgEvent" } ] }, @@ -2379,10 +2414,45 @@ "volume": 100, "pitch": 100, "eventType": "AnimTimedSoundEvent" + }, + { + "frameIndex": 0, + "resourceName": "PRAS- Surf FG Opp - Copie", + "bgX": -50, + "bgY": 0, + "opacity": 0, + "duration": 2, + "eventType": "AnimTimedAddBgEvent" + }, + { + "frameIndex": 0, + "resourceName": "", + "bgX": -600, + "bgY": 200, + "duration": 45, + "eventType": "AnimTimedUpdateBgEvent" + } + ], + "1": [ + { + "frameIndex": 1, + "resourceName": "", + "opacity": 200, + "duration": 6, + "eventType": "AnimTimedUpdateBgEvent" + } + ], + "30": [ + { + "frameIndex": 30, + "resourceName": "", + "opacity": 0, + "duration": 15, + "eventType": "AnimTimedUpdateBgEvent" } ] }, "position": 4, "hue": 0 } -] \ No newline at end of file +] diff --git a/public/images/items.json b/public/images/items.json index a09aa42374f..821e44d87d7 100644 --- a/public/images/items.json +++ b/public/images/items.json @@ -4,8 +4,8 @@ "image": "items.png", "format": "RGBA8888", "size": { - "w": 416, - "h": 416 + "w": 426, + "h": 426 }, "scale": 1, "frames": [ @@ -72,6 +72,90 @@ "h": 28 } }, + { + "filename": "ribbon-gen4", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 30, + "h": 28 + }, + "frame": { + "x": 29, + "y": 27, + "w": 30, + "h": 28 + } + }, + { + "filename": "ribbon_gen4", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 30, + "h": 28 + }, + "frame": { + "x": 29, + "y": 27, + "w": 30, + "h": 28 + } + }, + { + "filename": "ribbon-gen2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 28, + "h": 28 + }, + "frame": { + "x": 0, + "y": 58, + "w": 28, + "h": 28 + } + }, + { + "filename": "ribbon_gen2", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 28, + "h": 28 + }, + "frame": { + "x": 0, + "y": 58, + "w": 28, + "h": 28 + } + }, { "filename": "bronze_ribbon", "rotated": false, @@ -87,8 +171,8 @@ "h": 31 }, "frame": { - "x": 29, - "y": 27, + "x": 0, + "y": 86, "w": 22, "h": 31 } @@ -109,7 +193,7 @@ }, "frame": { "x": 0, - "y": 58, + "y": 117, "w": 22, "h": 31 } @@ -151,7 +235,7 @@ }, "frame": { "x": 0, - "y": 89, + "y": 148, "w": 22, "h": 31 } @@ -171,8 +255,8 @@ "h": 31 }, "frame": { - "x": 22, - "y": 58, + "x": 0, + "y": 179, "w": 22, "h": 31 } @@ -193,11 +277,137 @@ }, "frame": { "x": 0, - "y": 120, + "y": 210, "w": 22, "h": 31 } }, + { + "filename": "ribbon-gen3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 22, + "h": 29 + }, + "frame": { + "x": 0, + "y": 241, + "w": 22, + "h": 29 + } + }, + { + "filename": "ribbon_gen3", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 22, + "h": 29 + }, + "frame": { + "x": 0, + "y": 241, + "w": 22, + "h": 29 + } + }, + { + "filename": "ribbon-gen7", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 22, + "h": 29 + }, + "frame": { + "x": 0, + "y": 270, + "w": 22, + "h": 29 + } + }, + { + "filename": "ribbon_gen7", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 22, + "h": 29 + }, + "frame": { + "x": 0, + "y": 270, + "w": 22, + "h": 29 + } + }, + { + "filename": "ribbon-gen9", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 22, + "h": 29 + }, + "frame": { + "x": 0, + "y": 299, + "w": 22, + "h": 29 + } + }, + { + "filename": "ribbon_gen9", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 22, + "h": 29 + }, + "frame": { + "x": 0, + "y": 299, + "w": 22, + "h": 29 + } + }, { "filename": "cornerstone_mask", "rotated": false, @@ -219,6 +429,153 @@ "h": 26 } }, + { + "filename": "ribbon-gen1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 22, + "h": 28 + }, + "frame": { + "x": 0, + "y": 328, + "w": 22, + "h": 28 + } + }, + { + "filename": "ribbon_gen1", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 22, + "h": 28 + }, + "frame": { + "x": 0, + "y": 328, + "w": 22, + "h": 28 + } + }, + { + "filename": "ribbon-gen5", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 22, + "h": 28 + }, + "frame": { + "x": 0, + "y": 356, + "w": 22, + "h": 28 + } + }, + { + "filename": "ribbon_gen5", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 22, + "h": 28 + }, + "frame": { + "x": 0, + "y": 356, + "w": 22, + "h": 28 + } + }, + { + "filename": "ribbon-gen6", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 22, + "h": 28 + }, + "frame": { + "x": 0, + "y": 384, + "w": 22, + "h": 28 + } + }, + { + "filename": "ribbon_gen6", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 22, + "h": 28 + }, + "frame": { + "x": 0, + "y": 384, + "w": 22, + "h": 28 + } + }, + { + "filename": "ability_capsule", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 9, + "w": 24, + "h": 14 + }, + "frame": { + "x": 0, + "y": 412, + "w": 24, + "h": 14 + } + }, { "filename": "ability_charm", "rotated": false, @@ -387,132 +744,6 @@ "h": 21 } }, - { - "filename": "exp_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 17, - "h": 31 - }, - "frame": { - "x": 22, - "y": 89, - "w": 17, - "h": 31 - } - }, - { - "filename": "golden_exp_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 17, - "h": 31 - }, - "frame": { - "x": 0, - "y": 151, - "w": 17, - "h": 31 - } - }, - { - "filename": "super_exp_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 17, - "h": 31 - }, - "frame": { - "x": 22, - "y": 120, - "w": 17, - "h": 31 - } - }, - { - "filename": "black_augurite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 3, - "w": 22, - "h": 25 - }, - "frame": { - "x": 17, - "y": 151, - "w": 22, - "h": 25 - } - }, - { - "filename": "prison_bottle", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 17, - "h": 30 - }, - "frame": { - "x": 0, - "y": 182, - "w": 17, - "h": 30 - } - }, - { - "filename": "big_root", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 17, - "y": 176, - "w": 23, - "h": 24 - } - }, { "filename": "chipped_pot", "rotated": false, @@ -576,6 +807,195 @@ "h": 20 } }, + { + "filename": "lock_capsule", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 19, + "h": 22 + }, + "frame": { + "x": 407, + "y": 0, + "w": 19, + "h": 22 + } + }, + { + "filename": "exp_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 1, + "w": 17, + "h": 31 + }, + "frame": { + "x": 22, + "y": 86, + "w": 17, + "h": 31 + } + }, + { + "filename": "golden_exp_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 1, + "w": 17, + "h": 31 + }, + "frame": { + "x": 22, + "y": 117, + "w": 17, + "h": 31 + } + }, + { + "filename": "super_exp_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 1, + "w": 17, + "h": 31 + }, + "frame": { + "x": 22, + "y": 148, + "w": 17, + "h": 31 + } + }, + { + "filename": "prison_bottle", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 1, + "w": 17, + "h": 30 + }, + "frame": { + "x": 22, + "y": 179, + "w": 17, + "h": 30 + } + }, + { + "filename": "ribbon-gen8", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 22, + "h": 28 + }, + "frame": { + "x": 22, + "y": 209, + "w": 22, + "h": 28 + } + }, + { + "filename": "ribbon_gen8", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 2, + "w": 22, + "h": 28 + }, + "frame": { + "x": 22, + "y": 209, + "w": 22, + "h": 28 + } + }, + { + "filename": "black_augurite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 3, + "w": 22, + "h": 25 + }, + "frame": { + "x": 22, + "y": 237, + "w": 22, + "h": 25 + } + }, + { + "filename": "big_root", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 22, + "y": 262, + "w": 23, + "h": 24 + } + }, { "filename": "blank_plate", "rotated": false, @@ -591,8 +1011,8 @@ "h": 24 }, "frame": { - "x": 0, - "y": 212, + "x": 22, + "y": 286, "w": 24, "h": 24 } @@ -612,8 +1032,8 @@ "h": 24 }, "frame": { - "x": 0, - "y": 236, + "x": 22, + "y": 310, "w": 24, "h": 24 } @@ -633,8 +1053,8 @@ "h": 24 }, "frame": { - "x": 0, - "y": 260, + "x": 22, + "y": 334, "w": 24, "h": 24 } @@ -654,8 +1074,8 @@ "h": 24 }, "frame": { - "x": 0, - "y": 284, + "x": 22, + "y": 358, "w": 24, "h": 24 } @@ -675,12 +1095,138 @@ "h": 24 }, "frame": { - "x": 0, - "y": 308, + "x": 22, + "y": 382, "w": 24, "h": 24 } }, + { + "filename": "icy_reins_of_unity", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 24, + "y": 406, + "w": 24, + "h": 20 + } + }, + { + "filename": "choice_specs", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 24, + "h": 18 + }, + "frame": { + "x": 135, + "y": 22, + "w": 24, + "h": 18 + } + }, + { + "filename": "clefairy_doll", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 29, + "y": 55, + "w": 24, + "h": 23 + } + }, + { + "filename": "calcium", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 39, + "y": 78, + "w": 16, + "h": 24 + } + }, + { + "filename": "carbos", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 39, + "y": 102, + "w": 16, + "h": 24 + } + }, + { + "filename": "catching_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 39, + "y": 126, + "w": 21, + "h": 24 + } + }, { "filename": "fist_plate", "rotated": false, @@ -696,8 +1242,8 @@ "h": 24 }, "frame": { - "x": 0, - "y": 332, + "x": 39, + "y": 150, "w": 24, "h": 24 } @@ -717,8 +1263,8 @@ "h": 24 }, "frame": { - "x": 0, - "y": 356, + "x": 39, + "y": 174, "w": 24, "h": 24 } @@ -738,33 +1284,12 @@ "h": 24 }, "frame": { - "x": 0, - "y": 380, + "x": 44, + "y": 198, "w": 24, "h": 24 } }, - { - "filename": "calcium", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 51, - "y": 27, - "w": 16, - "h": 24 - } - }, { "filename": "golden_punch", "rotated": false, @@ -779,157 +1304,10 @@ "w": 24, "h": 24 }, - "frame": { - "x": 67, - "y": 26, - "w": 24, - "h": 24 - } - }, - { - "filename": "gracidea", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 91, - "y": 26, - "w": 24, - "h": 24 - } - }, - { - "filename": "catching_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 115, - "y": 26, - "w": 21, - "h": 24 - } - }, - { - "filename": "grip_claw", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 136, - "y": 22, - "w": 24, - "h": 24 - } - }, - { - "filename": "carbos", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, "frame": { "x": 44, - "y": 58, - "w": 16, - "h": 24 - } - }, - { - "filename": "elixir", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 39, - "y": 89, - "w": 18, - "h": 24 - } - }, - { - "filename": "ether", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 39, - "y": 113, - "w": 18, - "h": 24 - } - }, - { - "filename": "full_restore", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 39, - "y": 137, - "w": 18, + "y": 222, + "w": 24, "h": 24 } }, @@ -948,12 +1326,54 @@ "h": 15 }, "frame": { - "x": 39, - "y": 161, + "x": 44, + "y": 246, "w": 24, "h": 15 } }, + { + "filename": "gracidea", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 45, + "y": 261, + "w": 24, + "h": 24 + } + }, + { + "filename": "grip_claw", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 46, + "y": 285, + "w": 24, + "h": 24 + } + }, { "filename": "icicle_plate", "rotated": false, @@ -969,8 +1389,8 @@ "h": 24 }, "frame": { - "x": 40, - "y": 176, + "x": 46, + "y": 309, "w": 24, "h": 24 } @@ -990,8 +1410,8 @@ "h": 24 }, "frame": { - "x": 24, - "y": 200, + "x": 46, + "y": 333, "w": 24, "h": 24 } @@ -1011,8 +1431,8 @@ "h": 24 }, "frame": { - "x": 24, - "y": 224, + "x": 46, + "y": 357, "w": 24, "h": 24 } @@ -1032,12 +1452,75 @@ "h": 24 }, "frame": { - "x": 24, - "y": 248, + "x": 46, + "y": 381, "w": 24, "h": 24 } }, + { + "filename": "adamant_crystal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 23, + "h": 21 + }, + "frame": { + "x": 48, + "y": 405, + "w": 23, + "h": 21 + } + }, + { + "filename": "berry_pouch", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 53, + "y": 55, + "w": 23, + "h": 23 + } + }, + { + "filename": "kings_rock", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 55, + "y": 78, + "w": 23, + "h": 24 + } + }, { "filename": "lucky_punch_great", "rotated": false, @@ -1053,8 +1536,8 @@ "h": 24 }, "frame": { - "x": 24, - "y": 272, + "x": 55, + "y": 102, "w": 24, "h": 24 } @@ -1074,8 +1557,8 @@ "h": 24 }, "frame": { - "x": 24, - "y": 296, + "x": 60, + "y": 126, "w": 24, "h": 24 } @@ -1095,8 +1578,8 @@ "h": 24 }, "frame": { - "x": 24, - "y": 320, + "x": 63, + "y": 150, "w": 24, "h": 24 } @@ -1116,12 +1599,33 @@ "h": 24 }, "frame": { - "x": 24, - "y": 344, + "x": 63, + "y": 174, "w": 24, "h": 24 } }, + { + "filename": "max_revive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 24 + }, + "frame": { + "x": 68, + "y": 198, + "w": 22, + "h": 24 + } + }, { "filename": "meadow_plate", "rotated": false, @@ -1137,12 +1641,201 @@ "h": 24 }, "frame": { - "x": 24, - "y": 368, + "x": 68, + "y": 222, "w": 24, "h": 24 } }, + { + "filename": "candy_overlay", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 12, + "w": 16, + "h": 15 + }, + "frame": { + "x": 68, + "y": 246, + "w": 16, + "h": 15 + } + }, + { + "filename": "elixir", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 69, + "y": 261, + "w": 18, + "h": 24 + } + }, + { + "filename": "ether", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 70, + "y": 285, + "w": 18, + "h": 24 + } + }, + { + "filename": "full_restore", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 70, + "y": 309, + "w": 18, + "h": 24 + } + }, + { + "filename": "max_elixir", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 70, + "y": 333, + "w": 18, + "h": 24 + } + }, + { + "filename": "max_ether", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 70, + "y": 357, + "w": 18, + "h": 24 + } + }, + { + "filename": "max_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 70, + "y": 381, + "w": 18, + "h": 24 + } + }, + { + "filename": "amulet_coin", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 23, + "h": 21 + }, + "frame": { + "x": 71, + "y": 405, + "w": 23, + "h": 21 + } + }, + { + "filename": "eviolite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 15, + "h": 15 + }, + "frame": { + "x": 59, + "y": 40, + "w": 15, + "h": 15 + } + }, { "filename": "mind_plate", "rotated": false, @@ -1158,75 +1851,12 @@ "h": 24 }, "frame": { - "x": 24, - "y": 392, + "x": 74, + "y": 26, "w": 24, "h": 24 } }, - { - "filename": "hp_up", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 48, - "y": 200, - "w": 16, - "h": 24 - } - }, - { - "filename": "iron", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 48, - "y": 224, - "w": 16, - "h": 24 - } - }, - { - "filename": "kings_rock", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 48, - "y": 248, - "w": 23, - "h": 24 - } - }, { "filename": "muscle_band", "rotated": false, @@ -1242,8 +1872,8 @@ "h": 24 }, "frame": { - "x": 48, - "y": 272, + "x": 98, + "y": 26, "w": 24, "h": 24 } @@ -1263,12 +1893,33 @@ "h": 24 }, "frame": { - "x": 48, - "y": 296, + "x": 76, + "y": 50, "w": 24, "h": 24 } }, + { + "filename": "reveal_glass", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 100, + "y": 50, + "w": 23, + "h": 24 + } + }, { "filename": "salac_berry", "rotated": false, @@ -1284,12 +1935,33 @@ "h": 24 }, "frame": { - "x": 48, - "y": 320, + "x": 78, + "y": 74, "w": 24, "h": 24 } }, + { + "filename": "oval_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 102, + "y": 74, + "w": 21, + "h": 24 + } + }, { "filename": "scanner", "rotated": false, @@ -1305,12 +1977,33 @@ "h": 24 }, "frame": { - "x": 48, - "y": 344, + "x": 79, + "y": 98, "w": 24, "h": 24 } }, + { + "filename": "red_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 20, + "h": 24 + }, + "frame": { + "x": 103, + "y": 98, + "w": 20, + "h": 24 + } + }, { "filename": "silk_scarf", "rotated": false, @@ -1326,12 +2019,33 @@ "h": 24 }, "frame": { - "x": 48, - "y": 368, + "x": 84, + "y": 122, "w": 24, "h": 24 } }, + { + "filename": "shiny_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 87, + "y": 146, + "w": 21, + "h": 24 + } + }, { "filename": "sky_plate", "rotated": false, @@ -1347,54 +2061,12 @@ "h": 24 }, "frame": { - "x": 48, - "y": 392, + "x": 87, + "y": 170, "w": 24, "h": 24 } }, - { - "filename": "ability_capsule", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 9, - "w": 24, - "h": 14 - }, - "frame": { - "x": 136, - "y": 46, - "w": 24, - "h": 14 - } - }, - { - "filename": "lure", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 160, - "y": 22, - "w": 17, - "h": 24 - } - }, { "filename": "splash_plate", "rotated": false, @@ -1410,8 +2082,8 @@ "h": 24 }, "frame": { - "x": 177, - "y": 21, + "x": 90, + "y": 194, "w": 24, "h": 24 } @@ -1431,12 +2103,180 @@ "h": 24 }, "frame": { - "x": 201, - "y": 21, + "x": 92, + "y": 218, "w": 24, "h": 24 } }, + { + "filename": "hp_up", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 108, + "y": 122, + "w": 16, + "h": 24 + } + }, + { + "filename": "iron", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 108, + "y": 146, + "w": 16, + "h": 24 + } + }, + { + "filename": "lure", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 17, + "h": 24 + }, + "frame": { + "x": 111, + "y": 170, + "w": 17, + "h": 24 + } + }, + { + "filename": "max_lure", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 17, + "h": 24 + }, + "frame": { + "x": 114, + "y": 194, + "w": 17, + "h": 24 + } + }, + { + "filename": "max_repel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 116, + "y": 218, + "w": 16, + "h": 24 + } + }, + { + "filename": "revive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 12, + "h": 17 + }, + "frame": { + "x": 122, + "y": 26, + "w": 12, + "h": 17 + } + }, + { + "filename": "coin_case", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 92, + "y": 242, + "w": 24, + "h": 23 + } + }, + { + "filename": "metal_powder", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 24, + "h": 20 + }, + "frame": { + "x": 87, + "y": 265, + "w": 24, + "h": 20 + } + }, { "filename": "stone_plate", "rotated": false, @@ -1452,8 +2292,8 @@ "h": 24 }, "frame": { - "x": 225, - "y": 21, + "x": 88, + "y": 285, "w": 24, "h": 24 } @@ -1473,8 +2313,8 @@ "h": 24 }, "frame": { - "x": 249, - "y": 21, + "x": 88, + "y": 309, "w": 24, "h": 24 } @@ -1494,8 +2334,8 @@ "h": 24 }, "frame": { - "x": 273, - "y": 21, + "x": 88, + "y": 333, "w": 24, "h": 24 } @@ -1515,159 +2355,12 @@ "h": 24 }, "frame": { - "x": 297, - "y": 21, + "x": 88, + "y": 357, "w": 24, "h": 24 } }, - { - "filename": "max_elixir", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 321, - "y": 21, - "w": 18, - "h": 24 - } - }, - { - "filename": "clefairy_doll", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 339, - "y": 20, - "w": 24, - "h": 23 - } - }, - { - "filename": "coin_case", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 363, - "y": 20, - "w": 24, - "h": 23 - } - }, - { - "filename": "berry_pouch", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 387, - "y": 20, - "w": 23, - "h": 23 - } - }, - { - "filename": "adamant_crystal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 160, - "y": 46, - "w": 23, - "h": 21 - } - }, - { - "filename": "exp_balance", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 22 - }, - "frame": { - "x": 183, - "y": 45, - "w": 24, - "h": 22 - } - }, - { - "filename": "exp_share", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 22 - }, - "frame": { - "x": 207, - "y": 45, - "w": 24, - "h": 22 - } - }, { "filename": "expert_belt", "rotated": false, @@ -1683,12 +2376,117 @@ "h": 23 }, "frame": { - "x": 231, - "y": 45, + "x": 88, + "y": 381, "w": 24, "h": 23 } }, + { + "filename": "exp_balance", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 22 + }, + "frame": { + "x": 94, + "y": 404, + "w": 24, + "h": 22 + } + }, + { + "filename": "black_belt", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 116, + "y": 242, + "w": 22, + "h": 23 + } + }, + { + "filename": "quick_powder", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 24, + "h": 20 + }, + "frame": { + "x": 111, + "y": 265, + "w": 24, + "h": 20 + } + }, + { + "filename": "dynamax_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 23, + "h": 23 + }, + "frame": { + "x": 112, + "y": 285, + "w": 23, + "h": 23 + } + }, + { + "filename": "griseous_core", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 112, + "y": 308, + "w": 23, + "h": 23 + } + }, { "filename": "hearthflame_mask", "rotated": false, @@ -1704,8 +2502,8 @@ "h": 23 }, "frame": { - "x": 255, - "y": 45, + "x": 112, + "y": 331, "w": 24, "h": 23 } @@ -1725,8 +2523,8 @@ "h": 23 }, "frame": { - "x": 279, - "y": 45, + "x": 112, + "y": 354, "w": 24, "h": 23 } @@ -1746,558 +2544,12 @@ "h": 23 }, "frame": { - "x": 303, - "y": 45, + "x": 112, + "y": 377, "w": 24, "h": 23 } }, - { - "filename": "black_belt", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 327, - "y": 45, - "w": 22, - "h": 23 - } - }, - { - "filename": "reveal_glass", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 349, - "y": 43, - "w": 23, - "h": 24 - } - }, - { - "filename": "twisted_spoon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 372, - "y": 43, - "w": 24, - "h": 23 - } - }, - { - "filename": "red_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 20, - "h": 24 - }, - "frame": { - "x": 396, - "y": 43, - "w": 20, - "h": 24 - } - }, - { - "filename": "choice_specs", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 24, - "h": 18 - }, - "frame": { - "x": 372, - "y": 66, - "w": 24, - "h": 18 - } - }, - { - "filename": "mystic_water", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 20, - "h": 23 - }, - "frame": { - "x": 396, - "y": 67, - "w": 20, - "h": 23 - } - }, - { - "filename": "amulet_coin", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 23, - "h": 21 - }, - "frame": { - "x": 349, - "y": 67, - "w": 23, - "h": 21 - } - }, - { - "filename": "dragon_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 24, - "h": 18 - }, - "frame": { - "x": 372, - "y": 84, - "w": 24, - "h": 18 - } - }, - { - "filename": "hard_meteorite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 20, - "h": 22 - }, - "frame": { - "x": 396, - "y": 90, - "w": 20, - "h": 22 - } - }, - { - "filename": "relic_gold", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 11, - "w": 15, - "h": 11 - }, - "frame": { - "x": 0, - "y": 404, - "w": 15, - "h": 11 - } - }, - { - "filename": "icy_reins_of_unity", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 67, - "y": 50, - "w": 24, - "h": 20 - } - }, - { - "filename": "metal_powder", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 24, - "h": 20 - }, - "frame": { - "x": 91, - "y": 50, - "w": 24, - "h": 20 - } - }, - { - "filename": "dragon_fang", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 115, - "y": 50, - "w": 21, - "h": 23 - } - }, - { - "filename": "peat_block", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 22 - }, - "frame": { - "x": 136, - "y": 60, - "w": 24, - "h": 22 - } - }, - { - "filename": "quick_powder", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 24, - "h": 20 - }, - "frame": { - "x": 160, - "y": 67, - "w": 24, - "h": 20 - } - }, - { - "filename": "rusted_shield", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 24, - "h": 20 - }, - "frame": { - "x": 184, - "y": 67, - "w": 24, - "h": 20 - } - }, - { - "filename": "auspicious_armor", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 21 - }, - "frame": { - "x": 208, - "y": 67, - "w": 23, - "h": 21 - } - }, - { - "filename": "sacred_ash", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 231, - "y": 68, - "w": 24, - "h": 20 - } - }, - { - "filename": "shadow_reins_of_unity", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 255, - "y": 68, - "w": 24, - "h": 20 - } - }, - { - "filename": "soft_sand", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 279, - "y": 68, - "w": 24, - "h": 20 - } - }, - { - "filename": "binding_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 23, - "h": 20 - }, - "frame": { - "x": 303, - "y": 68, - "w": 23, - "h": 20 - } - }, - { - "filename": "dynamax_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 23, - "h": 23 - }, - "frame": { - "x": 326, - "y": 68, - "w": 23, - "h": 23 - } - }, - { - "filename": "black_glasses", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 349, - "y": 88, - "w": 23, - "h": 17 - } - }, - { - "filename": "burn_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 60, - "y": 70, - "w": 23, - "h": 17 - } - }, - { - "filename": "griseous_core", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 57, - "y": 87, - "w": 23, - "h": 23 - } - }, - { - "filename": "max_revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 57, - "y": 110, - "w": 22, - "h": 24 - } - }, { "filename": "bug_tera_shard", "rotated": false, @@ -2313,344 +2565,8 @@ "h": 23 }, "frame": { - "x": 57, - "y": 134, - "w": 22, - "h": 23 - } - }, - { - "filename": "chill_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 83, - "y": 70, - "w": 23, - "h": 17 - } - }, - { - "filename": "rare_candy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 80, - "y": 87, - "w": 23, - "h": 23 - } - }, - { - "filename": "rarer_candy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 79, - "y": 110, - "w": 23, - "h": 23 - } - }, - { - "filename": "stick", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 79, - "y": 133, - "w": 23, - "h": 23 - } - }, - { - "filename": "big_mushroom", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 19 - }, - "frame": { - "x": 63, - "y": 157, - "w": 19, - "h": 19 - } - }, - { - "filename": "max_ether", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 64, - "y": 176, - "w": 18, - "h": 24 - } - }, - { - "filename": "oval_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 82, - "y": 156, - "w": 21, - "h": 24 - } - }, - { - "filename": "max_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 64, - "y": 200, - "w": 18, - "h": 24 - } - }, - { - "filename": "shiny_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 64, - "y": 224, - "w": 21, - "h": 24 - } - }, - { - "filename": "dark_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 82, - "y": 180, - "w": 22, - "h": 23 - } - }, - { - "filename": "berry_juice", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 24, - "h": 23 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 22, - "h": 21 - }, - "frame": { - "x": 82, - "y": 203, - "w": 22, - "h": 21 - } - }, - { - "filename": "dragon_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 85, - "y": 224, - "w": 22, - "h": 23 - } - }, - { - "filename": "max_lure", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 71, - "y": 248, - "w": 17, - "h": 24 - } - }, - { - "filename": "electric_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 88, - "y": 247, - "w": 22, - "h": 23 - } - }, - { - "filename": "max_repel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 72, - "y": 272, - "w": 16, - "h": 24 - } - }, - { - "filename": "fairy_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 88, - "y": 270, + "x": 118, + "y": 400, "w": 22, "h": 23 } @@ -2670,14 +2586,14 @@ "h": 24 }, "frame": { - "x": 72, - "y": 296, + "x": 123, + "y": 43, "w": 16, "h": 24 } }, { - "filename": "fighting_tera_shard", + "filename": "dark_tera_shard", "rotated": false, "trimmed": true, "sourceSize": { @@ -2691,8 +2607,8 @@ "h": 23 }, "frame": { - "x": 88, - "y": 293, + "x": 139, + "y": 40, "w": 22, "h": 23 } @@ -2712,14 +2628,14 @@ "h": 24 }, "frame": { - "x": 72, - "y": 320, + "x": 123, + "y": 67, "w": 16, "h": 24 } }, { - "filename": "fire_stone", + "filename": "dragon_tera_shard", "rotated": false, "trimmed": true, "sourceSize": { @@ -2727,14 +2643,14 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 5, + "x": 6, + "y": 4, "w": 22, "h": 23 }, "frame": { - "x": 88, - "y": 316, + "x": 139, + "y": 63, "w": 22, "h": 23 } @@ -2754,14 +2670,14 @@ "h": 24 }, "frame": { - "x": 72, - "y": 344, + "x": 123, + "y": 91, "w": 16, "h": 24 } }, { - "filename": "fire_tera_shard", + "filename": "electric_tera_shard", "rotated": false, "trimmed": true, "sourceSize": { @@ -2775,8 +2691,8 @@ "h": 23 }, "frame": { - "x": 88, - "y": 339, + "x": 139, + "y": 86, "w": 22, "h": 23 } @@ -2796,8 +2712,8 @@ "h": 24 }, "frame": { - "x": 72, - "y": 368, + "x": 124, + "y": 115, "w": 16, "h": 24 } @@ -2817,12 +2733,201 @@ "h": 24 }, "frame": { - "x": 72, - "y": 392, + "x": 124, + "y": 139, "w": 17, "h": 24 } }, + { + "filename": "dragon_fang", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 140, + "y": 109, + "w": 21, + "h": 23 + } + }, + { + "filename": "fairy_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 141, + "y": 132, + "w": 22, + "h": 23 + } + }, + { + "filename": "auspicious_armor", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 21 + }, + "frame": { + "x": 141, + "y": 155, + "w": 23, + "h": 21 + } + }, + { + "filename": "dragon_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 24, + "h": 18 + }, + "frame": { + "x": 128, + "y": 176, + "w": 24, + "h": 18 + } + }, + { + "filename": "fighting_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 131, + "y": 194, + "w": 22, + "h": 23 + } + }, + { + "filename": "fire_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 132, + "y": 217, + "w": 22, + "h": 23 + } + }, + { + "filename": "super_repel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 138, + "y": 240, + "w": 16, + "h": 24 + } + }, + { + "filename": "baton", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 152, + "y": 176, + "w": 18, + "h": 18 + } + }, + { + "filename": "fire_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 153, + "y": 194, + "w": 22, + "h": 23 + } + }, { "filename": "flying_tera_shard", "rotated": false, @@ -2838,8 +2943,8 @@ "h": 23 }, "frame": { - "x": 88, - "y": 362, + "x": 154, + "y": 217, "w": 22, "h": 23 } @@ -2859,14 +2964,14 @@ "h": 23 }, "frame": { - "x": 89, - "y": 385, + "x": 154, + "y": 240, "w": 22, "h": 23 } }, { - "filename": "coupon", + "filename": "unknown", "rotated": false, "trimmed": true, "sourceSize": { @@ -2874,20 +2979,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 + "x": 8, + "y": 4, + "w": 16, + "h": 24 }, "frame": { - "x": 106, - "y": 73, - "w": 23, - "h": 19 + "x": 135, + "y": 265, + "w": 16, + "h": 24 } }, { - "filename": "golden_mystic_ticket", + "filename": "zinc", "rotated": false, "trimmed": true, "sourceSize": { @@ -2895,16 +3000,37 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 + "x": 8, + "y": 4, + "w": 16, + "h": 24 }, "frame": { - "x": 103, - "y": 92, - "w": 23, - "h": 19 + "x": 135, + "y": 289, + "w": 16, + "h": 24 + } + }, + { + "filename": "candy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 11, + "w": 18, + "h": 18 + }, + "frame": { + "x": 135, + "y": 313, + "w": 18, + "h": 18 } }, { @@ -2922,33 +3048,12 @@ "h": 23 }, "frame": { - "x": 102, - "y": 111, + "x": 136, + "y": 331, "w": 22, "h": 23 } }, - { - "filename": "blank_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 102, - "y": 134, - "w": 22, - "h": 22 - } - }, { "filename": "grass_tera_shard", "rotated": false, @@ -2964,8 +3069,8 @@ "h": 23 }, "frame": { - "x": 103, - "y": 156, + "x": 136, + "y": 354, "w": 22, "h": 23 } @@ -2985,33 +3090,12 @@ "h": 23 }, "frame": { - "x": 104, - "y": 179, + "x": 136, + "y": 377, "w": 22, "h": 23 } }, - { - "filename": "bug_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 104, - "y": 202, - "w": 22, - "h": 22 - } - }, { "filename": "ice_tera_shard", "rotated": false, @@ -3027,12 +3111,180 @@ "h": 23 }, "frame": { - "x": 107, - "y": 224, + "x": 140, + "y": 400, "w": 22, "h": 23 } }, + { + "filename": "exp_share", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 22 + }, + "frame": { + "x": 330, + "y": 20, + "w": 24, + "h": 22 + } + }, + { + "filename": "peat_block", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 22 + }, + "frame": { + "x": 354, + "y": 20, + "w": 24, + "h": 22 + } + }, + { + "filename": "twisted_spoon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 378, + "y": 20, + "w": 24, + "h": 23 + } + }, + { + "filename": "rusted_shield", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 24, + "h": 20 + }, + "frame": { + "x": 402, + "y": 22, + "w": 24, + "h": 20 + } + }, + { + "filename": "sacred_ash", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 402, + "y": 42, + "w": 24, + "h": 20 + } + }, + { + "filename": "full_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 15, + "h": 23 + }, + "frame": { + "x": 151, + "y": 264, + "w": 15, + "h": 23 + } + }, + { + "filename": "hyper_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 151, + "y": 287, + "w": 17, + "h": 23 + } + }, + { + "filename": "berry_juice", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 24, + "h": 23 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 22, + "h": 21 + }, + "frame": { + "x": 153, + "y": 310, + "w": 22, + "h": 21 + } + }, { "filename": "lansat_berry", "rotated": false, @@ -3048,8 +3300,8 @@ "h": 23 }, "frame": { - "x": 110, - "y": 247, + "x": 158, + "y": 331, "w": 21, "h": 23 } @@ -3069,12 +3321,54 @@ "h": 23 }, "frame": { - "x": 110, - "y": 270, + "x": 158, + "y": 354, "w": 21, "h": 23 } }, + { + "filename": "leek", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 158, + "y": 377, + "w": 23, + "h": 23 + } + }, + { + "filename": "mystic_water", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 20, + "h": 23 + }, + "frame": { + "x": 162, + "y": 400, + "w": 20, + "h": 23 + } + }, { "filename": "never_melt_ice", "rotated": false, @@ -3090,8 +3384,8 @@ "h": 23 }, "frame": { - "x": 110, - "y": 293, + "x": 166, + "y": 263, "w": 22, "h": 23 } @@ -3111,12 +3405,33 @@ "h": 23 }, "frame": { - "x": 110, - "y": 316, + "x": 168, + "y": 286, "w": 22, "h": 23 } }, + { + "filename": "berry_pot", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 18, + "h": 22 + }, + "frame": { + "x": 175, + "y": 309, + "w": 18, + "h": 22 + } + }, { "filename": "petaya_berry", "rotated": false, @@ -3132,8 +3447,8 @@ "h": 23 }, "frame": { - "x": 110, - "y": 339, + "x": 179, + "y": 331, "w": 22, "h": 23 } @@ -3153,8 +3468,8 @@ "h": 23 }, "frame": { - "x": 110, - "y": 362, + "x": 179, + "y": 354, "w": 22, "h": 23 } @@ -3174,14 +3489,14 @@ "h": 23 }, "frame": { - "x": 111, - "y": 385, + "x": 181, + "y": 377, "w": 22, "h": 23 } }, { - "filename": "douse_drive", + "filename": "rare_candy", "rotated": false, "trimmed": true, "sourceSize": { @@ -3190,19 +3505,19 @@ }, "spriteSourceSize": { "x": 4, - "y": 8, + "y": 5, "w": 23, - "h": 17 + "h": 23 }, "frame": { - "x": 372, - "y": 102, + "x": 182, + "y": 400, "w": 23, - "h": 17 + "h": 23 } }, { - "filename": "sharp_beak", + "filename": "shadow_reins_of_unity", "rotated": false, "trimmed": true, "sourceSize": { @@ -3210,15 +3525,36 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 162, + "y": 21, + "w": 24, + "h": 20 + } + }, + { + "filename": "rarer_candy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, "y": 5, - "w": 21, + "w": 23, "h": 23 }, "frame": { - "x": 395, - "y": 112, - "w": 21, + "x": 161, + "y": 41, + "w": 23, "h": 23 } }, @@ -3237,285 +3573,12 @@ "h": 22 }, "frame": { - "x": 129, - "y": 82, + "x": 161, + "y": 64, "w": 23, "h": 22 } }, - { - "filename": "moon_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 152, - "y": 87, - "w": 23, - "h": 21 - } - }, - { - "filename": "n_lunarizer", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 175, - "y": 87, - "w": 23, - "h": 21 - } - }, - { - "filename": "n_solarizer", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 198, - "y": 88, - "w": 23, - "h": 21 - } - }, - { - "filename": "rusted_sword", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 22 - }, - "frame": { - "x": 221, - "y": 88, - "w": 23, - "h": 22 - } - }, - { - "filename": "charcoal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 244, - "y": 88, - "w": 22, - "h": 22 - } - }, - { - "filename": "dark_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 266, - "y": 88, - "w": 22, - "h": 22 - } - }, - { - "filename": "dire_hit", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 288, - "y": 88, - "w": 22, - "h": 22 - } - }, - { - "filename": "super_repel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 310, - "y": 88, - "w": 16, - "h": 24 - } - }, - { - "filename": "wellspring_mask", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 21 - }, - "frame": { - "x": 326, - "y": 91, - "w": 23, - "h": 21 - } - }, - { - "filename": "mystic_ticket", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 349, - "y": 105, - "w": 23, - "h": 19 - } - }, - { - "filename": "pair_of_tickets", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 372, - "y": 119, - "w": 23, - "h": 19 - } - }, - { - "filename": "whipped_dream", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 21, - "h": 23 - }, - "frame": { - "x": 395, - "y": 135, - "w": 21, - "h": 23 - } - }, - { - "filename": "relic_crown", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 18 - }, - "frame": { - "x": 126, - "y": 104, - "w": 23, - "h": 18 - } - }, { "filename": "reaper_cloth", "rotated": false, @@ -3531,390 +3594,12 @@ "h": 23 }, "frame": { - "x": 124, - "y": 122, + "x": 161, + "y": 86, "w": 22, "h": 23 } }, - { - "filename": "reviver_seed", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 8, - "w": 23, - "h": 20 - }, - "frame": { - "x": 149, - "y": 108, - "w": 23, - "h": 20 - } - }, - { - "filename": "shell_bell", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 23, - "h": 20 - }, - "frame": { - "x": 172, - "y": 108, - "w": 23, - "h": 20 - } - }, - { - "filename": "blunder_policy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 19 - }, - "frame": { - "x": 195, - "y": 109, - "w": 22, - "h": 19 - } - }, - { - "filename": "shock_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 146, - "y": 128, - "w": 23, - "h": 17 - } - }, - { - "filename": "wise_glasses", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 169, - "y": 128, - "w": 23, - "h": 17 - } - }, - { - "filename": "deep_sea_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 192, - "y": 128, - "w": 22, - "h": 20 - } - }, - { - "filename": "deep_sea_tooth", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 217, - "y": 110, - "w": 22, - "h": 21 - } - }, - { - "filename": "dna_splicers", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 239, - "y": 110, - "w": 22, - "h": 22 - } - }, - { - "filename": "dragon_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 261, - "y": 110, - "w": 22, - "h": 22 - } - }, - { - "filename": "electirizer", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 283, - "y": 110, - "w": 22, - "h": 22 - } - }, - { - "filename": "electric_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 305, - "y": 112, - "w": 22, - "h": 22 - } - }, - { - "filename": "enigma_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 327, - "y": 112, - "w": 22, - "h": 22 - } - }, - { - "filename": "dubious_disc", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 19 - }, - "frame": { - "x": 214, - "y": 131, - "w": 22, - "h": 19 - } - }, - { - "filename": "fairy_feather", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 20 - }, - "frame": { - "x": 236, - "y": 132, - "w": 22, - "h": 20 - } - }, - { - "filename": "fairy_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 258, - "y": 132, - "w": 22, - "h": 22 - } - }, - { - "filename": "fighting_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 280, - "y": 132, - "w": 22, - "h": 22 - } - }, - { - "filename": "fire_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 302, - "y": 134, - "w": 22, - "h": 22 - } - }, - { - "filename": "flying_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 324, - "y": 134, - "w": 22, - "h": 22 - } - }, { "filename": "rock_tera_shard", "rotated": false, @@ -3930,12 +3615,96 @@ "h": 23 }, "frame": { - "x": 125, - "y": 145, + "x": 161, + "y": 109, "w": 22, "h": 23 } }, + { + "filename": "sharp_beak", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 163, + "y": 132, + "w": 21, + "h": 23 + } + }, + { + "filename": "dawn_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 21 + }, + "frame": { + "x": 164, + "y": 155, + "w": 20, + "h": 21 + } + }, + { + "filename": "soft_sand", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 186, + "y": 21, + "w": 24, + "h": 20 + } + }, + { + "filename": "rusted_sword", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 22 + }, + "frame": { + "x": 184, + "y": 41, + "w": 23, + "h": 22 + } + }, { "filename": "steel_tera_shard", "rotated": false, @@ -3951,8 +3720,8 @@ "h": 23 }, "frame": { - "x": 147, - "y": 145, + "x": 184, + "y": 63, "w": 22, "h": 23 } @@ -3972,159 +3741,12 @@ "h": 23 }, "frame": { - "x": 169, - "y": 145, + "x": 183, + "y": 86, "w": 22, "h": 23 } }, - { - "filename": "ganlon_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 191, - "y": 148, - "w": 22, - "h": 22 - } - }, - { - "filename": "ghost_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 213, - "y": 150, - "w": 22, - "h": 22 - } - }, - { - "filename": "grass_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 235, - "y": 152, - "w": 22, - "h": 22 - } - }, - { - "filename": "ground_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 257, - "y": 154, - "w": 22, - "h": 22 - } - }, - { - "filename": "guard_spec", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 279, - "y": 154, - "w": 22, - "h": 22 - } - }, - { - "filename": "ice_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 301, - "y": 156, - "w": 22, - "h": 22 - } - }, - { - "filename": "ice_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 323, - "y": 156, - "w": 22, - "h": 22 - } - }, { "filename": "water_tera_shard", "rotated": false, @@ -4140,12 +3762,75 @@ "h": 23 }, "frame": { - "x": 126, - "y": 168, + "x": 183, + "y": 109, "w": 22, "h": 23 } }, + { + "filename": "whipped_dream", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 21, + "h": 23 + }, + "frame": { + "x": 184, + "y": 132, + "w": 21, + "h": 23 + } + }, + { + "filename": "binding_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 23, + "h": 20 + }, + "frame": { + "x": 210, + "y": 21, + "w": 23, + "h": 20 + } + }, + { + "filename": "blank_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 207, + "y": 41, + "w": 22, + "h": 22 + } + }, { "filename": "wide_lens", "rotated": false, @@ -4161,14 +3846,14 @@ "h": 23 }, "frame": { - "x": 148, - "y": 168, + "x": 206, + "y": 63, "w": 22, "h": 23 } }, { - "filename": "dusk_stone", + "filename": "bug_memory", "rotated": false, "trimmed": true, "sourceSize": { @@ -4176,20 +3861,83 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 205, + "y": 86, + "w": 22, + "h": 22 + } + }, + { + "filename": "charcoal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 205, + "y": 108, + "w": 22, + "h": 22 + } + }, + { + "filename": "dark_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 205, + "y": 130, + "w": 22, + "h": 22 + } + }, + { + "filename": "moon_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, "y": 6, - "w": 21, + "w": 23, "h": 21 }, "frame": { - "x": 170, - "y": 168, - "w": 21, + "x": 233, + "y": 21, + "w": 23, "h": 21 } }, { - "filename": "magmarizer", + "filename": "n_lunarizer", "rotated": false, "trimmed": true, "sourceSize": { @@ -4197,62 +3945,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 126, - "y": 191, - "w": 22, - "h": 22 - } - }, - { - "filename": "mini_black_hole", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 148, - "y": 191, - "w": 22, - "h": 22 - } - }, - { - "filename": "liechi_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, + "x": 4, "y": 6, - "w": 22, + "w": 23, "h": 21 }, "frame": { - "x": 191, - "y": 170, - "w": 22, + "x": 256, + "y": 21, + "w": 23, "h": 21 } }, { - "filename": "poison_barb", + "filename": "n_solarizer", "rotated": false, "trimmed": true, "sourceSize": { @@ -4260,146 +3966,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, + "x": 4, "y": 6, - "w": 21, + "w": 23, "h": 21 }, - "frame": { - "x": 170, - "y": 189, - "w": 21, - "h": 21 - } - }, - { - "filename": "malicious_armor", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 213, - "y": 172, - "w": 22, - "h": 20 - } - }, - { - "filename": "poison_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 235, - "y": 174, - "w": 22, - "h": 22 - } - }, - { - "filename": "protector", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 191, - "y": 191, - "w": 22, - "h": 22 - } - }, - { - "filename": "psychic_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 213, - "y": 192, - "w": 22, - "h": 22 - } - }, - { - "filename": "rock_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 257, - "y": 176, - "w": 22, - "h": 22 - } - }, - { - "filename": "scroll_of_darkness", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, "frame": { "x": 279, - "y": 176, - "w": 22, - "h": 22 + "y": 21, + "w": 23, + "h": 21 } }, { - "filename": "scroll_of_waters", + "filename": "wellspring_mask", "rotated": false, "trimmed": true, "sourceSize": { @@ -4407,104 +3987,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, + "x": 4, "y": 5, - "w": 22, - "h": 22 + "w": 23, + "h": 21 }, "frame": { - "x": 235, - "y": 196, - "w": 22, - "h": 22 + "x": 302, + "y": 21, + "w": 23, + "h": 21 } }, { - "filename": "shed_shell", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 301, - "y": 178, - "w": 22, - "h": 22 - } - }, - { - "filename": "starf_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 323, - "y": 178, - "w": 22, - "h": 22 - } - }, - { - "filename": "steel_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 257, - "y": 198, - "w": 22, - "h": 22 - } - }, - { - "filename": "thick_club", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 279, - "y": 198, - "w": 22, - "h": 22 - } - }, - { - "filename": "sweet_apple", + "filename": "deep_sea_tooth", "rotated": false, "trimmed": true, "sourceSize": { @@ -4518,14 +4014,14 @@ "h": 21 }, "frame": { - "x": 301, - "y": 200, + "x": 184, + "y": 155, "w": 22, "h": 21 } }, { - "filename": "syrupy_apple", + "filename": "relic_crown", "rotated": false, "trimmed": true, "sourceSize": { @@ -4533,879 +4029,18 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 323, - "y": 200, - "w": 22, - "h": 21 - } - }, - { - "filename": "thunder_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 129, - "y": 213, - "w": 22, - "h": 22 - } - }, - { - "filename": "lock_capsule", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 19, - "h": 22 - }, - "frame": { - "x": 151, - "y": 213, - "w": 19, - "h": 22 - } - }, - { - "filename": "shiny_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 170, - "y": 210, - "w": 21, - "h": 21 - } - }, - { - "filename": "tart_apple", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 191, - "y": 213, - "w": 22, - "h": 21 - } - }, - { - "filename": "tera_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 213, - "y": 214, - "w": 22, - "h": 20 - } - }, - { - "filename": "tm_bug", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 235, - "y": 218, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_dark", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 257, - "y": 220, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_dragon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 279, - "y": 220, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_electric", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 301, - "y": 221, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_fairy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 323, - "y": 221, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_fighting", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 349, - "y": 124, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_fire", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 131, - "y": 235, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_flying", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 131, - "y": 257, - "w": 22, - "h": 22 - } - }, - { - "filename": "hyper_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 153, - "y": 235, - "w": 17, - "h": 23 - } - }, - { - "filename": "zoom_lens", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 170, - "y": 231, - "w": 21, - "h": 21 - } - }, - { - "filename": "tm_ghost", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 191, - "y": 234, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_grass", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 213, - "y": 234, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_ground", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 235, - "y": 240, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_ice", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 257, - "y": 242, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_normal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 279, - "y": 242, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_poison", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 301, - "y": 243, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_psychic", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 323, - "y": 243, - "w": 22, - "h": 22 - } - }, - { - "filename": "berry_pot", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 18, - "h": 22 - }, - "frame": { - "x": 153, - "y": 258, - "w": 18, - "h": 22 - } - }, - { - "filename": "sitrus_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 20, - "h": 22 - }, - "frame": { - "x": 171, - "y": 252, - "w": 20, - "h": 22 - } - }, - { - "filename": "tm_rock", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 191, - "y": 256, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_steel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 213, - "y": 256, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_water", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 235, - "y": 262, - "w": 22, - "h": 22 - } - }, - { - "filename": "water_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 257, - "y": 264, - "w": 22, - "h": 22 - } - }, - { - "filename": "water_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 279, - "y": 264, - "w": 22, - "h": 22 - } - }, - { - "filename": "x_accuracy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 301, - "y": 265, - "w": 22, - "h": 22 - } - }, - { - "filename": "x_attack", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 323, - "y": 265, - "w": 22, - "h": 22 - } - }, - { - "filename": "big_nugget", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 171, - "y": 274, - "w": 20, - "h": 20 - } - }, - { - "filename": "upgrade", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, + "x": 4, "y": 7, - "w": 22, - "h": 19 - }, - "frame": { - "x": 191, - "y": 278, - "w": 22, - "h": 19 - } - }, - { - "filename": "x_defense", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 213, - "y": 278, - "w": 22, - "h": 22 - } - }, - { - "filename": "x_sp_atk", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 235, - "y": 284, - "w": 22, - "h": 22 - } - }, - { - "filename": "x_sp_def", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 257, - "y": 286, - "w": 22, - "h": 22 - } - }, - { - "filename": "x_speed", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 279, - "y": 286, - "w": 22, - "h": 22 - } - }, - { - "filename": "dawn_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 21 - }, - "frame": { - "x": 301, - "y": 287, - "w": 20, - "h": 21 - } - }, - { - "filename": "blue_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 321, - "y": 287, - "w": 20, - "h": 20 - } - }, - { - "filename": "masterpiece_teacup", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 21, + "w": 23, "h": 18 }, "frame": { - "x": 346, - "y": 146, - "w": 21, + "x": 170, + "y": 176, + "w": 23, "h": 18 } }, - { - "filename": "metal_coat", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 19, - "h": 22 - }, - "frame": { - "x": 345, - "y": 164, - "w": 19, - "h": 22 - } - }, { "filename": "sachet", "rotated": false, @@ -5421,12 +4056,33 @@ "h": 23 }, "frame": { - "x": 345, - "y": 186, + "x": 175, + "y": 194, "w": 18, "h": 23 } }, + { + "filename": "dire_hit", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 206, + "y": 152, + "w": 22, + "h": 22 + } + }, { "filename": "potion", "rotated": false, @@ -5442,8 +4098,8 @@ "h": 23 }, "frame": { - "x": 345, - "y": 209, + "x": 176, + "y": 217, "w": 17, "h": 23 } @@ -5463,14 +4119,14 @@ "h": 23 }, "frame": { - "x": 345, - "y": 232, + "x": 176, + "y": 240, "w": 17, "h": 23 } }, { - "filename": "unknown", + "filename": "dna_splicers", "rotated": false, "trimmed": true, "sourceSize": { @@ -5478,20 +4134,1091 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 + "x": 5, + "y": 5, + "w": 22, + "h": 22 }, "frame": { - "x": 345, - "y": 255, - "w": 16, - "h": 24 + "x": 229, + "y": 42, + "w": 22, + "h": 22 } }, { - "filename": "metal_alloy", + "filename": "dragon_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 251, + "y": 42, + "w": 22, + "h": 22 + } + }, + { + "filename": "electirizer", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 273, + "y": 42, + "w": 22, + "h": 22 + } + }, + { + "filename": "electric_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 295, + "y": 42, + "w": 22, + "h": 22 + } + }, + { + "filename": "enigma_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 228, + "y": 64, + "w": 22, + "h": 22 + } + }, + { + "filename": "fairy_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 227, + "y": 86, + "w": 22, + "h": 22 + } + }, + { + "filename": "fighting_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 250, + "y": 64, + "w": 22, + "h": 22 + } + }, + { + "filename": "fire_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 227, + "y": 108, + "w": 22, + "h": 22 + } + }, + { + "filename": "flying_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 227, + "y": 130, + "w": 22, + "h": 22 + } + }, + { + "filename": "ganlon_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 249, + "y": 86, + "w": 22, + "h": 22 + } + }, + { + "filename": "ghost_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 272, + "y": 64, + "w": 22, + "h": 22 + } + }, + { + "filename": "grass_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 249, + "y": 108, + "w": 22, + "h": 22 + } + }, + { + "filename": "ground_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 271, + "y": 86, + "w": 22, + "h": 22 + } + }, + { + "filename": "guard_spec", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 294, + "y": 64, + "w": 22, + "h": 22 + } + }, + { + "filename": "ice_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 249, + "y": 130, + "w": 22, + "h": 22 + } + }, + { + "filename": "ice_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 228, + "y": 152, + "w": 22, + "h": 22 + } + }, + { + "filename": "magmarizer", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 271, + "y": 108, + "w": 22, + "h": 22 + } + }, + { + "filename": "mini_black_hole", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 293, + "y": 86, + "w": 22, + "h": 22 + } + }, + { + "filename": "poison_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 271, + "y": 130, + "w": 22, + "h": 22 + } + }, + { + "filename": "protector", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 250, + "y": 152, + "w": 22, + "h": 22 + } + }, + { + "filename": "psychic_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 293, + "y": 108, + "w": 22, + "h": 22 + } + }, + { + "filename": "rock_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 293, + "y": 130, + "w": 22, + "h": 22 + } + }, + { + "filename": "scroll_of_darkness", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 272, + "y": 152, + "w": 22, + "h": 22 + } + }, + { + "filename": "scroll_of_waters", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 294, + "y": 152, + "w": 22, + "h": 22 + } + }, + { + "filename": "shed_shell", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 317, + "y": 42, + "w": 22, + "h": 22 + } + }, + { + "filename": "starf_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 316, + "y": 64, + "w": 22, + "h": 22 + } + }, + { + "filename": "steel_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 315, + "y": 86, + "w": 22, + "h": 22 + } + }, + { + "filename": "thick_club", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 339, + "y": 42, + "w": 22, + "h": 22 + } + }, + { + "filename": "thunder_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 338, + "y": 64, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_bug", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 315, + "y": 108, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_dark", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 315, + "y": 130, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_dragon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 337, + "y": 86, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_electric", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 337, + "y": 108, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_fairy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 337, + "y": 130, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_fighting", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 316, + "y": 152, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_fire", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 338, + "y": 152, + "w": 22, + "h": 22 + } + }, + { + "filename": "metronome", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 361, + "y": 42, + "w": 17, + "h": 22 + } + }, + { + "filename": "liechi_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 378, + "y": 43, + "w": 22, + "h": 21 + } + }, + { + "filename": "tm_flying", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 360, + "y": 64, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_ghost", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 359, + "y": 86, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_grass", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 359, + "y": 108, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_ground", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 359, + "y": 130, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_ice", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 360, + "y": 152, + "w": 22, + "h": 22 + } + }, + { + "filename": "hard_meteorite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 20, + "h": 22 + }, + "frame": { + "x": 382, + "y": 64, + "w": 20, + "h": 22 + } + }, + { + "filename": "tm_normal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 381, + "y": 86, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_poison", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 381, + "y": 108, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_psychic", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 381, + "y": 130, + "w": 22, + "h": 22 + } + }, + { + "filename": "reviver_seed", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 8, + "w": 23, + "h": 20 + }, + "frame": { + "x": 403, + "y": 62, + "w": 23, + "h": 20 + } + }, + { + "filename": "shell_bell", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 23, + "h": 20 + }, + "frame": { + "x": 403, + "y": 82, + "w": 23, + "h": 20 + } + }, + { + "filename": "coupon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 403, + "y": 102, + "w": 23, + "h": 19 + } + }, + { + "filename": "golden_mystic_ticket", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 403, + "y": 121, + "w": 23, + "h": 19 + } + }, + { + "filename": "mystic_ticket", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 403, + "y": 140, + "w": 23, + "h": 19 + } + }, + { + "filename": "dusk_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -5500,19 +5227,754 @@ }, "spriteSourceSize": { "x": 6, - "y": 7, + "y": 6, "w": 21, + "h": 21 + }, + "frame": { + "x": 382, + "y": 152, + "w": 21, + "h": 21 + } + }, + { + "filename": "pair_of_tickets", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, "h": 19 }, "frame": { - "x": 371, - "y": 138, - "w": 21, + "x": 403, + "y": 159, + "w": 23, "h": 19 } }, { - "filename": "gb", + "filename": "leftovers", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 15, + "h": 22 + }, + "frame": { + "x": 193, + "y": 176, + "w": 15, + "h": 22 + } + }, + { + "filename": "tm_rock", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 208, + "y": 174, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_steel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 230, + "y": 174, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_water", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 252, + "y": 174, + "w": 22, + "h": 22 + } + }, + { + "filename": "water_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 274, + "y": 174, + "w": 22, + "h": 22 + } + }, + { + "filename": "water_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 296, + "y": 174, + "w": 22, + "h": 22 + } + }, + { + "filename": "x_accuracy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 318, + "y": 174, + "w": 22, + "h": 22 + } + }, + { + "filename": "x_attack", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 340, + "y": 174, + "w": 22, + "h": 22 + } + }, + { + "filename": "sitrus_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 20, + "h": 22 + }, + "frame": { + "x": 362, + "y": 174, + "w": 20, + "h": 22 + } + }, + { + "filename": "poison_barb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 382, + "y": 173, + "w": 21, + "h": 21 + } + }, + { + "filename": "black_glasses", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 403, + "y": 178, + "w": 23, + "h": 17 + } + }, + { + "filename": "metal_coat", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 19, + "h": 22 + }, + "frame": { + "x": 193, + "y": 198, + "w": 19, + "h": 22 + } + }, + { + "filename": "x_defense", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 212, + "y": 196, + "w": 22, + "h": 22 + } + }, + { + "filename": "x_sp_atk", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 234, + "y": 196, + "w": 22, + "h": 22 + } + }, + { + "filename": "x_sp_def", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 256, + "y": 196, + "w": 22, + "h": 22 + } + }, + { + "filename": "x_speed", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 278, + "y": 196, + "w": 22, + "h": 22 + } + }, + { + "filename": "sweet_apple", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 300, + "y": 196, + "w": 22, + "h": 21 + } + }, + { + "filename": "syrupy_apple", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 322, + "y": 196, + "w": 22, + "h": 21 + } + }, + { + "filename": "tart_apple", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 344, + "y": 196, + "w": 22, + "h": 21 + } + }, + { + "filename": "quick_claw", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 21 + }, + "frame": { + "x": 193, + "y": 220, + "w": 19, + "h": 21 + } + }, + { + "filename": "deep_sea_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 212, + "y": 218, + "w": 22, + "h": 20 + } + }, + { + "filename": "fairy_feather", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 20 + }, + "frame": { + "x": 234, + "y": 218, + "w": 22, + "h": 20 + } + }, + { + "filename": "malicious_armor", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 256, + "y": 218, + "w": 22, + "h": 20 + } + }, + { + "filename": "tera_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 278, + "y": 218, + "w": 22, + "h": 20 + } + }, + { + "filename": "shiny_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 300, + "y": 217, + "w": 21, + "h": 21 + } + }, + { + "filename": "zoom_lens", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 321, + "y": 217, + "w": 21, + "h": 21 + } + }, + { + "filename": "blunder_policy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 19 + }, + "frame": { + "x": 342, + "y": 217, + "w": 22, + "h": 19 + } + }, + { + "filename": "spell_tag", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 19, + "h": 21 + }, + "frame": { + "x": 193, + "y": 241, + "w": 19, + "h": 21 + } + }, + { + "filename": "dubious_disc", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 19 + }, + "frame": { + "x": 212, + "y": 238, + "w": 22, + "h": 19 + } + }, + { + "filename": "upgrade", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 19 + }, + "frame": { + "x": 234, + "y": 238, + "w": 22, + "h": 19 + } + }, + { + "filename": "burn_drive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 256, + "y": 238, + "w": 23, + "h": 17 + } + }, + { + "filename": "chill_drive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 279, + "y": 238, + "w": 23, + "h": 17 + } + }, + { + "filename": "douse_drive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 302, + "y": 238, + "w": 23, + "h": 17 + } + }, + { + "filename": "soothe_bell", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 366, + "y": 196, + "w": 17, + "h": 22 + } + }, + { + "filename": "big_nugget", "rotated": false, "trimmed": true, "sourceSize": { @@ -5526,8 +5988,71 @@ "h": 20 }, "frame": { - "x": 132, - "y": 279, + "x": 383, + "y": 194, + "w": 20, + "h": 20 + } + }, + { + "filename": "shock_drive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 403, + "y": 195, + "w": 23, + "h": 17 + } + }, + { + "filename": "wise_glasses", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 403, + "y": 212, + "w": 23, + "h": 17 + } + }, + { + "filename": "blue_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 383, + "y": 214, "w": 20, "h": 20 } @@ -5547,8 +6072,71 @@ "h": 20 }, "frame": { - "x": 152, - "y": 280, + "x": 364, + "y": 218, + "w": 19, + "h": 20 + } + }, + { + "filename": "big_mushroom", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 19 + }, + "frame": { + "x": 325, + "y": 238, + "w": 19, + "h": 19 + } + }, + { + "filename": "gb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 344, + "y": 236, + "w": 20, + "h": 20 + } + }, + { + "filename": "candy_jar", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 20 + }, + "frame": { + "x": 364, + "y": 238, "w": 19, "h": 20 } @@ -5568,8 +6156,8 @@ "h": 20 }, "frame": { - "x": 132, - "y": 299, + "x": 383, + "y": 234, "w": 20, "h": 20 } @@ -5589,12 +6177,75 @@ "h": 20 }, "frame": { - "x": 132, - "y": 319, + "x": 403, + "y": 229, "w": 20, "h": 20 } }, + { + "filename": "masterpiece_teacup", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 21, + "h": 18 + }, + "frame": { + "x": 212, + "y": 257, + "w": 21, + "h": 18 + } + }, + { + "filename": "metal_alloy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 21, + "h": 19 + }, + "frame": { + "x": 233, + "y": 257, + "w": 21, + "h": 19 + } + }, + { + "filename": "hard_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 20 + }, + "frame": { + "x": 193, + "y": 262, + "w": 19, + "h": 20 + } + }, { "filename": "pb", "rotated": false, @@ -5610,12 +6261,54 @@ "h": 20 }, "frame": { - "x": 132, - "y": 339, + "x": 190, + "y": 282, "w": 20, "h": 20 } }, + { + "filename": "golden_egg", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 17, + "h": 20 + }, + "frame": { + "x": 193, + "y": 302, + "w": 17, + "h": 20 + } + }, + { + "filename": "sharp_meteorite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 21, + "h": 18 + }, + "frame": { + "x": 212, + "y": 275, + "w": 21, + "h": 18 + } + }, { "filename": "pb_gold", "rotated": false, @@ -5631,14 +6324,35 @@ "h": 20 }, "frame": { - "x": 132, - "y": 359, + "x": 210, + "y": 293, "w": 20, "h": 20 } }, { - "filename": "quick_claw", + "filename": "unremarkable_teacup", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 21, + "h": 18 + }, + "frame": { + "x": 233, + "y": 276, + "w": 21, + "h": 18 + } + }, + { + "filename": "lum_berry", "rotated": false, "trimmed": true, "sourceSize": { @@ -5647,15 +6361,57 @@ }, "spriteSourceSize": { "x": 6, - "y": 6, - "w": 19, - "h": 21 + "y": 7, + "w": 20, + "h": 19 }, "frame": { - "x": 152, - "y": 300, - "w": 19, - "h": 21 + "x": 230, + "y": 294, + "w": 20, + "h": 19 + } + }, + { + "filename": "everstone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 17 + }, + "frame": { + "x": 210, + "y": 313, + "w": 20, + "h": 17 + } + }, + { + "filename": "power_herb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 24, + "h": 24 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 20, + "h": 19 + }, + "frame": { + "x": 230, + "y": 313, + "w": 20, + "h": 19 } }, { @@ -5673,33 +6429,12 @@ "h": 20 }, "frame": { - "x": 171, - "y": 294, + "x": 201, + "y": 330, "w": 20, "h": 20 } }, - { - "filename": "spell_tag", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 19, - "h": 21 - }, - "frame": { - "x": 152, - "y": 321, - "w": 19, - "h": 21 - } - }, { "filename": "smooth_meteorite", "rotated": false, @@ -5715,12 +6450,33 @@ "h": 20 }, "frame": { - "x": 171, - "y": 314, + "x": 201, + "y": 350, "w": 20, "h": 20 } }, + { + "filename": "razor_fang", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 18, + "h": 20 + }, + "frame": { + "x": 203, + "y": 370, + "w": 18, + "h": 20 + } + }, { "filename": "strange_ball", "rotated": false, @@ -5736,54 +6492,12 @@ "h": 20 }, "frame": { - "x": 191, - "y": 297, + "x": 221, + "y": 332, "w": 20, "h": 20 } }, - { - "filename": "zinc", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 152, - "y": 342, - "w": 16, - "h": 24 - } - }, - { - "filename": "everstone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 17 - }, - "frame": { - "x": 191, - "y": 317, - "w": 20, - "h": 17 - } - }, { "filename": "ub", "rotated": false, @@ -5799,180 +6513,12 @@ "h": 20 }, "frame": { - "x": 211, - "y": 300, + "x": 221, + "y": 352, "w": 20, "h": 20 } }, - { - "filename": "lum_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 20, - "h": 19 - }, - "frame": { - "x": 211, - "y": 320, - "w": 20, - "h": 19 - } - }, - { - "filename": "candy_jar", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 20 - }, - "frame": { - "x": 231, - "y": 306, - "w": 19, - "h": 20 - } - }, - { - "filename": "hard_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 20 - }, - "frame": { - "x": 133, - "y": 379, - "w": 19, - "h": 20 - } - }, - { - "filename": "full_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 15, - "h": 23 - }, - "frame": { - "x": 152, - "y": 366, - "w": 15, - "h": 23 - } - }, - { - "filename": "revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 12, - "h": 17 - }, - "frame": { - "x": 133, - "y": 399, - "w": 12, - "h": 17 - } - }, - { - "filename": "mega_bracelet", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 16 - }, - "frame": { - "x": 231, - "y": 326, - "w": 20, - "h": 16 - } - }, - { - "filename": "sharp_meteorite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 21, - "h": 18 - }, - "frame": { - "x": 250, - "y": 308, - "w": 21, - "h": 18 - } - }, - { - "filename": "unremarkable_teacup", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 21, - "h": 18 - }, - "frame": { - "x": 271, - "y": 308, - "w": 21, - "h": 18 - } - }, { "filename": "razor_claw", "rotated": false, @@ -5988,12 +6534,96 @@ "h": 19 }, "frame": { - "x": 292, - "y": 308, + "x": 221, + "y": 372, "w": 20, "h": 19 } }, + { + "filename": "lucky_egg", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 17, + "h": 20 + }, + "frame": { + "x": 241, + "y": 332, + "w": 17, + "h": 20 + } + }, + { + "filename": "miracle_seed", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 19, + "h": 19 + }, + "frame": { + "x": 241, + "y": 352, + "w": 19, + "h": 19 + } + }, + { + "filename": "white_herb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 24, + "h": 24 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 20, + "h": 19 + }, + "frame": { + "x": 241, + "y": 371, + "w": 20, + "h": 19 + } + }, + { + "filename": "mega_bracelet", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 16 + }, + "frame": { + "x": 403, + "y": 249, + "w": 20, + "h": 16 + } + }, { "filename": "wl_ability_urge", "rotated": false, @@ -6009,8 +6639,8 @@ "h": 18 }, "frame": { - "x": 251, - "y": 326, + "x": 383, + "y": 254, "w": 20, "h": 18 } @@ -6030,12 +6660,33 @@ "h": 18 }, "frame": { - "x": 271, - "y": 326, + "x": 403, + "y": 265, "w": 20, "h": 18 } }, + { + "filename": "mystery_egg", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 18 + }, + "frame": { + "x": 205, + "y": 390, + "w": 16, + "h": 18 + } + }, { "filename": "wl_awakening", "rotated": false, @@ -6051,14 +6702,14 @@ "h": 18 }, "frame": { - "x": 291, - "y": 327, + "x": 205, + "y": 408, "w": 20, "h": 18 } }, { - "filename": "golden_egg", + "filename": "relic_band", "rotated": false, "trimmed": true, "sourceSize": { @@ -6067,19 +6718,19 @@ }, "spriteSourceSize": { "x": 7, - "y": 6, + "y": 9, "w": 17, - "h": 20 + "h": 16 }, "frame": { - "x": 312, - "y": 308, + "x": 221, + "y": 391, "w": 17, - "h": 20 + "h": 16 } }, { - "filename": "candy", + "filename": "oval_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -6088,19 +6739,19 @@ }, "spriteSourceSize": { "x": 7, - "y": 11, + "y": 7, "w": 18, - "h": 18 + "h": 19 }, "frame": { - "x": 311, - "y": 328, + "x": 225, + "y": 407, "w": 18, - "h": 18 + "h": 19 } }, { - "filename": "leftovers", + "filename": "abomasite", "rotated": false, "trimmed": true, "sourceSize": { @@ -6109,15 +6760,15 @@ }, "spriteSourceSize": { "x": 8, - "y": 5, - "w": 15, - "h": 22 + "y": 8, + "w": 16, + "h": 16 }, "frame": { - "x": 329, - "y": 307, - "w": 15, - "h": 22 + "x": 238, + "y": 391, + "w": 16, + "h": 16 } }, { @@ -6135,12 +6786,33 @@ "h": 18 }, "frame": { - "x": 329, - "y": 329, + "x": 243, + "y": 407, "w": 18, "h": 18 } }, + { + "filename": "relic_gold", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 11, + "w": 15, + "h": 11 + }, + "frame": { + "x": 59, + "y": 27, + "w": 15, + "h": 11 + } + }, { "filename": "wl_burn_heal", "rotated": false, @@ -6156,134 +6828,8 @@ "h": 18 }, "frame": { - "x": 171, - "y": 334, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_custom_spliced", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 191, - "y": 334, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_custom_thief", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 211, - "y": 339, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_elixir", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 231, - "y": 342, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_ether", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 251, - "y": 344, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_full_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 271, - "y": 344, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_full_restore", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 291, - "y": 345, + "x": 344, + "y": 256, "w": 20, "h": 18 } @@ -6303,12 +6849,75 @@ "h": 18 }, "frame": { - "x": 311, - "y": 346, + "x": 364, + "y": 258, "w": 18, "h": 18 } }, + { + "filename": "wl_custom_spliced", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 382, + "y": 272, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_custom_thief", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 402, + "y": 283, + "w": 20, + "h": 18 + } + }, + { + "filename": "absolite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 254, + "y": 390, + "w": 16, + "h": 16 + } + }, { "filename": "light_ball", "rotated": false, @@ -6324,12 +6933,138 @@ "h": 18 }, "frame": { - "x": 329, - "y": 347, + "x": 261, + "y": 406, "w": 18, "h": 18 } }, + { + "filename": "light_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 250, + "y": 294, + "w": 18, + "h": 18 + } + }, + { + "filename": "toxic_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 250, + "y": 312, + "w": 18, + "h": 18 + } + }, + { + "filename": "wl_elixir", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 254, + "y": 276, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_ether", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 258, + "y": 330, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_full_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 260, + "y": 348, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_full_restore", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 261, + "y": 366, + "w": 20, + "h": 18 + } + }, { "filename": "wl_guard_spec", "rotated": false, @@ -6345,8 +7080,8 @@ "h": 18 }, "frame": { - "x": 168, - "y": 352, + "x": 268, + "y": 294, "w": 20, "h": 18 } @@ -6366,33 +7101,12 @@ "h": 18 }, "frame": { - "x": 188, - "y": 352, + "x": 268, + "y": 312, "w": 20, "h": 18 } }, - { - "filename": "miracle_seed", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 19, - "h": 19 - }, - "frame": { - "x": 167, - "y": 370, - "w": 19, - "h": 19 - } - }, { "filename": "wl_ice_heal", "rotated": false, @@ -6408,8 +7122,8 @@ "h": 18 }, "frame": { - "x": 186, - "y": 370, + "x": 274, + "y": 276, "w": 20, "h": 18 } @@ -6429,54 +7143,12 @@ "h": 18 }, "frame": { - "x": 152, - "y": 389, + "x": 278, + "y": 330, "w": 20, "h": 18 } }, - { - "filename": "light_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 172, - "y": 389, - "w": 18, - "h": 18 - } - }, - { - "filename": "lucky_egg", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 17, - "h": 20 - }, - "frame": { - "x": 190, - "y": 388, - "w": 17, - "h": 20 - } - }, { "filename": "wl_item_urge", "rotated": false, @@ -6492,8 +7164,8 @@ "h": 18 }, "frame": { - "x": 208, - "y": 357, + "x": 280, + "y": 348, "w": 20, "h": 18 } @@ -6513,8 +7185,8 @@ "h": 18 }, "frame": { - "x": 228, - "y": 360, + "x": 281, + "y": 366, "w": 20, "h": 18 } @@ -6534,8 +7206,8 @@ "h": 18 }, "frame": { - "x": 248, - "y": 362, + "x": 270, + "y": 384, "w": 20, "h": 18 } @@ -6555,8 +7227,8 @@ "h": 18 }, "frame": { - "x": 268, - "y": 362, + "x": 290, + "y": 384, "w": 20, "h": 18 } @@ -6576,8 +7248,8 @@ "h": 18 }, "frame": { - "x": 288, - "y": 363, + "x": 279, + "y": 402, "w": 20, "h": 18 } @@ -6597,8 +7269,8 @@ "h": 18 }, "frame": { - "x": 308, - "y": 364, + "x": 299, + "y": 402, "w": 20, "h": 18 } @@ -6618,75 +7290,12 @@ "h": 18 }, "frame": { - "x": 328, - "y": 365, + "x": 288, + "y": 294, "w": 20, "h": 18 } }, - { - "filename": "razor_fang", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 18, - "h": 20 - }, - "frame": { - "x": 341, - "y": 287, - "w": 18, - "h": 20 - } - }, - { - "filename": "metronome", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 344, - "y": 307, - "w": 17, - "h": 22 - } - }, - { - "filename": "soothe_bell", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 347, - "y": 329, - "w": 17, - "h": 22 - } - }, { "filename": "wl_reset_urge", "rotated": false, @@ -6702,8 +7311,8 @@ "h": 18 }, "frame": { - "x": 207, - "y": 375, + "x": 288, + "y": 312, "w": 20, "h": 18 } @@ -6723,8 +7332,8 @@ "h": 18 }, "frame": { - "x": 207, - "y": 393, + "x": 294, + "y": 276, "w": 20, "h": 18 } @@ -6744,138 +7353,12 @@ "h": 18 }, "frame": { - "x": 227, - "y": 378, + "x": 298, + "y": 330, "w": 20, "h": 18 } }, - { - "filename": "oval_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 19 - }, - "frame": { - "x": 247, - "y": 380, - "w": 18, - "h": 19 - } - }, - { - "filename": "toxic_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 265, - "y": 380, - "w": 18, - "h": 18 - } - }, - { - "filename": "mystery_egg", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 18 - }, - "frame": { - "x": 265, - "y": 398, - "w": 16, - "h": 18 - } - }, - { - "filename": "relic_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 17, - "h": 16 - }, - "frame": { - "x": 227, - "y": 396, - "w": 17, - "h": 16 - } - }, - { - "filename": "abomasite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 283, - "y": 381, - "w": 16, - "h": 16 - } - }, - { - "filename": "absolite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 244, - "y": 399, - "w": 16, - "h": 16 - } - }, { "filename": "aerodactylite", "rotated": false, @@ -6891,8 +7374,8 @@ "h": 16 }, "frame": { - "x": 299, - "y": 382, + "x": 300, + "y": 348, "w": 16, "h": 16 } @@ -6912,8 +7395,8 @@ "h": 16 }, "frame": { - "x": 364, - "y": 164, + "x": 301, + "y": 364, "w": 16, "h": 16 } @@ -6933,8 +7416,8 @@ "h": 16 }, "frame": { - "x": 364, - "y": 180, + "x": 308, + "y": 294, "w": 16, "h": 16 } @@ -6954,8 +7437,8 @@ "h": 16 }, "frame": { - "x": 363, - "y": 196, + "x": 308, + "y": 310, "w": 16, "h": 16 } @@ -6975,8 +7458,8 @@ "h": 16 }, "frame": { - "x": 362, - "y": 212, + "x": 310, + "y": 380, "w": 16, "h": 16 } @@ -6996,8 +7479,8 @@ "h": 16 }, "frame": { - "x": 362, - "y": 228, + "x": 316, + "y": 348, "w": 16, "h": 16 } @@ -7017,8 +7500,8 @@ "h": 16 }, "frame": { - "x": 362, - "y": 244, + "x": 317, + "y": 364, "w": 16, "h": 16 } @@ -7038,33 +7521,12 @@ "h": 16 }, "frame": { - "x": 361, - "y": 260, + "x": 326, + "y": 380, "w": 16, "h": 16 } }, - { - "filename": "eviolite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 15, - "h": 15 - }, - "frame": { - "x": 380, - "y": 157, - "w": 15, - "h": 15 - } - }, { "filename": "blastoisinite", "rotated": false, @@ -7080,8 +7542,8 @@ "h": 16 }, "frame": { - "x": 380, - "y": 172, + "x": 319, + "y": 396, "w": 16, "h": 16 } @@ -7101,8 +7563,8 @@ "h": 16 }, "frame": { - "x": 380, - "y": 188, + "x": 335, + "y": 396, "w": 16, "h": 16 } @@ -7122,8 +7584,8 @@ "h": 16 }, "frame": { - "x": 379, - "y": 204, + "x": 256, + "y": 255, "w": 16, "h": 16 } @@ -7143,8 +7605,8 @@ "h": 16 }, "frame": { - "x": 378, - "y": 220, + "x": 272, + "y": 255, "w": 16, "h": 16 } @@ -7164,33 +7626,12 @@ "h": 16 }, "frame": { - "x": 378, - "y": 236, + "x": 288, + "y": 255, "w": 16, "h": 16 } }, - { - "filename": "candy_overlay", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 12, - "w": 16, - "h": 15 - }, - "frame": { - "x": 378, - "y": 252, - "w": 16, - "h": 15 - } - }, { "filename": "diancite", "rotated": false, @@ -7206,8 +7647,8 @@ "h": 16 }, "frame": { - "x": 377, - "y": 267, + "x": 304, + "y": 255, "w": 16, "h": 16 } @@ -7227,33 +7668,12 @@ "h": 16 }, "frame": { - "x": 361, - "y": 276, + "x": 320, + "y": 257, "w": 16, "h": 16 } }, - { - "filename": "prism_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 15, - "h": 15 - }, - "frame": { - "x": 359, - "y": 292, - "w": 15, - "h": 15 - } - }, { "filename": "garchompite", "rotated": false, @@ -7269,8 +7689,8 @@ "h": 16 }, "frame": { - "x": 361, - "y": 307, + "x": 314, + "y": 273, "w": 16, "h": 16 } @@ -7290,8 +7710,8 @@ "h": 16 }, "frame": { - "x": 377, - "y": 283, + "x": 318, + "y": 326, "w": 16, "h": 16 } @@ -7311,8 +7731,8 @@ "h": 16 }, "frame": { - "x": 377, - "y": 299, + "x": 330, + "y": 274, "w": 16, "h": 16 } @@ -7332,8 +7752,8 @@ "h": 16 }, "frame": { - "x": 377, - "y": 315, + "x": 346, + "y": 274, "w": 16, "h": 16 } @@ -7353,8 +7773,8 @@ "h": 16 }, "frame": { - "x": 364, - "y": 331, + "x": 362, + "y": 276, "w": 16, "h": 16 } @@ -7374,8 +7794,8 @@ "h": 16 }, "frame": { - "x": 380, - "y": 331, + "x": 324, + "y": 290, "w": 16, "h": 16 } @@ -7395,8 +7815,8 @@ "h": 16 }, "frame": { - "x": 364, - "y": 347, + "x": 324, + "y": 306, "w": 16, "h": 16 } @@ -7416,8 +7836,8 @@ "h": 16 }, "frame": { - "x": 380, - "y": 347, + "x": 340, + "y": 290, "w": 16, "h": 16 } @@ -7437,8 +7857,8 @@ "h": 16 }, "frame": { - "x": 348, - "y": 351, + "x": 340, + "y": 306, "w": 16, "h": 16 } @@ -7458,8 +7878,8 @@ "h": 16 }, "frame": { - "x": 348, - "y": 367, + "x": 334, + "y": 322, "w": 16, "h": 16 } @@ -7479,8 +7899,8 @@ "h": 16 }, "frame": { - "x": 364, - "y": 363, + "x": 356, + "y": 292, "w": 16, "h": 16 } @@ -7500,8 +7920,8 @@ "h": 16 }, "frame": { - "x": 380, - "y": 363, + "x": 356, + "y": 308, "w": 16, "h": 16 } @@ -7521,8 +7941,8 @@ "h": 16 }, "frame": { - "x": 364, - "y": 379, + "x": 350, + "y": 324, "w": 16, "h": 16 } @@ -7542,8 +7962,8 @@ "h": 16 }, "frame": { - "x": 380, - "y": 379, + "x": 372, + "y": 292, "w": 16, "h": 16 } @@ -7563,8 +7983,8 @@ "h": 16 }, "frame": { - "x": 281, - "y": 398, + "x": 372, + "y": 308, "w": 16, "h": 16 } @@ -7584,8 +8004,8 @@ "h": 16 }, "frame": { - "x": 297, - "y": 398, + "x": 366, + "y": 324, "w": 16, "h": 16 } @@ -7605,8 +8025,8 @@ "h": 16 }, "frame": { - "x": 396, - "y": 158, + "x": 334, + "y": 338, "w": 16, "h": 16 } @@ -7626,8 +8046,8 @@ "h": 16 }, "frame": { - "x": 396, - "y": 174, + "x": 350, + "y": 340, "w": 16, "h": 16 } @@ -7647,8 +8067,8 @@ "h": 16 }, "frame": { - "x": 396, - "y": 190, + "x": 366, + "y": 340, "w": 16, "h": 16 } @@ -7668,8 +8088,8 @@ "h": 16 }, "frame": { - "x": 395, - "y": 206, + "x": 382, + "y": 324, "w": 16, "h": 16 } @@ -7689,8 +8109,8 @@ "h": 16 }, "frame": { - "x": 394, - "y": 222, + "x": 382, + "y": 340, "w": 16, "h": 16 } @@ -7710,8 +8130,8 @@ "h": 16 }, "frame": { - "x": 394, - "y": 238, + "x": 333, + "y": 354, "w": 16, "h": 16 } @@ -7731,8 +8151,8 @@ "h": 16 }, "frame": { - "x": 394, - "y": 254, + "x": 349, + "y": 356, "w": 16, "h": 16 } @@ -7752,8 +8172,8 @@ "h": 16 }, "frame": { - "x": 393, - "y": 270, + "x": 365, + "y": 356, "w": 16, "h": 16 } @@ -7773,8 +8193,8 @@ "h": 16 }, "frame": { - "x": 393, - "y": 286, + "x": 381, + "y": 356, "w": 16, "h": 16 } @@ -7794,8 +8214,8 @@ "h": 16 }, "frame": { - "x": 393, - "y": 302, + "x": 388, + "y": 301, "w": 16, "h": 16 } @@ -7815,8 +8235,8 @@ "h": 16 }, "frame": { - "x": 315, - "y": 383, + "x": 404, + "y": 301, "w": 16, "h": 16 } @@ -7836,8 +8256,8 @@ "h": 16 }, "frame": { - "x": 331, - "y": 383, + "x": 398, + "y": 317, "w": 16, "h": 16 } @@ -7857,8 +8277,8 @@ "h": 16 }, "frame": { - "x": 347, - "y": 383, + "x": 398, + "y": 333, "w": 16, "h": 16 } @@ -7878,8 +8298,8 @@ "h": 16 }, "frame": { - "x": 313, - "y": 399, + "x": 398, + "y": 349, "w": 16, "h": 16 } @@ -7899,12 +8319,33 @@ "h": 16 }, "frame": { - "x": 329, - "y": 399, + "x": 397, + "y": 365, "w": 16, "h": 16 } }, + { + "filename": "prism_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 15, + "h": 15 + }, + "frame": { + "x": 342, + "y": 381, + "w": 15, + "h": 15 + } + }, { "filename": "swampertite", "rotated": false, @@ -7920,8 +8361,8 @@ "h": 16 }, "frame": { - "x": 345, - "y": 399, + "x": 357, + "y": 372, "w": 16, "h": 16 } @@ -7941,8 +8382,8 @@ "h": 16 }, "frame": { - "x": 363, - "y": 395, + "x": 373, + "y": 372, "w": 16, "h": 16 } @@ -7962,8 +8403,8 @@ "h": 16 }, "frame": { - "x": 379, - "y": 395, + "x": 357, + "y": 388, "w": 16, "h": 16 } @@ -7974,6 +8415,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:1b6e262a772654e8b35b755bf9f72b4b:d747988c68896024764564ae07a7c2a2:110e074689c9edd2c54833ce2e4d9270$" + "smartupdate": "$TexturePacker:SmartUpdate:e5b40a9bd9ade8242224592e0116a6b0:0100946d64a1651a631f504350fdf3eb:110e074689c9edd2c54833ce2e4d9270$" } } diff --git a/public/images/items.png b/public/images/items.png index 4857c4a66e4..f68b96c1975 100644 Binary files a/public/images/items.png and b/public/images/items.png differ diff --git a/public/images/items/baton.png b/public/images/items/baton.png new file mode 100644 index 00000000000..8e9ebfae06d Binary files /dev/null and b/public/images/items/baton.png differ diff --git a/public/images/items/stick.png b/public/images/items/leek.png similarity index 100% rename from public/images/items/stick.png rename to public/images/items/leek.png diff --git a/public/images/items/power_herb.png b/public/images/items/power_herb.png new file mode 100644 index 00000000000..8e68b62278f Binary files /dev/null and b/public/images/items/power_herb.png differ diff --git a/public/images/items/ribbon-gen1.png b/public/images/items/ribbon-gen1.png new file mode 100644 index 00000000000..a9774d18ad0 Binary files /dev/null and b/public/images/items/ribbon-gen1.png differ diff --git a/public/images/items/ribbon-gen2.png b/public/images/items/ribbon-gen2.png new file mode 100644 index 00000000000..a04f6a32a62 Binary files /dev/null and b/public/images/items/ribbon-gen2.png differ diff --git a/public/images/items/ribbon-gen3.png b/public/images/items/ribbon-gen3.png new file mode 100644 index 00000000000..0cf20ed92ee Binary files /dev/null and b/public/images/items/ribbon-gen3.png differ diff --git a/public/images/items/ribbon-gen4.png b/public/images/items/ribbon-gen4.png new file mode 100644 index 00000000000..aa24433b71b Binary files /dev/null and b/public/images/items/ribbon-gen4.png differ diff --git a/public/images/items/ribbon-gen5.png b/public/images/items/ribbon-gen5.png new file mode 100644 index 00000000000..7bb7800671f Binary files /dev/null and b/public/images/items/ribbon-gen5.png differ diff --git a/public/images/items/ribbon-gen6.png b/public/images/items/ribbon-gen6.png new file mode 100644 index 00000000000..e466eb78842 Binary files /dev/null and b/public/images/items/ribbon-gen6.png differ diff --git a/public/images/items/ribbon-gen7.png b/public/images/items/ribbon-gen7.png new file mode 100644 index 00000000000..9c156ebd1c6 Binary files /dev/null and b/public/images/items/ribbon-gen7.png differ diff --git a/public/images/items/ribbon-gen8.png b/public/images/items/ribbon-gen8.png new file mode 100644 index 00000000000..86b3748e348 Binary files /dev/null and b/public/images/items/ribbon-gen8.png differ diff --git a/public/images/items/ribbon-gen9.png b/public/images/items/ribbon-gen9.png new file mode 100644 index 00000000000..e9609daf3cd Binary files /dev/null and b/public/images/items/ribbon-gen9.png differ diff --git a/public/images/items/ribbon_gen1.png b/public/images/items/ribbon_gen1.png new file mode 100644 index 00000000000..a9774d18ad0 Binary files /dev/null and b/public/images/items/ribbon_gen1.png differ diff --git a/public/images/items/ribbon_gen2.png b/public/images/items/ribbon_gen2.png new file mode 100644 index 00000000000..a04f6a32a62 Binary files /dev/null and b/public/images/items/ribbon_gen2.png differ diff --git a/public/images/items/ribbon_gen3.png b/public/images/items/ribbon_gen3.png new file mode 100644 index 00000000000..0cf20ed92ee Binary files /dev/null and b/public/images/items/ribbon_gen3.png differ diff --git a/public/images/items/ribbon_gen4.png b/public/images/items/ribbon_gen4.png new file mode 100644 index 00000000000..aa24433b71b Binary files /dev/null and b/public/images/items/ribbon_gen4.png differ diff --git a/public/images/items/ribbon_gen5.png b/public/images/items/ribbon_gen5.png new file mode 100644 index 00000000000..7bb7800671f Binary files /dev/null and b/public/images/items/ribbon_gen5.png differ diff --git a/public/images/items/ribbon_gen6.png b/public/images/items/ribbon_gen6.png new file mode 100644 index 00000000000..e466eb78842 Binary files /dev/null and b/public/images/items/ribbon_gen6.png differ diff --git a/public/images/items/ribbon_gen7.png b/public/images/items/ribbon_gen7.png new file mode 100644 index 00000000000..9c156ebd1c6 Binary files /dev/null and b/public/images/items/ribbon_gen7.png differ diff --git a/public/images/items/ribbon_gen8.png b/public/images/items/ribbon_gen8.png new file mode 100644 index 00000000000..86b3748e348 Binary files /dev/null and b/public/images/items/ribbon_gen8.png differ diff --git a/public/images/items/ribbon_gen9.png b/public/images/items/ribbon_gen9.png new file mode 100644 index 00000000000..e9609daf3cd Binary files /dev/null and b/public/images/items/ribbon_gen9.png differ diff --git a/public/images/items/white_herb.png b/public/images/items/white_herb.png new file mode 100644 index 00000000000..25cfc652109 Binary files /dev/null and b/public/images/items/white_herb.png differ diff --git a/public/images/pokemon/563.json b/public/images/pokemon/563.json index 81979d38c9e..666ec547d18 100644 --- a/public/images/pokemon/563.json +++ b/public/images/pokemon/563.json @@ -1,3485 +1,699 @@ -{ - "textures": [ - { - "image": "563.png", - "format": "RGBA8888", - "size": { - "w": 500, - "h": 500 - }, - "scale": 1, - "frames": [ - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0156.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0157.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 103, - "h": 88 - }, - "frame": { - "x": 0, - "y": 81, - "w": 103, - "h": 88 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 103, - "h": 88 - }, - "frame": { - "x": 0, - "y": 81, - "w": 103, - "h": 88 - } - }, - { - "filename": "0155.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 103, - "h": 88 - }, - "frame": { - "x": 0, - "y": 81, - "w": 103, - "h": 88 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0158.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0159.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0161.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0162.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 99, - "h": 81 - }, - "frame": { - "x": 0, - "y": 250, - "w": 99, - "h": 81 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 99, - "h": 81 - }, - "frame": { - "x": 0, - "y": 250, - "w": 99, - "h": 81 - } - }, - { - "filename": "0135.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 99, - "h": 81 - }, - "frame": { - "x": 0, - "y": 250, - "w": 99, - "h": 81 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0163.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0164.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0133.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0134.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 108, - "h": 72 - }, - "frame": { - "x": 232, - "y": 0, - "w": 108, - "h": 72 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 108, - "h": 72 - }, - "frame": { - "x": 232, - "y": 0, - "w": 108, - "h": 72 - } - }, - { - "filename": "0160.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 108, - "h": 72 - }, - "frame": { - "x": 232, - "y": 0, - "w": 108, - "h": 72 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0153.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0154.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0143.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0144.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0151.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0152.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 10, - "w": 104, - "h": 67 - }, - "frame": { - "x": 328, - "y": 72, - "w": 104, - "h": 67 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 10, - "w": 104, - "h": 67 - }, - "frame": { - "x": 328, - "y": 72, - "w": 104, - "h": 67 - } - }, - { - "filename": "0145.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 10, - "w": 104, - "h": 67 - }, - "frame": { - "x": 328, - "y": 72, - "w": 104, - "h": 67 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0141.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0142.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 98, - "h": 73 - }, - "frame": { - "x": 205, - "y": 140, - "w": 98, - "h": 73 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 98, - "h": 73 - }, - "frame": { - "x": 205, - "y": 140, - "w": 98, - "h": 73 - } - }, - { - "filename": "0150.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 98, - "h": 73 - }, - "frame": { - "x": 205, - "y": 140, - "w": 98, - "h": 73 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0136.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0137.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 94, - "h": 75 - }, - "frame": { - "x": 197, - "y": 213, - "w": 94, - "h": 75 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 94, - "h": 75 - }, - "frame": { - "x": 197, - "y": 213, - "w": 94, - "h": 75 - } - }, - { - "filename": "0140.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 94, - "h": 75 - }, - "frame": { - "x": 197, - "y": 213, - "w": 94, - "h": 75 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0146.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0147.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0138.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0139.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0148.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0149.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0165.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 98, - "y": 358, - "w": 93, - "h": 78 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 98, - "y": 358, - "w": 93, - "h": 78 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 191, - "y": 366, - "w": 93, - "h": 78 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 19, - "y": 18, - "w": 73, - "h": 64 - }, - "frame": { - "x": 96, - "y": 436, - "w": 73, - "h": 64 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 28, - "y": 17, - "w": 52, - "h": 65 - }, - "frame": { - "x": 446, - "y": 0, - "w": 52, - "h": 65 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 93, - "h": 79 - }, - "frame": { - "x": 303, - "y": 140, - "w": 93, - "h": 79 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 291, - "y": 219, - "w": 93, - "h": 78 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 291, - "y": 219, - "w": 93, - "h": 78 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 93, - "h": 77 - }, - "frame": { - "x": 286, - "y": 297, - "w": 93, - "h": 77 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 85, - "h": 73 - }, - "frame": { - "x": 284, - "y": 374, - "w": 85, - "h": 73 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 16, - "y": 5, - "w": 75, - "h": 79 - }, - "frame": { - "x": 396, - "y": 139, - "w": 75, - "h": 79 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 85, - "h": 79 - }, - "frame": { - "x": 384, - "y": 219, - "w": 85, - "h": 79 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 16, - "y": 15, - "w": 78, - "h": 67 - }, - "frame": { - "x": 379, - "y": 298, - "w": 78, - "h": 67 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 16, - "y": 15, - "w": 78, - "h": 67 - }, - "frame": { - "x": 379, - "y": 298, - "w": 78, - "h": 67 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 21, - "y": 8, - "w": 66, - "h": 76 - }, - "frame": { - "x": 369, - "y": 374, - "w": 66, - "h": 76 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 21, - "y": 8, - "w": 66, - "h": 76 - }, - "frame": { - "x": 369, - "y": 374, - "w": 66, - "h": 76 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 25, - "y": 12, - "w": 59, - "h": 70 - }, - "frame": { - "x": 435, - "y": 365, - "w": 59, - "h": 70 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 25, - "y": 19, - "w": 66, - "h": 63 - }, - "frame": { - "x": 432, - "y": 72, - "w": 66, - "h": 63 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 29, - "y": 20, - "w": 60, - "h": 62 - }, - "frame": { - "x": 435, - "y": 435, - "w": 60, - "h": 62 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 29, - "y": 20, - "w": 60, - "h": 62 - }, - "frame": { - "x": 435, - "y": 435, - "w": 60, - "h": 62 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 16, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 16, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 17, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 17, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 14, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 14, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 15, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 15, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 16, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 16, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 17, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 17, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a1c52466e8cdc83633a9fbd5b8675ca7:19652e451f806ac9b4bbb01e17b071df:12f3eae8283ab6c8e555ff3e46b7d8dc$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0002.png", + "frame": { "x": 388, "y": 152, "w": 97, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 10, "w": 97, "h": 72 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0003.png", + "frame": { "x": 105, "y": 161, "w": 102, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 15, "w": 102, "h": 68 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0004.png", + "frame": { "x": 95, "y": 90, "w": 101, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 101, "h": 70 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0005.png", + "frame": { "x": 108, "y": 0, "w": 94, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 94, "h": 89 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 0, "w": 107, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 107, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0007.png", + "frame": { "x": 303, "y": 0, "w": 112, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 13, "w": 112, "h": 69 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0008.png", + "frame": { "x": 399, "y": 81, "w": 106, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 106, "h": 70 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0009.png", + "frame": { "x": 203, "y": 0, "w": 99, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 99, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0010.png", + "frame": { "x": 303, "y": 70, "w": 95, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 95, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0011.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 81, "w": 94, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 94, "h": 79 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0013.png", + "frame": { "x": 416, "y": 0, "w": 96, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 96, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0014.png", + "frame": { "x": 92, "y": 230, "w": 94, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 6, "w": 94, "h": 73 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0015.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0016.png", + "frame": { "x": 92, "y": 304, "w": 92, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 92, "h": 73 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0017.png", + "frame": { "x": 185, "y": 305, "w": 99, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 15, "w": 99, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 161, "w": 104, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 11, "w": 104, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0019.png", + "frame": { "x": 392, "y": 302, "w": 101, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 101, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0020.png", + "frame": { "x": 295, "y": 151, "w": 92, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 92, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0021.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0022.png", + "frame": { "x": 388, "y": 152, "w": 97, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 10, "w": 97, "h": 72 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0023.png", + "frame": { "x": 105, "y": 161, "w": 102, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 15, "w": 102, "h": 68 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0024.png", + "frame": { "x": 95, "y": 90, "w": 101, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 101, "h": 70 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0025.png", + "frame": { "x": 108, "y": 0, "w": 94, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 94, "h": 89 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 0, "w": 107, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 107, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0027.png", + "frame": { "x": 303, "y": 0, "w": 112, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 13, "w": 112, "h": 69 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0028.png", + "frame": { "x": 399, "y": 81, "w": 106, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 106, "h": 70 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0029.png", + "frame": { "x": 203, "y": 0, "w": 99, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 99, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0030.png", + "frame": { "x": 303, "y": 70, "w": 95, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 95, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0031.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 81, "w": 94, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 94, "h": 79 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0033.png", + "frame": { "x": 416, "y": 0, "w": 96, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 96, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0034.png", + "frame": { "x": 92, "y": 230, "w": 94, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 6, "w": 94, "h": 73 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0035.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0036.png", + "frame": { "x": 92, "y": 304, "w": 92, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 92, "h": 73 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0037.png", + "frame": { "x": 185, "y": 305, "w": 99, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 15, "w": 99, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0038.png", + "frame": { "x": 0, "y": 161, "w": 104, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 11, "w": 104, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0039.png", + "frame": { "x": 392, "y": 302, "w": 101, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 101, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0040.png", + "frame": { "x": 295, "y": 151, "w": 92, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 92, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0041.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0042.png", + "frame": { "x": 388, "y": 152, "w": 97, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 10, "w": 97, "h": 72 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0043.png", + "frame": { "x": 105, "y": 161, "w": 102, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 15, "w": 102, "h": 68 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0044.png", + "frame": { "x": 95, "y": 90, "w": 101, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 101, "h": 70 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0045.png", + "frame": { "x": 108, "y": 0, "w": 94, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 94, "h": 89 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0046.png", + "frame": { "x": 0, "y": 0, "w": 107, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 107, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0047.png", + "frame": { "x": 303, "y": 0, "w": 112, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 13, "w": 112, "h": 69 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0048.png", + "frame": { "x": 399, "y": 81, "w": 106, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 106, "h": 70 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0049.png", + "frame": { "x": 203, "y": 0, "w": 99, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 99, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0050.png", + "frame": { "x": 303, "y": 70, "w": 95, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 95, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0051.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0052.png", + "frame": { "x": 208, "y": 228, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0053.png", + "frame": { "x": 203, "y": 81, "w": 91, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 91, "h": 77 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 229, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0055.png", + "frame": { "x": 300, "y": 302, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 7, "w": 91, "h": 75 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0056.png", + "frame": { "x": 300, "y": 228, "w": 83, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 11, "w": 83, "h": 71 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0057.png", + "frame": { "x": 208, "y": 159, "w": 76, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 17, "w": 76, "h": 65 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0058.png", + "frame": { "x": 392, "y": 370, "w": 70, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 16, "w": 70, "h": 66 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0059.png", + "frame": { "x": 494, "y": 305, "w": 64, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 15, "w": 64, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0060.png", + "frame": { "x": 463, "y": 373, "w": 58, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 29, "y": 20, "w": 58, "h": 62 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0061.png", + "frame": { "x": 513, "y": 0, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 22, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0062.png", + "frame": { "x": 513, "y": 0, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 18, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0063.png", + "frame": { "x": 513, "y": 0, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 19, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0064.png", + "frame": { "x": 513, "y": 0, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 22, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0065.png", + "frame": { "x": 242, "y": 373, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 16, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0066.png", + "frame": { "x": 242, "y": 373, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 17, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0067.png", + "frame": { "x": 513, "y": 0, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 22, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0068.png", + "frame": { "x": 513, "y": 0, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 18, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0069.png", + "frame": { "x": 513, "y": 0, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 19, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0070.png", + "frame": { "x": 513, "y": 0, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 22, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0071.png", + "frame": { "x": 506, "y": 81, "w": 50, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 18, "w": 50, "h": 64 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0072.png", + "frame": { "x": 185, "y": 373, "w": 56, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 14, "w": 56, "h": 68 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0073.png", + "frame": { "x": 494, "y": 230, "w": 64, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 10, "w": 64, "h": 74 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0074.png", + "frame": { "x": 486, "y": 152, "w": 73, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 7, "w": 73, "h": 77 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0075.png", + "frame": { "x": 0, "y": 306, "w": 83, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 6, "w": 83, "h": 77 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0076.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0077.png", + "frame": { "x": 0, "y": 81, "w": 94, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 94, "h": 79 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0078.png", + "frame": { "x": 416, "y": 0, "w": 96, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 96, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0079.png", + "frame": { "x": 92, "y": 230, "w": 94, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 6, "w": 94, "h": 73 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0080.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0081.png", + "frame": { "x": 92, "y": 304, "w": 92, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 92, "h": 73 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0082.png", + "frame": { "x": 185, "y": 305, "w": 99, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 15, "w": 99, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0083.png", + "frame": { "x": 0, "y": 161, "w": 104, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 11, "w": 104, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0084.png", + "frame": { "x": 392, "y": 302, "w": 101, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 101, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0085.png", + "frame": { "x": 295, "y": 151, "w": 92, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 92, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0086.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "image": "563.png", + "format": "I8", + "size": { "w": 559, "h": 441 }, + "scale": "1" + } } diff --git a/public/images/pokemon/563.png b/public/images/pokemon/563.png index 7135a54ca51..2834d54535e 100644 Binary files a/public/images/pokemon/563.png and b/public/images/pokemon/563.png differ diff --git a/public/images/pokemon/636.json b/public/images/pokemon/636.json index 86c639663e9..9626c6d8263 100644 --- a/public/images/pokemon/636.json +++ b/public/images/pokemon/636.json @@ -4,744 +4,51 @@ "image": "636.png", "format": "RGBA8888", "size": { - "w": 341, - "h": 341 + "w": 301, + "h": 301 }, "scale": 1, "frames": [ - { - "filename": "0095.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 50 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 50 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 0, - "y": 50, - "w": 44, - "h": 50 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 0, - "y": 100, - "w": 44, - "h": 50 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 0, - "y": 150, - "w": 44, - "h": 50 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 0, - "y": 200, - "w": 44, - "h": 50 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 0, - "y": 250, - "w": 44, - "h": 50 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 44, - "y": 50, - "w": 44, - "h": 50 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 44, - "y": 50, - "w": 44, - "h": 50 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 45, - "y": 0, - "w": 44, - "h": 50 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 44, - "y": 100, - "w": 44, - "h": 50 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 44, - "y": 150, - "w": 44, - "h": 50 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 44, - "y": 200, - "w": 44, - "h": 50 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 44, - "y": 250, - "w": 44, - "h": 50 - } - }, { "filename": "0005.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 45, - "h": 49 + "w": 46, + "h": 48 }, "frame": { - "x": 89, - "y": 0, - "w": 45, - "h": 49 + "x": 1, + "y": 1, + "w": 46, + "h": 48 } }, { - "filename": "0020.png", + "filename": "0016.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 45, - "h": 49 + "w": 46, + "h": 48 }, "frame": { - "x": 89, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, + "x": 1, "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 89, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 89, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 134, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 134, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 134, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 134, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 179, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 179, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 179, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 179, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 224, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 224, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 224, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 224, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 269, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 89, - "y": 49, - "w": 45, - "h": 49 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 47 - }, - "frame": { - "x": 134, - "y": 49, - "w": 45, - "h": 47 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 47 - }, - "frame": { - "x": 134, - "y": 49, - "w": 45, - "h": 47 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 47 - }, - "frame": { - "x": 134, - "y": 49, - "w": 45, - "h": 47 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 47 - }, - "frame": { - "x": 134, - "y": 49, - "w": 45, - "h": 47 + "w": 46, + "h": 48 } }, { @@ -749,545 +56,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 47 - }, - "frame": { - "x": 179, - "y": 49, - "w": 45, - "h": 47 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 47 - }, - "frame": { - "x": 179, - "y": 49, - "w": 45, - "h": 47 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 47 - }, - "frame": { - "x": 179, - "y": 49, - "w": 45, - "h": 47 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 47 - }, - "frame": { - "x": 179, - "y": 49, - "w": 45, - "h": 47 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 47 - }, - "frame": { - "x": 224, - "y": 49, - "w": 45, - "h": 47 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 269, - "y": 49, - "w": 44, - "h": 50 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 134, - "y": 96, - "w": 44, - "h": 50 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 88, - "y": 98, - "w": 44, - "h": 50 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 178, - "y": 96, - "w": 44, - "h": 50 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 222, - "y": 96, - "w": 44, - "h": 50 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 266, - "y": 99, - "w": 44, - "h": 50 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 132, - "y": 146, - "w": 44, - "h": 50 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 88, - "y": 148, - "w": 44, - "h": 50 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 44, - "h": 49 + "w": 46, + "h": 48 }, "frame": { - "x": 176, - "y": 146, - "w": 44, - "h": 49 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, + "x": 1, "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 176, - "y": 146, - "w": 44, - "h": 49 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 176, - "y": 146, - "w": 44, - "h": 49 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 176, - "y": 146, - "w": 44, - "h": 49 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 220, - "y": 146, - "w": 44, - "h": 49 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 220, - "y": 146, - "w": 44, - "h": 49 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 220, - "y": 146, - "w": 44, - "h": 49 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 220, - "y": 146, - "w": 44, - "h": 49 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 264, - "y": 149, - "w": 44, - "h": 49 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 264, - "y": 149, - "w": 44, - "h": 49 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 264, - "y": 149, - "w": 44, - "h": 49 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 264, - "y": 149, - "w": 44, - "h": 49 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 176, - "y": 195, - "w": 44, - "h": 49 + "w": 46, + "h": 48 } }, { @@ -1295,82 +77,103 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 44, - "h": 49 + "w": 46, + "h": 48 }, "frame": { - "x": 176, - "y": 195, - "w": 44, - "h": 49 + "x": 1, + "y": 1, + "w": 46, + "h": 48 } }, { - "filename": "0067.png", + "filename": "0049.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 44, - "h": 49 + "w": 46, + "h": 48 }, "frame": { - "x": 176, - "y": 195, - "w": 44, - "h": 49 + "x": 1, + "y": 1, + "w": 46, + "h": 48 } }, { - "filename": "0082.png", + "filename": "0060.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 44, - "h": 49 + "w": 46, + "h": 48 }, "frame": { - "x": 176, - "y": 195, - "w": 44, - "h": 49 + "x": 1, + "y": 1, + "w": 46, + "h": 48 } }, { - "filename": "0116.png", + "filename": "0071.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 44, + "w": 46, + "h": 48 + }, + "frame": { + "x": 1, + "y": 51, + "w": 46, + "h": 48 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 45, "h": 49 }, "frame": { - "x": 132, - "y": 196, - "w": 44, + "x": 49, + "y": 1, + "w": 45, "h": 49 } }, @@ -1379,103 +182,40 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 1, - "y": 2, - "w": 44, + "y": 1, + "w": 45, "h": 48 }, "frame": { - "x": 88, - "y": 198, - "w": 44, + "x": 1, + "y": 101, + "w": 45, "h": 48 } }, { - "filename": "0033.png", + "filename": "0015.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 1, - "y": 2, - "w": 44, + "y": 1, + "w": 45, "h": 48 }, "frame": { - "x": 88, - "y": 198, - "w": 44, - "h": 48 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { "x": 1, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 88, - "y": 198, - "w": 44, - "h": 48 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { + "y": 101, "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 88, - "y": 198, - "w": 44, - "h": 48 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 220, - "y": 195, - "w": 44, "h": 48 } }, @@ -1484,40 +224,208 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 44, + "x": 1, + "y": 1, + "w": 45, "h": 48 }, "frame": { - "x": 220, - "y": 195, - "w": 44, + "x": 1, + "y": 101, + "w": 45, "h": 48 } }, { - "filename": "0055.png", + "filename": "0037.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 44, + "x": 1, + "y": 1, + "w": 45, "h": 48 }, "frame": { - "x": 220, - "y": 195, - "w": 44, + "x": 1, + "y": 101, + "w": 45, + "h": 48 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 1, + "y": 101, + "w": 45, + "h": 48 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 1, + "y": 101, + "w": 45, + "h": 48 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 96, + "y": 1, + "w": 45, + "h": 48 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 96, + "y": 1, + "w": 45, + "h": 48 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 96, + "y": 1, + "w": 45, + "h": 48 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 96, + "y": 1, + "w": 45, + "h": 48 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 96, + "y": 1, + "w": 45, + "h": 48 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 96, + "y": 1, + "w": 45, "h": 48 } }, @@ -1526,123 +434,102 @@ "rotated": false, "trimmed": true, "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, "w": 45, - "h": 50 + "h": 48 + }, + "frame": { + "x": 1, + "y": 151, + "w": 45, + "h": 48 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, - "y": 2, + "y": 0, "w": 44, - "h": 48 + "h": 49 }, "frame": { - "x": 220, - "y": 195, - "w": 44, - "h": 48 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { "x": 1, - "y": 2, + "y": 201, "w": 44, - "h": 48 - }, - "frame": { - "x": 264, - "y": 198, - "w": 44, - "h": 48 + "h": 49 } }, { - "filename": "0034.png", + "filename": "0007.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 264, - "y": 198, - "w": 44, - "h": 48 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 264, - "y": 198, - "w": 44, - "h": 48 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 264, - "y": 198, - "w": 44, - "h": 48 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, - "y": 2, + "y": 1, "w": 44, "h": 48 }, "frame": { - "x": 220, - "y": 243, + "x": 1, + "y": 252, + "w": 44, + "h": 48 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 44, + "h": 48 + }, + "frame": { + "x": 1, + "y": 252, + "w": 44, + "h": 48 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 44, + "h": 48 + }, + "frame": { + "x": 1, + "y": 252, "w": 44, "h": 48 } @@ -1652,733 +539,82 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, - "y": 2, + "y": 1, "w": 44, "h": 48 }, "frame": { - "x": 220, - "y": 243, + "x": 1, + "y": 252, "w": 44, "h": 48 } }, { - "filename": "0069.png", + "filename": "0051.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, - "y": 2, + "y": 1, "w": 44, "h": 48 }, "frame": { - "x": 220, - "y": 243, + "x": 1, + "y": 252, "w": 44, "h": 48 } }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 220, - "y": 243, - "w": 44, - "h": 48 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 176, - "y": 244, - "w": 44, - "h": 48 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 132, - "y": 245, - "w": 44, - "h": 48 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 88, - "y": 246, - "w": 44, - "h": 48 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 132, - "y": 293, - "w": 44, - "h": 47 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 132, - "y": 293, - "w": 44, - "h": 47 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 132, - "y": 293, - "w": 44, - "h": 47 - } - }, { "filename": "0062.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { - "x": 1, - "y": 3, + "x": 0, + "y": 1, "w": 44, - "h": 47 + "h": 48 }, "frame": { - "x": 132, - "y": 293, + "x": 1, + "y": 252, "w": 44, - "h": 47 + "h": 48 } }, { - "filename": "0013.png", + "filename": "0003.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 176, - "y": 292, - "w": 44, - "h": 47 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { + "y": 2, "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, "h": 47 }, "frame": { - "x": 176, - "y": 292, - "w": 44, - "h": 47 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { + "x": 49, + "y": 52, "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 176, - "y": 292, - "w": 44, - "h": 47 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 176, - "y": 292, - "w": 44, - "h": 47 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 176, - "y": 292, - "w": 44, "h": 47 } }, @@ -2387,40 +623,82 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 1, - "y": 3, - "w": 44, + "y": 2, + "w": 45, "h": 47 }, "frame": { - "x": 220, - "y": 291, - "w": 44, + "x": 49, + "y": 52, + "w": 45, "h": 47 } }, { - "filename": "0043.png", + "filename": "0025.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 1, - "y": 3, - "w": 44, + "y": 2, + "w": 45, "h": 47 }, "frame": { - "x": 220, - "y": 291, - "w": 44, + "x": 49, + "y": 52, + "w": 45, + "h": 47 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 45, + "h": 47 + }, + "frame": { + "x": 49, + "y": 52, + "w": 45, + "h": 47 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 45, + "h": 47 + }, + "frame": { + "x": 49, + "y": 52, + "w": 45, "h": 47 } }, @@ -2429,61 +707,82 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 1, - "y": 3, - "w": 44, + "y": 2, + "w": 45, "h": 47 }, "frame": { - "x": 220, - "y": 291, - "w": 44, + "x": 49, + "y": 52, + "w": 45, "h": 47 } }, { - "filename": "0087.png", + "filename": "0084.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { - "x": 1, - "y": 3, + "x": 0, + "y": 0, "w": 44, + "h": 49 + }, + "frame": { + "x": 48, + "y": 101, + "w": 44, + "h": 49 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 45, "h": 47 }, "frame": { - "x": 220, - "y": 291, - "w": 44, + "x": 96, + "y": 51, + "w": 45, "h": 47 } }, { - "filename": "0017.png", + "filename": "0021.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, + "x": 0, + "y": 2, + "w": 45, "h": 47 }, "frame": { - "x": 264, - "y": 246, - "w": 44, + "x": 96, + "y": 51, + "w": 45, "h": 47 } }, @@ -2492,83 +791,1112 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, + "x": 0, + "y": 2, + "w": 45, "h": 47 }, "frame": { - "x": 264, - "y": 246, - "w": 44, + "x": 96, + "y": 51, + "w": 45, "h": 47 } }, { - "filename": "0061.png", + "filename": "0043.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, + "x": 0, + "y": 2, + "w": 45, "h": 47 }, "frame": { - "x": 264, - "y": 246, - "w": 44, + "x": 96, + "y": 51, + "w": 45, "h": 47 } }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 45, + "h": 47 + }, + "frame": { + "x": 96, + "y": 51, + "w": 45, + "h": 47 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 45, + "h": 47 + }, + "frame": { + "x": 96, + "y": 51, + "w": 45, + "h": 47 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 143, + "y": 1, + "w": 44, + "h": 49 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 45, + "h": 47 + }, + "frame": { + "x": 189, + "y": 1, + "w": 45, + "h": 47 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 45, + "h": 47 + }, + "frame": { + "x": 236, + "y": 1, + "w": 45, + "h": 47 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 143, + "y": 52, + "w": 44, + "h": 46 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 143, + "y": 52, + "w": 44, + "h": 46 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 143, + "y": 52, + "w": 44, + "h": 46 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 143, + "y": 52, + "w": 44, + "h": 46 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 143, + "y": 52, + "w": 44, + "h": 46 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 143, + "y": 52, + "w": 44, + "h": 46 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 189, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 189, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 189, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 189, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 189, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 189, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 234, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 234, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 234, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 234, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 234, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 234, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 94, + "y": 101, + "w": 43, + "h": 49 + } + }, { "filename": "0076.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 1, - "y": 3, - "w": 44, - "h": 47 + "y": 0, + "w": 43, + "h": 49 }, "frame": { - "x": 264, - "y": 246, - "w": 44, - "h": 47 + "x": 139, + "y": 100, + "w": 43, + "h": 49 } }, { - "filename": "0091.png", + "filename": "0077.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 1, - "y": 3, - "w": 44, - "h": 47 + "y": 0, + "w": 43, + "h": 49 }, "frame": { - "x": 264, - "y": 293, - "w": 44, - "h": 47 + "x": 184, + "y": 100, + "w": 43, + "h": 49 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 229, + "y": 100, + "w": 43, + "h": 49 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 94, + "y": 152, + "w": 43, + "h": 49 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 139, + "y": 151, + "w": 43, + "h": 49 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 184, + "y": 151, + "w": 43, + "h": 49 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 229, + "y": 151, + "w": 43, + "h": 49 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 42, + "h": 49 + }, + "frame": { + "x": 47, + "y": 201, + "w": 42, + "h": 49 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 47, + "y": 252, + "w": 43, + "h": 48 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 139, + "y": 202, + "w": 43, + "h": 49 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 184, + "y": 202, + "w": 43, + "h": 49 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 229, + "y": 202, + "w": 43, + "h": 49 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 92, + "y": 203, + "w": 43, + "h": 48 } } ] @@ -2577,6 +1905,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:d74d016320d4e69be41021af2e23899d:84d9208986a6ccae41903e4853367cb7:1d471fa25be339df4c4184625fad00b3$" + "smartupdate": "$TexturePacker:SmartUpdate:a44c0ac06d9b3f225bf4ca6ae3326041:93ae31dcf0673c1e0be8d6dfea13f44f:1d471fa25be339df4c4184625fad00b3$" } } diff --git a/public/images/pokemon/636.png b/public/images/pokemon/636.png index e3780aaab83..24b296bcb9d 100644 Binary files a/public/images/pokemon/636.png and b/public/images/pokemon/636.png differ diff --git a/public/images/pokemon/802-zenith.png b/public/images/pokemon/802-zenith.png index b6db4621a0b..17d2831a50c 100644 Binary files a/public/images/pokemon/802-zenith.png and b/public/images/pokemon/802-zenith.png differ diff --git a/public/images/pokemon/back/186.json b/public/images/pokemon/back/186.json index 692fa44fcb4..cc95a3819ea 100644 --- a/public/images/pokemon/back/186.json +++ b/public/images/pokemon/back/186.json @@ -1,2036 +1,712 @@ { - "textures": [ - { - "image": "186.png", - "format": "RGBA8888", - "size": { - "w": 329, - "h": 329 - }, - "scale": 1, - "frames": [ - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 75 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 75 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 71 - }, - "frame": { - "x": 0, - "y": 75, - "w": 40, - "h": 71 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 71 - }, - "frame": { - "x": 0, - "y": 75, - "w": 40, - "h": 71 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 40, - "h": 71 - }, - "frame": { - "x": 43, - "y": 0, - "w": 40, - "h": 71 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 40, - "h": 71 - }, - "frame": { - "x": 43, - "y": 0, - "w": 40, - "h": 71 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 43, - "h": 66 - }, - "frame": { - "x": 83, - "y": 0, - "w": 43, - "h": 66 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 43, - "h": 66 - }, - "frame": { - "x": 83, - "y": 0, - "w": 43, - "h": 66 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 43, - "h": 66 - }, - "frame": { - "x": 83, - "y": 0, - "w": 43, - "h": 66 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 69 - }, - "frame": { - "x": 0, - "y": 146, - "w": 40, - "h": 69 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 68 - }, - "frame": { - "x": 0, - "y": 215, - "w": 40, - "h": 68 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 68 - }, - "frame": { - "x": 0, - "y": 215, - "w": 40, - "h": 68 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 68 - }, - "frame": { - "x": 0, - "y": 215, - "w": 40, - "h": 68 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 64 - }, - "frame": { - "x": 126, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 64 - }, - "frame": { - "x": 126, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 64 - }, - "frame": { - "x": 166, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 64 - }, - "frame": { - "x": 166, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 64 - }, - "frame": { - "x": 166, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 63 - }, - "frame": { - "x": 206, - "y": 0, - "w": 40, - "h": 63 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 63 - }, - "frame": { - "x": 206, - "y": 0, - "w": 40, - "h": 63 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 63 - }, - "frame": { - "x": 206, - "y": 0, - "w": 40, - "h": 63 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 41, - "h": 62 - }, - "frame": { - "x": 246, - "y": 0, - "w": 41, - "h": 62 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 41, - "h": 62 - }, - "frame": { - "x": 246, - "y": 0, - "w": 41, - "h": 62 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 24, - "w": 42, - "h": 55 - }, - "frame": { - "x": 287, - "y": 0, - "w": 42, - "h": 55 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 24, - "w": 42, - "h": 55 - }, - "frame": { - "x": 287, - "y": 0, - "w": 42, - "h": 55 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 24, - "w": 42, - "h": 55 - }, - "frame": { - "x": 287, - "y": 0, - "w": 42, - "h": 55 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 24, - "w": 42, - "h": 55 - }, - "frame": { - "x": 287, - "y": 0, - "w": 42, - "h": 55 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 43, - "h": 45 - }, - "frame": { - "x": 0, - "y": 283, - "w": 43, - "h": 45 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 40, - "h": 59 - }, - "frame": { - "x": 40, - "y": 75, - "w": 40, - "h": 59 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 40, - "h": 59 - }, - "frame": { - "x": 40, - "y": 75, - "w": 40, - "h": 59 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 43, - "h": 59 - }, - "frame": { - "x": 40, - "y": 134, - "w": 43, - "h": 59 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 43, - "h": 59 - }, - "frame": { - "x": 40, - "y": 134, - "w": 43, - "h": 59 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 40, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 40, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 40, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 40, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 43, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 43, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 43, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 43, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 81, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 84, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 84, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 80, - "y": 71, - "w": 41, - "h": 56 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 80, - "y": 71, - "w": 41, - "h": 56 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 83, - "y": 127, - "w": 41, - "h": 56 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 83, - "y": 127, - "w": 41, - "h": 56 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 83, - "y": 127, - "w": 41, - "h": 56 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 56 - }, - "frame": { - "x": 121, - "y": 66, - "w": 40, - "h": 56 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 56 - }, - "frame": { - "x": 121, - "y": 66, - "w": 40, - "h": 56 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 56 - }, - "frame": { - "x": 121, - "y": 66, - "w": 40, - "h": 56 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 161, - "y": 64, - "w": 41, - "h": 56 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 22, - "w": 40, - "h": 56 - }, - "frame": { - "x": 124, - "y": 122, - "w": 40, - "h": 56 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 56 - }, - "frame": { - "x": 164, - "y": 120, - "w": 40, - "h": 56 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 56 - }, - "frame": { - "x": 202, - "y": 64, - "w": 40, - "h": 56 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 204, - "y": 120, - "w": 41, - "h": 56 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 204, - "y": 120, - "w": 41, - "h": 56 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 242, - "y": 63, - "w": 41, - "h": 56 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 242, - "y": 63, - "w": 41, - "h": 56 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 55 - }, - "frame": { - "x": 245, - "y": 119, - "w": 40, - "h": 55 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 55 - }, - "frame": { - "x": 245, - "y": 119, - "w": 40, - "h": 55 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 283, - "y": 62, - "w": 43, - "h": 53 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 283, - "y": 62, - "w": 43, - "h": 53 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 283, - "y": 62, - "w": 43, - "h": 53 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 283, - "y": 62, - "w": 43, - "h": 53 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 285, - "y": 115, - "w": 43, - "h": 53 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 285, - "y": 115, - "w": 43, - "h": 53 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 285, - "y": 115, - "w": 43, - "h": 53 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 285, - "y": 115, - "w": 43, - "h": 53 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 168, - "w": 43, - "h": 52 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 168, - "w": 43, - "h": 52 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 245, - "y": 174, - "w": 40, - "h": 52 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 245, - "y": 174, - "w": 40, - "h": 52 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 220, - "w": 43, - "h": 52 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 220, - "w": 43, - "h": 52 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 220, - "w": 43, - "h": 52 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 124, - "y": 178, - "w": 41, - "h": 51 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 124, - "y": 178, - "w": 41, - "h": 51 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 43, - "h": 52 - }, - "frame": { - "x": 165, - "y": 176, - "w": 43, - "h": 52 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 43, - "h": 52 - }, - "frame": { - "x": 165, - "y": 176, - "w": 43, - "h": 52 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 43, - "h": 52 - }, - "frame": { - "x": 165, - "y": 176, - "w": 43, - "h": 52 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 43, - "h": 52 - }, - "frame": { - "x": 165, - "y": 176, - "w": 43, - "h": 52 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 125, - "y": 229, - "w": 40, - "h": 52 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 125, - "y": 229, - "w": 40, - "h": 52 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 125, - "y": 229, - "w": 40, - "h": 52 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 43, - "h": 51 - }, - "frame": { - "x": 165, - "y": 228, - "w": 43, - "h": 51 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 43, - "h": 51 - }, - "frame": { - "x": 165, - "y": 228, - "w": 43, - "h": 51 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 41, - "h": 47 - }, - "frame": { - "x": 125, - "y": 281, - "w": 41, - "h": 47 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 41, - "h": 47 - }, - "frame": { - "x": 125, - "y": 281, - "w": 41, - "h": 47 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 40, - "h": 47 - }, - "frame": { - "x": 166, - "y": 279, - "w": 40, - "h": 47 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 40, - "h": 47 - }, - "frame": { - "x": 166, - "y": 279, - "w": 40, - "h": 47 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 40, - "h": 47 - }, - "frame": { - "x": 166, - "y": 279, - "w": 40, - "h": 47 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 208, - "y": 226, - "w": 41, - "h": 51 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 208, - "y": 226, - "w": 41, - "h": 51 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 208, - "y": 226, - "w": 41, - "h": 51 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 208, - "y": 277, - "w": 40, - "h": 52 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 40, - "h": 51 - }, - "frame": { - "x": 248, - "y": 277, - "w": 40, - "h": 51 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:569ea621d956c206da79e28dfe2f2447:f1450a5308004ae8dfd8b74920b34436:2e42f825bd325ece9bcbe5d573264582$" - } -} + "textures":[ + { + "image": "186.png", + "format": "RGBA8888", + "size": { "w": 164, "h": 264 }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 76, "y": 53, "w": 39, "h": 57 } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 76, "y": 53, "w": 39, "h": 57 } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 22, "w": 39, "h": 56 }, + "frame": { "x": 115, "y": 57, "w": 39, "h": 56 } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 22, "w": 39, "h": 56 }, + "frame": { "x": 115, "y": 57, "w": 39, "h": 56 } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 24, "w": 40, "h": 54 }, + "frame": { "x": 81, "y": 113, "w": 40, "h": 54 } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 24, "w": 40, "h": 54 }, + "frame": { "x": 81, "y": 113, "w": 40, "h": 54 } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 25, "w": 42, "h": 53 }, + "frame": { "x": 76, "y": 0, "w": 42, "h": 53 } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 25, "w": 42, "h": 53 }, + "frame": { "x": 76, "y": 0, "w": 42, "h": 53 } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 26, "w": 42, "h": 52 }, + "frame": { "x": 0, "y": 70, "w": 42, "h": 52 } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 26, "w": 42, "h": 52 }, + "frame": { "x": 0, "y": 70, "w": 42, "h": 52 } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 0, "y": 122, "w": 42, "h": 51 } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 0, "y": 122, "w": 42, "h": 51 } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 42, "y": 167, "w": 42, "h": 51 } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 42, "y": 167, "w": 42, "h": 51 } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 0, "y": 122, "w": 42, "h": 51 } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 0, "y": 122, "w": 42, "h": 51 } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 26, "w": 42, "h": 52 }, + "frame": { "x": 0, "y": 70, "w": 42, "h": 52 } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 26, "w": 42, "h": 52 }, + "frame": { "x": 0, "y": 70, "w": 42, "h": 52 } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 25, "w": 42, "h": 53 }, + "frame": { "x": 76, "y": 0, "w": 42, "h": 53 } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 25, "w": 42, "h": 53 }, + "frame": { "x": 76, "y": 0, "w": 42, "h": 53 } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 24, "w": 40, "h": 54 }, + "frame": { "x": 81, "y": 113, "w": 40, "h": 54 } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 24, "w": 40, "h": 54 }, + "frame": { "x": 81, "y": 113, "w": 40, "h": 54 } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 22, "w": 39, "h": 56 }, + "frame": { "x": 42, "y": 110, "w": 39, "h": 56 } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 22, "w": 39, "h": 56 }, + "frame": { "x": 42, "y": 110, "w": 39, "h": 56 } + } + ] + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64" + } +} \ No newline at end of file diff --git a/public/images/pokemon/back/186.png b/public/images/pokemon/back/186.png index 1192a7efe20..e6af67d75fa 100644 Binary files a/public/images/pokemon/back/186.png and b/public/images/pokemon/back/186.png differ diff --git a/public/images/pokemon/back/700.png b/public/images/pokemon/back/700.png index cfd4063921b..229c786c67e 100644 Binary files a/public/images/pokemon/back/700.png and b/public/images/pokemon/back/700.png differ diff --git a/public/images/pokemon/back/802-zenith.png b/public/images/pokemon/back/802-zenith.png index 4158e0c1ed2..e38e295be75 100644 Binary files a/public/images/pokemon/back/802-zenith.png and b/public/images/pokemon/back/802-zenith.png differ diff --git a/public/images/pokemon/back/female/186.json b/public/images/pokemon/back/female/186.json index e7fb46aacbb..cc95a3819ea 100644 --- a/public/images/pokemon/back/female/186.json +++ b/public/images/pokemon/back/female/186.json @@ -1,2036 +1,712 @@ { - "textures": [ - { - "image": "186.png", - "format": "RGBA8888", - "size": { - "w": 329, - "h": 329 - }, - "scale": 1, - "frames": [ - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 75 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 75 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 71 - }, - "frame": { - "x": 0, - "y": 75, - "w": 40, - "h": 71 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 71 - }, - "frame": { - "x": 0, - "y": 75, - "w": 40, - "h": 71 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 40, - "h": 71 - }, - "frame": { - "x": 43, - "y": 0, - "w": 40, - "h": 71 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 40, - "h": 71 - }, - "frame": { - "x": 43, - "y": 0, - "w": 40, - "h": 71 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 43, - "h": 66 - }, - "frame": { - "x": 83, - "y": 0, - "w": 43, - "h": 66 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 43, - "h": 66 - }, - "frame": { - "x": 83, - "y": 0, - "w": 43, - "h": 66 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 43, - "h": 66 - }, - "frame": { - "x": 83, - "y": 0, - "w": 43, - "h": 66 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 69 - }, - "frame": { - "x": 0, - "y": 146, - "w": 40, - "h": 69 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 68 - }, - "frame": { - "x": 0, - "y": 215, - "w": 40, - "h": 68 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 68 - }, - "frame": { - "x": 0, - "y": 215, - "w": 40, - "h": 68 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 68 - }, - "frame": { - "x": 0, - "y": 215, - "w": 40, - "h": 68 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 64 - }, - "frame": { - "x": 126, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 64 - }, - "frame": { - "x": 126, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 64 - }, - "frame": { - "x": 166, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 64 - }, - "frame": { - "x": 166, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 64 - }, - "frame": { - "x": 166, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 63 - }, - "frame": { - "x": 206, - "y": 0, - "w": 40, - "h": 63 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 63 - }, - "frame": { - "x": 206, - "y": 0, - "w": 40, - "h": 63 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 63 - }, - "frame": { - "x": 206, - "y": 0, - "w": 40, - "h": 63 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 41, - "h": 62 - }, - "frame": { - "x": 246, - "y": 0, - "w": 41, - "h": 62 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 41, - "h": 62 - }, - "frame": { - "x": 246, - "y": 0, - "w": 41, - "h": 62 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 24, - "w": 42, - "h": 55 - }, - "frame": { - "x": 287, - "y": 0, - "w": 42, - "h": 55 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 24, - "w": 42, - "h": 55 - }, - "frame": { - "x": 287, - "y": 0, - "w": 42, - "h": 55 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 24, - "w": 42, - "h": 55 - }, - "frame": { - "x": 287, - "y": 0, - "w": 42, - "h": 55 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 24, - "w": 42, - "h": 55 - }, - "frame": { - "x": 287, - "y": 0, - "w": 42, - "h": 55 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 43, - "h": 45 - }, - "frame": { - "x": 0, - "y": 283, - "w": 43, - "h": 45 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 40, - "h": 59 - }, - "frame": { - "x": 40, - "y": 75, - "w": 40, - "h": 59 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 40, - "h": 59 - }, - "frame": { - "x": 40, - "y": 75, - "w": 40, - "h": 59 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 43, - "h": 59 - }, - "frame": { - "x": 40, - "y": 134, - "w": 43, - "h": 59 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 43, - "h": 59 - }, - "frame": { - "x": 40, - "y": 134, - "w": 43, - "h": 59 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 40, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 40, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 40, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 40, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 43, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 43, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 43, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 43, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 81, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 84, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 84, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 80, - "y": 71, - "w": 41, - "h": 56 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 80, - "y": 71, - "w": 41, - "h": 56 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 83, - "y": 127, - "w": 41, - "h": 56 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 83, - "y": 127, - "w": 41, - "h": 56 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 83, - "y": 127, - "w": 41, - "h": 56 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 56 - }, - "frame": { - "x": 121, - "y": 66, - "w": 40, - "h": 56 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 56 - }, - "frame": { - "x": 121, - "y": 66, - "w": 40, - "h": 56 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 56 - }, - "frame": { - "x": 121, - "y": 66, - "w": 40, - "h": 56 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 161, - "y": 64, - "w": 41, - "h": 56 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 22, - "w": 40, - "h": 56 - }, - "frame": { - "x": 124, - "y": 122, - "w": 40, - "h": 56 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 56 - }, - "frame": { - "x": 164, - "y": 120, - "w": 40, - "h": 56 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 56 - }, - "frame": { - "x": 202, - "y": 64, - "w": 40, - "h": 56 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 204, - "y": 120, - "w": 41, - "h": 56 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 204, - "y": 120, - "w": 41, - "h": 56 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 242, - "y": 63, - "w": 41, - "h": 56 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 242, - "y": 63, - "w": 41, - "h": 56 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 55 - }, - "frame": { - "x": 245, - "y": 119, - "w": 40, - "h": 55 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 55 - }, - "frame": { - "x": 245, - "y": 119, - "w": 40, - "h": 55 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 283, - "y": 62, - "w": 43, - "h": 53 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 283, - "y": 62, - "w": 43, - "h": 53 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 283, - "y": 62, - "w": 43, - "h": 53 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 283, - "y": 62, - "w": 43, - "h": 53 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 285, - "y": 115, - "w": 43, - "h": 53 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 285, - "y": 115, - "w": 43, - "h": 53 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 285, - "y": 115, - "w": 43, - "h": 53 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 285, - "y": 115, - "w": 43, - "h": 53 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 168, - "w": 43, - "h": 52 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 168, - "w": 43, - "h": 52 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 245, - "y": 174, - "w": 40, - "h": 52 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 245, - "y": 174, - "w": 40, - "h": 52 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 220, - "w": 43, - "h": 52 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 220, - "w": 43, - "h": 52 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 220, - "w": 43, - "h": 52 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 124, - "y": 178, - "w": 41, - "h": 51 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 124, - "y": 178, - "w": 41, - "h": 51 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 43, - "h": 52 - }, - "frame": { - "x": 165, - "y": 176, - "w": 43, - "h": 52 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 43, - "h": 52 - }, - "frame": { - "x": 165, - "y": 176, - "w": 43, - "h": 52 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 43, - "h": 52 - }, - "frame": { - "x": 165, - "y": 176, - "w": 43, - "h": 52 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 43, - "h": 52 - }, - "frame": { - "x": 165, - "y": 176, - "w": 43, - "h": 52 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 125, - "y": 229, - "w": 40, - "h": 52 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 125, - "y": 229, - "w": 40, - "h": 52 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 125, - "y": 229, - "w": 40, - "h": 52 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 43, - "h": 51 - }, - "frame": { - "x": 165, - "y": 228, - "w": 43, - "h": 51 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 43, - "h": 51 - }, - "frame": { - "x": 165, - "y": 228, - "w": 43, - "h": 51 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 41, - "h": 47 - }, - "frame": { - "x": 125, - "y": 281, - "w": 41, - "h": 47 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 41, - "h": 47 - }, - "frame": { - "x": 125, - "y": 281, - "w": 41, - "h": 47 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 40, - "h": 47 - }, - "frame": { - "x": 166, - "y": 279, - "w": 40, - "h": 47 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 40, - "h": 47 - }, - "frame": { - "x": 166, - "y": 279, - "w": 40, - "h": 47 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 40, - "h": 47 - }, - "frame": { - "x": 166, - "y": 279, - "w": 40, - "h": 47 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 208, - "y": 226, - "w": 41, - "h": 51 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 208, - "y": 226, - "w": 41, - "h": 51 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 208, - "y": 226, - "w": 41, - "h": 51 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 208, - "y": 277, - "w": 40, - "h": 52 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 40, - "h": 51 - }, - "frame": { - "x": 248, - "y": 277, - "w": 40, - "h": 51 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e783e29253c9ef760ff5a12ced054a0f:ee321b7b0e31ea09eef99c67e0124e50:2e42f825bd325ece9bcbe5d573264582$" - } -} + "textures":[ + { + "image": "186.png", + "format": "RGBA8888", + "size": { "w": 164, "h": 264 }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 76, "y": 53, "w": 39, "h": 57 } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 76, "y": 53, "w": 39, "h": 57 } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 22, "w": 39, "h": 56 }, + "frame": { "x": 115, "y": 57, "w": 39, "h": 56 } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 22, "w": 39, "h": 56 }, + "frame": { "x": 115, "y": 57, "w": 39, "h": 56 } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 24, "w": 40, "h": 54 }, + "frame": { "x": 81, "y": 113, "w": 40, "h": 54 } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 24, "w": 40, "h": 54 }, + "frame": { "x": 81, "y": 113, "w": 40, "h": 54 } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 25, "w": 42, "h": 53 }, + "frame": { "x": 76, "y": 0, "w": 42, "h": 53 } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 25, "w": 42, "h": 53 }, + "frame": { "x": 76, "y": 0, "w": 42, "h": 53 } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 26, "w": 42, "h": 52 }, + "frame": { "x": 0, "y": 70, "w": 42, "h": 52 } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 26, "w": 42, "h": 52 }, + "frame": { "x": 0, "y": 70, "w": 42, "h": 52 } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 0, "y": 122, "w": 42, "h": 51 } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 0, "y": 122, "w": 42, "h": 51 } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 42, "y": 167, "w": 42, "h": 51 } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 42, "y": 167, "w": 42, "h": 51 } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 0, "y": 122, "w": 42, "h": 51 } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 0, "y": 122, "w": 42, "h": 51 } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 26, "w": 42, "h": 52 }, + "frame": { "x": 0, "y": 70, "w": 42, "h": 52 } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 26, "w": 42, "h": 52 }, + "frame": { "x": 0, "y": 70, "w": 42, "h": 52 } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 25, "w": 42, "h": 53 }, + "frame": { "x": 76, "y": 0, "w": 42, "h": 53 } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 25, "w": 42, "h": 53 }, + "frame": { "x": 76, "y": 0, "w": 42, "h": 53 } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 24, "w": 40, "h": 54 }, + "frame": { "x": 81, "y": 113, "w": 40, "h": 54 } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 24, "w": 40, "h": 54 }, + "frame": { "x": 81, "y": 113, "w": 40, "h": 54 } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 22, "w": 39, "h": 56 }, + "frame": { "x": 42, "y": 110, "w": 39, "h": 56 } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 22, "w": 39, "h": 56 }, + "frame": { "x": 42, "y": 110, "w": 39, "h": 56 } + } + ] + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64" + } +} \ No newline at end of file diff --git a/public/images/pokemon/back/female/186.png b/public/images/pokemon/back/female/186.png index 22437991c8f..2156157cf8d 100644 Binary files a/public/images/pokemon/back/female/186.png and b/public/images/pokemon/back/female/186.png differ diff --git a/public/images/pokemon/back/shiny/186.json b/public/images/pokemon/back/shiny/186.json index 2c92bca3f25..cc95a3819ea 100644 --- a/public/images/pokemon/back/shiny/186.json +++ b/public/images/pokemon/back/shiny/186.json @@ -1,2036 +1,712 @@ { - "textures": [ - { - "image": "186.png", - "format": "RGBA8888", - "size": { - "w": 329, - "h": 329 - }, - "scale": 1, - "frames": [ - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 75 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 75 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 71 - }, - "frame": { - "x": 0, - "y": 75, - "w": 40, - "h": 71 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 71 - }, - "frame": { - "x": 0, - "y": 75, - "w": 40, - "h": 71 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 40, - "h": 71 - }, - "frame": { - "x": 43, - "y": 0, - "w": 40, - "h": 71 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 40, - "h": 71 - }, - "frame": { - "x": 43, - "y": 0, - "w": 40, - "h": 71 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 43, - "h": 66 - }, - "frame": { - "x": 83, - "y": 0, - "w": 43, - "h": 66 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 43, - "h": 66 - }, - "frame": { - "x": 83, - "y": 0, - "w": 43, - "h": 66 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 43, - "h": 66 - }, - "frame": { - "x": 83, - "y": 0, - "w": 43, - "h": 66 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 69 - }, - "frame": { - "x": 0, - "y": 146, - "w": 40, - "h": 69 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 68 - }, - "frame": { - "x": 0, - "y": 215, - "w": 40, - "h": 68 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 68 - }, - "frame": { - "x": 0, - "y": 215, - "w": 40, - "h": 68 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 68 - }, - "frame": { - "x": 0, - "y": 215, - "w": 40, - "h": 68 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 64 - }, - "frame": { - "x": 126, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 64 - }, - "frame": { - "x": 126, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 64 - }, - "frame": { - "x": 166, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 64 - }, - "frame": { - "x": 166, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 64 - }, - "frame": { - "x": 166, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 63 - }, - "frame": { - "x": 206, - "y": 0, - "w": 40, - "h": 63 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 63 - }, - "frame": { - "x": 206, - "y": 0, - "w": 40, - "h": 63 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 63 - }, - "frame": { - "x": 206, - "y": 0, - "w": 40, - "h": 63 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 41, - "h": 62 - }, - "frame": { - "x": 246, - "y": 0, - "w": 41, - "h": 62 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 41, - "h": 62 - }, - "frame": { - "x": 246, - "y": 0, - "w": 41, - "h": 62 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 24, - "w": 42, - "h": 55 - }, - "frame": { - "x": 287, - "y": 0, - "w": 42, - "h": 55 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 24, - "w": 42, - "h": 55 - }, - "frame": { - "x": 287, - "y": 0, - "w": 42, - "h": 55 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 24, - "w": 42, - "h": 55 - }, - "frame": { - "x": 287, - "y": 0, - "w": 42, - "h": 55 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 24, - "w": 42, - "h": 55 - }, - "frame": { - "x": 287, - "y": 0, - "w": 42, - "h": 55 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 43, - "h": 45 - }, - "frame": { - "x": 0, - "y": 283, - "w": 43, - "h": 45 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 40, - "h": 59 - }, - "frame": { - "x": 40, - "y": 75, - "w": 40, - "h": 59 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 40, - "h": 59 - }, - "frame": { - "x": 40, - "y": 75, - "w": 40, - "h": 59 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 43, - "h": 59 - }, - "frame": { - "x": 40, - "y": 134, - "w": 43, - "h": 59 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 43, - "h": 59 - }, - "frame": { - "x": 40, - "y": 134, - "w": 43, - "h": 59 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 40, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 40, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 40, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 40, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 43, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 43, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 43, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 43, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 81, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 84, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 84, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 80, - "y": 71, - "w": 41, - "h": 56 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 80, - "y": 71, - "w": 41, - "h": 56 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 83, - "y": 127, - "w": 41, - "h": 56 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 83, - "y": 127, - "w": 41, - "h": 56 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 83, - "y": 127, - "w": 41, - "h": 56 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 56 - }, - "frame": { - "x": 121, - "y": 66, - "w": 40, - "h": 56 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 56 - }, - "frame": { - "x": 121, - "y": 66, - "w": 40, - "h": 56 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 56 - }, - "frame": { - "x": 121, - "y": 66, - "w": 40, - "h": 56 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 161, - "y": 64, - "w": 41, - "h": 56 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 22, - "w": 40, - "h": 56 - }, - "frame": { - "x": 124, - "y": 122, - "w": 40, - "h": 56 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 56 - }, - "frame": { - "x": 164, - "y": 120, - "w": 40, - "h": 56 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 56 - }, - "frame": { - "x": 202, - "y": 64, - "w": 40, - "h": 56 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 204, - "y": 120, - "w": 41, - "h": 56 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 204, - "y": 120, - "w": 41, - "h": 56 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 242, - "y": 63, - "w": 41, - "h": 56 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 242, - "y": 63, - "w": 41, - "h": 56 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 55 - }, - "frame": { - "x": 245, - "y": 119, - "w": 40, - "h": 55 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 55 - }, - "frame": { - "x": 245, - "y": 119, - "w": 40, - "h": 55 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 283, - "y": 62, - "w": 43, - "h": 53 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 283, - "y": 62, - "w": 43, - "h": 53 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 283, - "y": 62, - "w": 43, - "h": 53 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 283, - "y": 62, - "w": 43, - "h": 53 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 285, - "y": 115, - "w": 43, - "h": 53 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 285, - "y": 115, - "w": 43, - "h": 53 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 285, - "y": 115, - "w": 43, - "h": 53 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 285, - "y": 115, - "w": 43, - "h": 53 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 168, - "w": 43, - "h": 52 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 168, - "w": 43, - "h": 52 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 245, - "y": 174, - "w": 40, - "h": 52 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 245, - "y": 174, - "w": 40, - "h": 52 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 220, - "w": 43, - "h": 52 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 220, - "w": 43, - "h": 52 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 220, - "w": 43, - "h": 52 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 124, - "y": 178, - "w": 41, - "h": 51 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 124, - "y": 178, - "w": 41, - "h": 51 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 43, - "h": 52 - }, - "frame": { - "x": 165, - "y": 176, - "w": 43, - "h": 52 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 43, - "h": 52 - }, - "frame": { - "x": 165, - "y": 176, - "w": 43, - "h": 52 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 43, - "h": 52 - }, - "frame": { - "x": 165, - "y": 176, - "w": 43, - "h": 52 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 43, - "h": 52 - }, - "frame": { - "x": 165, - "y": 176, - "w": 43, - "h": 52 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 125, - "y": 229, - "w": 40, - "h": 52 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 125, - "y": 229, - "w": 40, - "h": 52 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 125, - "y": 229, - "w": 40, - "h": 52 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 43, - "h": 51 - }, - "frame": { - "x": 165, - "y": 228, - "w": 43, - "h": 51 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 43, - "h": 51 - }, - "frame": { - "x": 165, - "y": 228, - "w": 43, - "h": 51 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 41, - "h": 47 - }, - "frame": { - "x": 125, - "y": 281, - "w": 41, - "h": 47 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 41, - "h": 47 - }, - "frame": { - "x": 125, - "y": 281, - "w": 41, - "h": 47 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 40, - "h": 47 - }, - "frame": { - "x": 166, - "y": 279, - "w": 40, - "h": 47 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 40, - "h": 47 - }, - "frame": { - "x": 166, - "y": 279, - "w": 40, - "h": 47 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 40, - "h": 47 - }, - "frame": { - "x": 166, - "y": 279, - "w": 40, - "h": 47 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 208, - "y": 226, - "w": 41, - "h": 51 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 208, - "y": 226, - "w": 41, - "h": 51 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 208, - "y": 226, - "w": 41, - "h": 51 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 208, - "y": 277, - "w": 40, - "h": 52 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 40, - "h": 51 - }, - "frame": { - "x": 248, - "y": 277, - "w": 40, - "h": 51 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b0fe8f842c4145dc8b788d0827cf5633:3022c0d409f271d6c7f77fb00af76bd8:2e42f825bd325ece9bcbe5d573264582$" - } -} + "textures":[ + { + "image": "186.png", + "format": "RGBA8888", + "size": { "w": 164, "h": 264 }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 76, "y": 53, "w": 39, "h": 57 } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 76, "y": 53, "w": 39, "h": 57 } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 22, "w": 39, "h": 56 }, + "frame": { "x": 115, "y": 57, "w": 39, "h": 56 } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 22, "w": 39, "h": 56 }, + "frame": { "x": 115, "y": 57, "w": 39, "h": 56 } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 24, "w": 40, "h": 54 }, + "frame": { "x": 81, "y": 113, "w": 40, "h": 54 } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 24, "w": 40, "h": 54 }, + "frame": { "x": 81, "y": 113, "w": 40, "h": 54 } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 25, "w": 42, "h": 53 }, + "frame": { "x": 76, "y": 0, "w": 42, "h": 53 } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 25, "w": 42, "h": 53 }, + "frame": { "x": 76, "y": 0, "w": 42, "h": 53 } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 26, "w": 42, "h": 52 }, + "frame": { "x": 0, "y": 70, "w": 42, "h": 52 } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 26, "w": 42, "h": 52 }, + "frame": { "x": 0, "y": 70, "w": 42, "h": 52 } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 0, "y": 122, "w": 42, "h": 51 } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 0, "y": 122, "w": 42, "h": 51 } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 42, "y": 167, "w": 42, "h": 51 } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 42, "y": 167, "w": 42, "h": 51 } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 0, "y": 122, "w": 42, "h": 51 } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 0, "y": 122, "w": 42, "h": 51 } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 26, "w": 42, "h": 52 }, + "frame": { "x": 0, "y": 70, "w": 42, "h": 52 } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 26, "w": 42, "h": 52 }, + "frame": { "x": 0, "y": 70, "w": 42, "h": 52 } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 25, "w": 42, "h": 53 }, + "frame": { "x": 76, "y": 0, "w": 42, "h": 53 } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 25, "w": 42, "h": 53 }, + "frame": { "x": 76, "y": 0, "w": 42, "h": 53 } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 24, "w": 40, "h": 54 }, + "frame": { "x": 81, "y": 113, "w": 40, "h": 54 } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 24, "w": 40, "h": 54 }, + "frame": { "x": 81, "y": 113, "w": 40, "h": 54 } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 22, "w": 39, "h": 56 }, + "frame": { "x": 42, "y": 110, "w": 39, "h": 56 } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 22, "w": 39, "h": 56 }, + "frame": { "x": 42, "y": 110, "w": 39, "h": 56 } + } + ] + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64" + } +} \ No newline at end of file diff --git a/public/images/pokemon/back/shiny/186.png b/public/images/pokemon/back/shiny/186.png index 8c49b0ea7d6..336c3727346 100644 Binary files a/public/images/pokemon/back/shiny/186.png and b/public/images/pokemon/back/shiny/186.png differ diff --git a/public/images/pokemon/back/shiny/715.png b/public/images/pokemon/back/shiny/715.png index e71e12f7445..dfd07126e59 100644 Binary files a/public/images/pokemon/back/shiny/715.png and b/public/images/pokemon/back/shiny/715.png differ diff --git a/public/images/pokemon/back/shiny/802-zenith.png b/public/images/pokemon/back/shiny/802-zenith.png index 4158e0c1ed2..8e71dd7c762 100644 Binary files a/public/images/pokemon/back/shiny/802-zenith.png and b/public/images/pokemon/back/shiny/802-zenith.png differ diff --git a/public/images/pokemon/back/shiny/982-three-segment.png b/public/images/pokemon/back/shiny/982-three-segment.png index 13d150bcdc7..11f855f9366 100644 Binary files a/public/images/pokemon/back/shiny/982-three-segment.png and b/public/images/pokemon/back/shiny/982-three-segment.png differ diff --git a/public/images/pokemon/back/shiny/982.png b/public/images/pokemon/back/shiny/982.png index df537fd151c..3f72e2a644f 100644 Binary files a/public/images/pokemon/back/shiny/982.png and b/public/images/pokemon/back/shiny/982.png differ diff --git a/public/images/pokemon/back/shiny/female/186.json b/public/images/pokemon/back/shiny/female/186.json index 04476516116..cc95a3819ea 100644 --- a/public/images/pokemon/back/shiny/female/186.json +++ b/public/images/pokemon/back/shiny/female/186.json @@ -1,2036 +1,712 @@ { - "textures": [ - { - "image": "186.png", - "format": "RGBA8888", - "size": { - "w": 329, - "h": 329 - }, - "scale": 1, - "frames": [ - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 43, - "h": 75 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 75 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 71 - }, - "frame": { - "x": 0, - "y": 75, - "w": 40, - "h": 71 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 71 - }, - "frame": { - "x": 0, - "y": 75, - "w": 40, - "h": 71 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 40, - "h": 71 - }, - "frame": { - "x": 43, - "y": 0, - "w": 40, - "h": 71 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 40, - "h": 71 - }, - "frame": { - "x": 43, - "y": 0, - "w": 40, - "h": 71 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 43, - "h": 66 - }, - "frame": { - "x": 83, - "y": 0, - "w": 43, - "h": 66 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 43, - "h": 66 - }, - "frame": { - "x": 83, - "y": 0, - "w": 43, - "h": 66 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 43, - "h": 66 - }, - "frame": { - "x": 83, - "y": 0, - "w": 43, - "h": 66 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 69 - }, - "frame": { - "x": 0, - "y": 146, - "w": 40, - "h": 69 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 68 - }, - "frame": { - "x": 0, - "y": 215, - "w": 40, - "h": 68 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 68 - }, - "frame": { - "x": 0, - "y": 215, - "w": 40, - "h": 68 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 68 - }, - "frame": { - "x": 0, - "y": 215, - "w": 40, - "h": 68 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 64 - }, - "frame": { - "x": 126, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 64 - }, - "frame": { - "x": 126, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 64 - }, - "frame": { - "x": 166, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 64 - }, - "frame": { - "x": 166, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 40, - "h": 64 - }, - "frame": { - "x": 166, - "y": 0, - "w": 40, - "h": 64 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 63 - }, - "frame": { - "x": 206, - "y": 0, - "w": 40, - "h": 63 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 63 - }, - "frame": { - "x": 206, - "y": 0, - "w": 40, - "h": 63 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 63 - }, - "frame": { - "x": 206, - "y": 0, - "w": 40, - "h": 63 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 41, - "h": 62 - }, - "frame": { - "x": 246, - "y": 0, - "w": 41, - "h": 62 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 41, - "h": 62 - }, - "frame": { - "x": 246, - "y": 0, - "w": 41, - "h": 62 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 24, - "w": 42, - "h": 55 - }, - "frame": { - "x": 287, - "y": 0, - "w": 42, - "h": 55 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 24, - "w": 42, - "h": 55 - }, - "frame": { - "x": 287, - "y": 0, - "w": 42, - "h": 55 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 24, - "w": 42, - "h": 55 - }, - "frame": { - "x": 287, - "y": 0, - "w": 42, - "h": 55 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 24, - "w": 42, - "h": 55 - }, - "frame": { - "x": 287, - "y": 0, - "w": 42, - "h": 55 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 43, - "h": 45 - }, - "frame": { - "x": 0, - "y": 283, - "w": 43, - "h": 45 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 40, - "h": 59 - }, - "frame": { - "x": 40, - "y": 75, - "w": 40, - "h": 59 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 40, - "h": 59 - }, - "frame": { - "x": 40, - "y": 75, - "w": 40, - "h": 59 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 43, - "h": 59 - }, - "frame": { - "x": 40, - "y": 134, - "w": 43, - "h": 59 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 17, - "w": 43, - "h": 59 - }, - "frame": { - "x": 40, - "y": 134, - "w": 43, - "h": 59 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 40, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 40, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 40, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 40, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 43, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 43, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 43, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 43, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 81, - "y": 193, - "w": 41, - "h": 58 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 84, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 41, - "h": 58 - }, - "frame": { - "x": 84, - "y": 251, - "w": 41, - "h": 58 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 80, - "y": 71, - "w": 41, - "h": 56 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 80, - "y": 71, - "w": 41, - "h": 56 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 83, - "y": 127, - "w": 41, - "h": 56 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 83, - "y": 127, - "w": 41, - "h": 56 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 83, - "y": 127, - "w": 41, - "h": 56 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 56 - }, - "frame": { - "x": 121, - "y": 66, - "w": 40, - "h": 56 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 56 - }, - "frame": { - "x": 121, - "y": 66, - "w": 40, - "h": 56 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 56 - }, - "frame": { - "x": 121, - "y": 66, - "w": 40, - "h": 56 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 161, - "y": 64, - "w": 41, - "h": 56 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 22, - "w": 40, - "h": 56 - }, - "frame": { - "x": 124, - "y": 122, - "w": 40, - "h": 56 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 15, - "w": 40, - "h": 56 - }, - "frame": { - "x": 164, - "y": 120, - "w": 40, - "h": 56 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 56 - }, - "frame": { - "x": 202, - "y": 64, - "w": 40, - "h": 56 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 204, - "y": 120, - "w": 41, - "h": 56 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 204, - "y": 120, - "w": 41, - "h": 56 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 242, - "y": 63, - "w": 41, - "h": 56 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 23, - "w": 41, - "h": 56 - }, - "frame": { - "x": 242, - "y": 63, - "w": 41, - "h": 56 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 55 - }, - "frame": { - "x": 245, - "y": 119, - "w": 40, - "h": 55 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 55 - }, - "frame": { - "x": 245, - "y": 119, - "w": 40, - "h": 55 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 283, - "y": 62, - "w": 43, - "h": 53 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 283, - "y": 62, - "w": 43, - "h": 53 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 283, - "y": 62, - "w": 43, - "h": 53 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 283, - "y": 62, - "w": 43, - "h": 53 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 285, - "y": 115, - "w": 43, - "h": 53 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 285, - "y": 115, - "w": 43, - "h": 53 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 285, - "y": 115, - "w": 43, - "h": 53 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 26, - "w": 43, - "h": 53 - }, - "frame": { - "x": 285, - "y": 115, - "w": 43, - "h": 53 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 168, - "w": 43, - "h": 52 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 168, - "w": 43, - "h": 52 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 245, - "y": 174, - "w": 40, - "h": 52 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 245, - "y": 174, - "w": 40, - "h": 52 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 220, - "w": 43, - "h": 52 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 220, - "w": 43, - "h": 52 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 52 - }, - "frame": { - "x": 285, - "y": 220, - "w": 43, - "h": 52 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 124, - "y": 178, - "w": 41, - "h": 51 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 124, - "y": 178, - "w": 41, - "h": 51 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 43, - "h": 52 - }, - "frame": { - "x": 165, - "y": 176, - "w": 43, - "h": 52 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 43, - "h": 52 - }, - "frame": { - "x": 165, - "y": 176, - "w": 43, - "h": 52 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 43, - "h": 52 - }, - "frame": { - "x": 165, - "y": 176, - "w": 43, - "h": 52 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 27, - "w": 43, - "h": 52 - }, - "frame": { - "x": 165, - "y": 176, - "w": 43, - "h": 52 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 125, - "y": 229, - "w": 40, - "h": 52 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 125, - "y": 229, - "w": 40, - "h": 52 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 125, - "y": 229, - "w": 40, - "h": 52 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 43, - "h": 51 - }, - "frame": { - "x": 165, - "y": 228, - "w": 43, - "h": 51 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 43, - "h": 51 - }, - "frame": { - "x": 165, - "y": 228, - "w": 43, - "h": 51 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 41, - "h": 47 - }, - "frame": { - "x": 125, - "y": 281, - "w": 41, - "h": 47 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 41, - "h": 47 - }, - "frame": { - "x": 125, - "y": 281, - "w": 41, - "h": 47 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 40, - "h": 47 - }, - "frame": { - "x": 166, - "y": 279, - "w": 40, - "h": 47 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 40, - "h": 47 - }, - "frame": { - "x": 166, - "y": 279, - "w": 40, - "h": 47 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 32, - "w": 40, - "h": 47 - }, - "frame": { - "x": 166, - "y": 279, - "w": 40, - "h": 47 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 208, - "y": 226, - "w": 41, - "h": 51 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 208, - "y": 226, - "w": 41, - "h": 51 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 41, - "h": 51 - }, - "frame": { - "x": 208, - "y": 226, - "w": 41, - "h": 51 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 1, - "y": 27, - "w": 40, - "h": 52 - }, - "frame": { - "x": 208, - "y": 277, - "w": 40, - "h": 52 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 28, - "w": 40, - "h": 51 - }, - "frame": { - "x": 248, - "y": 277, - "w": 40, - "h": 51 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:2fafa31e40697aa1ab7bc1619c303f9a:3af9773306c3ebb89af2d8ec9b6d7e0e:2e42f825bd325ece9bcbe5d573264582$" - } -} + "textures":[ + { + "image": "186.png", + "format": "RGBA8888", + "size": { "w": 164, "h": 264 }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 118, "y": 0, "w": 39, "h": 57 } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 40, "h": 51 }, + "frame": { "x": 0, "y": 173, "w": 40, "h": 51 } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 1, "w": 38, "h": 70 }, + "frame": { "x": 0, "y": 0, "w": 38, "h": 70 } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 52 }, + "frame": { "x": 84, "y": 168, "w": 41, "h": 52 } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 2, "w": 39, "h": 54 }, + "frame": { "x": 125, "y": 168, "w": 39, "h": 54 } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 2, "y": 8, "w": 38, "h": 62 }, + "frame": { "x": 38, "y": 0, "w": 38, "h": 62 } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 32, "w": 40, "h": 46 }, + "frame": { "x": 40, "y": 218, "w": 40, "h": 46 } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 23, "w": 39, "h": 55 }, + "frame": { "x": 121, "y": 113, "w": 39, "h": 55 } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 76, "y": 53, "w": 39, "h": 57 } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 21, "w": 39, "h": 57 }, + "frame": { "x": 76, "y": 53, "w": 39, "h": 57 } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 22, "w": 39, "h": 56 }, + "frame": { "x": 115, "y": 57, "w": 39, "h": 56 } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 22, "w": 39, "h": 56 }, + "frame": { "x": 115, "y": 57, "w": 39, "h": 56 } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 24, "w": 40, "h": 54 }, + "frame": { "x": 81, "y": 113, "w": 40, "h": 54 } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 24, "w": 40, "h": 54 }, + "frame": { "x": 81, "y": 113, "w": 40, "h": 54 } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 25, "w": 42, "h": 53 }, + "frame": { "x": 76, "y": 0, "w": 42, "h": 53 } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 25, "w": 42, "h": 53 }, + "frame": { "x": 76, "y": 0, "w": 42, "h": 53 } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 26, "w": 42, "h": 52 }, + "frame": { "x": 0, "y": 70, "w": 42, "h": 52 } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 26, "w": 42, "h": 52 }, + "frame": { "x": 0, "y": 70, "w": 42, "h": 52 } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 0, "y": 122, "w": 42, "h": 51 } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 0, "y": 122, "w": 42, "h": 51 } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 42, "y": 167, "w": 42, "h": 51 } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 42, "y": 167, "w": 42, "h": 51 } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 0, "y": 122, "w": 42, "h": 51 } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 27, "w": 42, "h": 51 }, + "frame": { "x": 0, "y": 122, "w": 42, "h": 51 } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 26, "w": 42, "h": 52 }, + "frame": { "x": 0, "y": 70, "w": 42, "h": 52 } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 26, "w": 42, "h": 52 }, + "frame": { "x": 0, "y": 70, "w": 42, "h": 52 } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 25, "w": 42, "h": 53 }, + "frame": { "x": 76, "y": 0, "w": 42, "h": 53 } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 0, "y": 25, "w": 42, "h": 53 }, + "frame": { "x": 76, "y": 0, "w": 42, "h": 53 } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 24, "w": 40, "h": 54 }, + "frame": { "x": 81, "y": 113, "w": 40, "h": 54 } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 24, "w": 40, "h": 54 }, + "frame": { "x": 81, "y": 113, "w": 40, "h": 54 } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 22, "w": 39, "h": 56 }, + "frame": { "x": 42, "y": 110, "w": 39, "h": 56 } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 42, "h": 78 }, + "spriteSourceSize": { "x": 1, "y": 22, "w": 39, "h": 56 }, + "frame": { "x": 42, "y": 110, "w": 39, "h": 56 } + } + ] + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64" + } +} \ No newline at end of file diff --git a/public/images/pokemon/back/shiny/female/186.png b/public/images/pokemon/back/shiny/female/186.png index d63999a4f2d..37b157dce85 100644 Binary files a/public/images/pokemon/back/shiny/female/186.png and b/public/images/pokemon/back/shiny/female/186.png differ diff --git a/public/images/pokemon/exp/380-mega.png b/public/images/pokemon/exp/380-mega.png index 50be5e401f3..2a0cfa8797b 100644 Binary files a/public/images/pokemon/exp/380-mega.png and b/public/images/pokemon/exp/380-mega.png differ diff --git a/public/images/pokemon/exp/381-mega.png b/public/images/pokemon/exp/381-mega.png index cf9addd7b12..a40e3eb8655 100644 Binary files a/public/images/pokemon/exp/381-mega.png and b/public/images/pokemon/exp/381-mega.png differ diff --git a/public/images/pokemon/exp/823.png b/public/images/pokemon/exp/823.png index 22301ca3abe..b280ac7c9e6 100644 Binary files a/public/images/pokemon/exp/823.png and b/public/images/pokemon/exp/823.png differ diff --git a/public/images/pokemon/exp/back/150-mega-x.png b/public/images/pokemon/exp/back/150-mega-x.png index c9658de8211..80907e95074 100644 Binary files a/public/images/pokemon/exp/back/150-mega-x.png and b/public/images/pokemon/exp/back/150-mega-x.png differ diff --git a/public/images/pokemon/exp/back/823.png b/public/images/pokemon/exp/back/823.png index 69506ac4645..ea00aba09e5 100644 Binary files a/public/images/pokemon/exp/back/823.png and b/public/images/pokemon/exp/back/823.png differ diff --git a/public/images/pokemon/exp/back/shiny/150-mega-x.png b/public/images/pokemon/exp/back/shiny/150-mega-x.png index daecd9bf7b5..eca55d70313 100644 Binary files a/public/images/pokemon/exp/back/shiny/150-mega-x.png and b/public/images/pokemon/exp/back/shiny/150-mega-x.png differ diff --git a/public/images/pokemon/exp/back/shiny/823.png b/public/images/pokemon/exp/back/shiny/823.png index 81b3a07a6da..09c06f2aeb6 100644 Binary files a/public/images/pokemon/exp/back/shiny/823.png and b/public/images/pokemon/exp/back/shiny/823.png differ diff --git a/public/images/pokemon/exp/female/916.json b/public/images/pokemon/exp/female/916.json deleted file mode 100644 index e937dadda95..00000000000 --- a/public/images/pokemon/exp/female/916.json +++ /dev/null @@ -1,272 +0,0 @@ -{ - "textures": [ - { - "image": "916.png", - "format": "RGBA8888", - "size": { - "w": 250, - "h": 250 - }, - "scale": 1, - "frames": [ - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 61, - "h": 85 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 61, - "h": 85 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 85 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 85 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 60, - "h": 85 - }, - "frame": { - "x": 0, - "y": 85, - "w": 60, - "h": 85 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 85 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 60, - "h": 80 - }, - "frame": { - "x": 0, - "y": 170, - "w": 60, - "h": 80 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 85 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 60, - "h": 85 - }, - "frame": { - "x": 60, - "y": 85, - "w": 60, - "h": 85 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 85 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 60, - "h": 85 - }, - "frame": { - "x": 61, - "y": 0, - "w": 60, - "h": 85 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 85 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 59, - "h": 80 - }, - "frame": { - "x": 60, - "y": 170, - "w": 59, - "h": 80 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 85 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 60, - "h": 79 - }, - "frame": { - "x": 119, - "y": 170, - "w": 60, - "h": 79 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 85 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 60, - "h": 85 - }, - "frame": { - "x": 120, - "y": 85, - "w": 60, - "h": 85 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 85 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 60, - "h": 83 - }, - "frame": { - "x": 121, - "y": 0, - "w": 60, - "h": 83 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 85 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 60, - "h": 83 - }, - "frame": { - "x": 181, - "y": 0, - "w": 60, - "h": 83 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 85 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 60, - "h": 81 - }, - "frame": { - "x": 180, - "y": 83, - "w": 60, - "h": 81 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 61, - "h": 85 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 59, - "h": 81 - }, - "frame": { - "x": 180, - "y": 164, - "w": 59, - "h": 81 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:08f91248c91e426c4993be4e9988fc0d:215799a2235190ac587b1617d8e7e8b9:72483d103fb6b8e5c1889150025102c8$" - } -} diff --git a/public/images/pokemon/exp/female/916.png b/public/images/pokemon/exp/female/916.png deleted file mode 100644 index 314062011c1..00000000000 Binary files a/public/images/pokemon/exp/female/916.png and /dev/null differ diff --git a/public/images/pokemon/exp/shiny/823.png b/public/images/pokemon/exp/shiny/823.png index 1e90dcb67d3..9df29297e3a 100644 Binary files a/public/images/pokemon/exp/shiny/823.png and b/public/images/pokemon/exp/shiny/823.png differ diff --git a/public/images/pokemon/female/6215.png b/public/images/pokemon/female/6215.png index 0bfb2114c0f..c98bc4847b7 100644 Binary files a/public/images/pokemon/female/6215.png and b/public/images/pokemon/female/6215.png differ diff --git a/public/images/pokemon/female/916.json b/public/images/pokemon/female/916.json deleted file mode 100644 index e174d4b2d1c..00000000000 --- a/public/images/pokemon/female/916.json +++ /dev/null @@ -1,272 +0,0 @@ -{ - "textures": [ - { - "image": "916.png", - "format": "RGBA8888", - "size": { - "w": 251, - "h": 251 - }, - "scale": 1, - "frames": [ - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 96 - }, - "spriteSourceSize": { - "x": 13, - "y": 10, - "w": 62, - "h": 86 - }, - "frame": { - "x": 0, - "y": 0, - "w": 62, - "h": 86 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 96 - }, - "spriteSourceSize": { - "x": 15, - "y": 10, - "w": 61, - "h": 86 - }, - "frame": { - "x": 62, - "y": 0, - "w": 61, - "h": 86 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 96 - }, - "spriteSourceSize": { - "x": 15, - "y": 10, - "w": 61, - "h": 86 - }, - "frame": { - "x": 123, - "y": 0, - "w": 61, - "h": 86 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 96 - }, - "spriteSourceSize": { - "x": 15, - "y": 10, - "w": 60, - "h": 86 - }, - "frame": { - "x": 184, - "y": 0, - "w": 60, - "h": 86 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 96 - }, - "spriteSourceSize": { - "x": 15, - "y": 15, - "w": 61, - "h": 81 - }, - "frame": { - "x": 0, - "y": 86, - "w": 61, - "h": 81 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 96 - }, - "spriteSourceSize": { - "x": 15, - "y": 16, - "w": 61, - "h": 80 - }, - "frame": { - "x": 61, - "y": 86, - "w": 61, - "h": 80 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 96 - }, - "spriteSourceSize": { - "x": 15, - "y": 10, - "w": 60, - "h": 86 - }, - "frame": { - "x": 122, - "y": 86, - "w": 60, - "h": 86 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 96 - }, - "spriteSourceSize": { - "x": 15, - "y": 13, - "w": 60, - "h": 83 - }, - "frame": { - "x": 61, - "y": 166, - "w": 60, - "h": 83 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 96 - }, - "spriteSourceSize": { - "x": 15, - "y": 13, - "w": 60, - "h": 83 - }, - "frame": { - "x": 0, - "y": 167, - "w": 60, - "h": 83 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 96 - }, - "spriteSourceSize": { - "x": 15, - "y": 17, - "w": 60, - "h": 79 - }, - "frame": { - "x": 121, - "y": 172, - "w": 60, - "h": 79 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 96 - }, - "spriteSourceSize": { - "x": 16, - "y": 15, - "w": 60, - "h": 81 - }, - "frame": { - "x": 182, - "y": 86, - "w": 60, - "h": 81 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 96 - }, - "spriteSourceSize": { - "x": 16, - "y": 16, - "w": 60, - "h": 80 - }, - "frame": { - "x": 182, - "y": 167, - "w": 60, - "h": 80 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f1919e76120351b77d053dd0b1048890:6cc484548a07e592b87dcc37f6c74a39:72483d103fb6b8e5c1889150025102c8$" - } -} diff --git a/public/images/pokemon/female/916.png b/public/images/pokemon/female/916.png deleted file mode 100644 index 452b8403c66..00000000000 Binary files a/public/images/pokemon/female/916.png and /dev/null differ diff --git a/public/images/pokemon/shiny/563.json b/public/images/pokemon/shiny/563.json index 73e9cc7ca33..666ec547d18 100644 --- a/public/images/pokemon/shiny/563.json +++ b/public/images/pokemon/shiny/563.json @@ -1,3485 +1,699 @@ -{ - "textures": [ - { - "image": "563.png", - "format": "RGBA8888", - "size": { - "w": 500, - "h": 500 - }, - "scale": 1, - "frames": [ - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0156.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0157.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 103, - "h": 88 - }, - "frame": { - "x": 0, - "y": 81, - "w": 103, - "h": 88 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 103, - "h": 88 - }, - "frame": { - "x": 0, - "y": 81, - "w": 103, - "h": 88 - } - }, - { - "filename": "0155.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 103, - "h": 88 - }, - "frame": { - "x": 0, - "y": 81, - "w": 103, - "h": 88 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0158.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0159.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0161.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0162.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 99, - "h": 81 - }, - "frame": { - "x": 0, - "y": 250, - "w": 99, - "h": 81 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 99, - "h": 81 - }, - "frame": { - "x": 0, - "y": 250, - "w": 99, - "h": 81 - } - }, - { - "filename": "0135.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 99, - "h": 81 - }, - "frame": { - "x": 0, - "y": 250, - "w": 99, - "h": 81 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0163.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0164.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0133.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0134.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 108, - "h": 72 - }, - "frame": { - "x": 232, - "y": 0, - "w": 108, - "h": 72 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 108, - "h": 72 - }, - "frame": { - "x": 232, - "y": 0, - "w": 108, - "h": 72 - } - }, - { - "filename": "0160.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 108, - "h": 72 - }, - "frame": { - "x": 232, - "y": 0, - "w": 108, - "h": 72 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0153.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0154.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0143.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0144.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0151.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0152.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 10, - "w": 104, - "h": 67 - }, - "frame": { - "x": 328, - "y": 72, - "w": 104, - "h": 67 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 10, - "w": 104, - "h": 67 - }, - "frame": { - "x": 328, - "y": 72, - "w": 104, - "h": 67 - } - }, - { - "filename": "0145.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 10, - "w": 104, - "h": 67 - }, - "frame": { - "x": 328, - "y": 72, - "w": 104, - "h": 67 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0141.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0142.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 98, - "h": 73 - }, - "frame": { - "x": 205, - "y": 140, - "w": 98, - "h": 73 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 98, - "h": 73 - }, - "frame": { - "x": 205, - "y": 140, - "w": 98, - "h": 73 - } - }, - { - "filename": "0150.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 98, - "h": 73 - }, - "frame": { - "x": 205, - "y": 140, - "w": 98, - "h": 73 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0136.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0137.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 94, - "h": 75 - }, - "frame": { - "x": 197, - "y": 213, - "w": 94, - "h": 75 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 94, - "h": 75 - }, - "frame": { - "x": 197, - "y": 213, - "w": 94, - "h": 75 - } - }, - { - "filename": "0140.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 94, - "h": 75 - }, - "frame": { - "x": 197, - "y": 213, - "w": 94, - "h": 75 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0146.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0147.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0138.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0139.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0148.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0149.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0165.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 98, - "y": 358, - "w": 93, - "h": 78 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 98, - "y": 358, - "w": 93, - "h": 78 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 191, - "y": 366, - "w": 93, - "h": 78 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 19, - "y": 18, - "w": 73, - "h": 64 - }, - "frame": { - "x": 96, - "y": 436, - "w": 73, - "h": 64 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 28, - "y": 17, - "w": 52, - "h": 65 - }, - "frame": { - "x": 446, - "y": 0, - "w": 52, - "h": 65 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 93, - "h": 79 - }, - "frame": { - "x": 303, - "y": 140, - "w": 93, - "h": 79 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 291, - "y": 219, - "w": 93, - "h": 78 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 291, - "y": 219, - "w": 93, - "h": 78 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 93, - "h": 77 - }, - "frame": { - "x": 286, - "y": 297, - "w": 93, - "h": 77 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 85, - "h": 73 - }, - "frame": { - "x": 284, - "y": 374, - "w": 85, - "h": 73 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 16, - "y": 5, - "w": 75, - "h": 79 - }, - "frame": { - "x": 396, - "y": 139, - "w": 75, - "h": 79 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 85, - "h": 79 - }, - "frame": { - "x": 384, - "y": 219, - "w": 85, - "h": 79 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 16, - "y": 15, - "w": 78, - "h": 67 - }, - "frame": { - "x": 379, - "y": 298, - "w": 78, - "h": 67 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 16, - "y": 15, - "w": 78, - "h": 67 - }, - "frame": { - "x": 379, - "y": 298, - "w": 78, - "h": 67 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 21, - "y": 8, - "w": 66, - "h": 76 - }, - "frame": { - "x": 369, - "y": 374, - "w": 66, - "h": 76 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 21, - "y": 8, - "w": 66, - "h": 76 - }, - "frame": { - "x": 369, - "y": 374, - "w": 66, - "h": 76 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 25, - "y": 12, - "w": 59, - "h": 70 - }, - "frame": { - "x": 435, - "y": 365, - "w": 59, - "h": 70 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 25, - "y": 19, - "w": 66, - "h": 63 - }, - "frame": { - "x": 432, - "y": 72, - "w": 66, - "h": 63 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 29, - "y": 20, - "w": 60, - "h": 62 - }, - "frame": { - "x": 435, - "y": 435, - "w": 60, - "h": 62 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 29, - "y": 20, - "w": 60, - "h": 62 - }, - "frame": { - "x": 435, - "y": 435, - "w": 60, - "h": 62 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 16, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 16, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 17, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 17, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 14, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 14, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 15, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 15, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 16, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 16, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 17, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 17, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:697c20c4ebed8144399c4936c33f0236:3973650c39d034cfc27663d9051d4736:12f3eae8283ab6c8e555ff3e46b7d8dc$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0002.png", + "frame": { "x": 388, "y": 152, "w": 97, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 10, "w": 97, "h": 72 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0003.png", + "frame": { "x": 105, "y": 161, "w": 102, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 15, "w": 102, "h": 68 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0004.png", + "frame": { "x": 95, "y": 90, "w": 101, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 101, "h": 70 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0005.png", + "frame": { "x": 108, "y": 0, "w": 94, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 94, "h": 89 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 0, "w": 107, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 107, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0007.png", + "frame": { "x": 303, "y": 0, "w": 112, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 13, "w": 112, "h": 69 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0008.png", + "frame": { "x": 399, "y": 81, "w": 106, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 106, "h": 70 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0009.png", + "frame": { "x": 203, "y": 0, "w": 99, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 99, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0010.png", + "frame": { "x": 303, "y": 70, "w": 95, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 95, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0011.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 81, "w": 94, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 94, "h": 79 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0013.png", + "frame": { "x": 416, "y": 0, "w": 96, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 96, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0014.png", + "frame": { "x": 92, "y": 230, "w": 94, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 6, "w": 94, "h": 73 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0015.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0016.png", + "frame": { "x": 92, "y": 304, "w": 92, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 92, "h": 73 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0017.png", + "frame": { "x": 185, "y": 305, "w": 99, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 15, "w": 99, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 161, "w": 104, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 11, "w": 104, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0019.png", + "frame": { "x": 392, "y": 302, "w": 101, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 101, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0020.png", + "frame": { "x": 295, "y": 151, "w": 92, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 92, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0021.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0022.png", + "frame": { "x": 388, "y": 152, "w": 97, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 10, "w": 97, "h": 72 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0023.png", + "frame": { "x": 105, "y": 161, "w": 102, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 15, "w": 102, "h": 68 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0024.png", + "frame": { "x": 95, "y": 90, "w": 101, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 101, "h": 70 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0025.png", + "frame": { "x": 108, "y": 0, "w": 94, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 94, "h": 89 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 0, "w": 107, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 107, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0027.png", + "frame": { "x": 303, "y": 0, "w": 112, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 13, "w": 112, "h": 69 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0028.png", + "frame": { "x": 399, "y": 81, "w": 106, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 106, "h": 70 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0029.png", + "frame": { "x": 203, "y": 0, "w": 99, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 99, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0030.png", + "frame": { "x": 303, "y": 70, "w": 95, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 95, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0031.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 81, "w": 94, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 94, "h": 79 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0033.png", + "frame": { "x": 416, "y": 0, "w": 96, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 96, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0034.png", + "frame": { "x": 92, "y": 230, "w": 94, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 6, "w": 94, "h": 73 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0035.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0036.png", + "frame": { "x": 92, "y": 304, "w": 92, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 92, "h": 73 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0037.png", + "frame": { "x": 185, "y": 305, "w": 99, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 15, "w": 99, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0038.png", + "frame": { "x": 0, "y": 161, "w": 104, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 11, "w": 104, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0039.png", + "frame": { "x": 392, "y": 302, "w": 101, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 101, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0040.png", + "frame": { "x": 295, "y": 151, "w": 92, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 92, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0041.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0042.png", + "frame": { "x": 388, "y": 152, "w": 97, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 10, "w": 97, "h": 72 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0043.png", + "frame": { "x": 105, "y": 161, "w": 102, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 15, "w": 102, "h": 68 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0044.png", + "frame": { "x": 95, "y": 90, "w": 101, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 14, "w": 101, "h": 70 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0045.png", + "frame": { "x": 108, "y": 0, "w": 94, "h": 89 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 0, "w": 94, "h": 89 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0046.png", + "frame": { "x": 0, "y": 0, "w": 107, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 107, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0047.png", + "frame": { "x": 303, "y": 0, "w": 112, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 13, "w": 112, "h": 69 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0048.png", + "frame": { "x": 399, "y": 81, "w": 106, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 12, "w": 106, "h": 70 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0049.png", + "frame": { "x": 203, "y": 0, "w": 99, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 99, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0050.png", + "frame": { "x": 303, "y": 70, "w": 95, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 95, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0051.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0052.png", + "frame": { "x": 208, "y": 228, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0053.png", + "frame": { "x": 203, "y": 81, "w": 91, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 5, "w": 91, "h": 77 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 229, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0055.png", + "frame": { "x": 300, "y": 302, "w": 91, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 7, "w": 91, "h": 75 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0056.png", + "frame": { "x": 300, "y": 228, "w": 83, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 11, "w": 83, "h": 71 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0057.png", + "frame": { "x": 208, "y": 159, "w": 76, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 17, "w": 76, "h": 65 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0058.png", + "frame": { "x": 392, "y": 370, "w": 70, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 16, "w": 70, "h": 66 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0059.png", + "frame": { "x": 494, "y": 305, "w": 64, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 15, "w": 64, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0060.png", + "frame": { "x": 463, "y": 373, "w": 58, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 29, "y": 20, "w": 58, "h": 62 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0061.png", + "frame": { "x": 513, "y": 0, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 22, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0062.png", + "frame": { "x": 513, "y": 0, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 18, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0063.png", + "frame": { "x": 513, "y": 0, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 19, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0064.png", + "frame": { "x": 513, "y": 0, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 22, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0065.png", + "frame": { "x": 242, "y": 373, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 16, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0066.png", + "frame": { "x": 242, "y": 373, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 17, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0067.png", + "frame": { "x": 513, "y": 0, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 22, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0068.png", + "frame": { "x": 513, "y": 0, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 18, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0069.png", + "frame": { "x": 513, "y": 0, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 19, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0070.png", + "frame": { "x": 513, "y": 0, "w": 36, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 22, "w": 36, "h": 59 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0071.png", + "frame": { "x": 506, "y": 81, "w": 50, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 18, "w": 50, "h": 64 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0072.png", + "frame": { "x": 185, "y": 373, "w": 56, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 14, "w": 56, "h": 68 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0073.png", + "frame": { "x": 494, "y": 230, "w": 64, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 10, "w": 64, "h": 74 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0074.png", + "frame": { "x": 486, "y": 152, "w": 73, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 7, "w": 73, "h": 77 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0075.png", + "frame": { "x": 0, "y": 306, "w": 83, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 6, "w": 83, "h": 77 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0076.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0077.png", + "frame": { "x": 0, "y": 81, "w": 94, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 94, "h": 79 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0078.png", + "frame": { "x": 416, "y": 0, "w": 96, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 96, "h": 80 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0079.png", + "frame": { "x": 92, "y": 230, "w": 94, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 6, "w": 94, "h": 73 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0080.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0081.png", + "frame": { "x": 92, "y": 304, "w": 92, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 9, "w": 92, "h": 73 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0082.png", + "frame": { "x": 185, "y": 305, "w": 99, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 15, "w": 99, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0083.png", + "frame": { "x": 0, "y": 161, "w": 104, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 11, "w": 104, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0084.png", + "frame": { "x": 392, "y": 302, "w": 101, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 10, "w": 101, "h": 67 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0085.png", + "frame": { "x": 295, "y": 151, "w": 92, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 6, "w": 92, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + }, + { + "filename": "0086.png", + "frame": { "x": 388, "y": 225, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 6, "w": 91, "h": 76 }, + "sourceSize": { "w": 114, "h": 89 } + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "image": "563.png", + "format": "I8", + "size": { "w": 559, "h": 441 }, + "scale": "1" + } } diff --git a/public/images/pokemon/shiny/563.png b/public/images/pokemon/shiny/563.png index 1958a3c1352..91624b28dc5 100644 Binary files a/public/images/pokemon/shiny/563.png and b/public/images/pokemon/shiny/563.png differ diff --git a/public/images/pokemon/shiny/636.json b/public/images/pokemon/shiny/636.json index e7878da24d1..9626c6d8263 100644 --- a/public/images/pokemon/shiny/636.json +++ b/public/images/pokemon/shiny/636.json @@ -4,744 +4,51 @@ "image": "636.png", "format": "RGBA8888", "size": { - "w": 341, - "h": 341 + "w": 301, + "h": 301 }, "scale": 1, "frames": [ - { - "filename": "0095.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 50 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 50 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 0, - "y": 50, - "w": 44, - "h": 50 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 0, - "y": 100, - "w": 44, - "h": 50 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 0, - "y": 150, - "w": 44, - "h": 50 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 0, - "y": 200, - "w": 44, - "h": 50 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 0, - "y": 250, - "w": 44, - "h": 50 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 44, - "y": 50, - "w": 44, - "h": 50 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 44, - "y": 50, - "w": 44, - "h": 50 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 45, - "y": 0, - "w": 44, - "h": 50 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 44, - "y": 100, - "w": 44, - "h": 50 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 44, - "y": 150, - "w": 44, - "h": 50 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 44, - "y": 200, - "w": 44, - "h": 50 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 44, - "y": 250, - "w": 44, - "h": 50 - } - }, { "filename": "0005.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 45, - "h": 49 + "w": 46, + "h": 48 }, "frame": { - "x": 89, - "y": 0, - "w": 45, - "h": 49 + "x": 1, + "y": 1, + "w": 46, + "h": 48 } }, { - "filename": "0020.png", + "filename": "0016.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 45, - "h": 49 + "w": 46, + "h": 48 }, "frame": { - "x": 89, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, + "x": 1, "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 89, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 89, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 134, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 134, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 134, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 134, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 179, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 179, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 179, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 179, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 224, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 224, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 224, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 224, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 269, - "y": 0, - "w": 45, - "h": 49 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 49 - }, - "frame": { - "x": 89, - "y": 49, - "w": 45, - "h": 49 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 47 - }, - "frame": { - "x": 134, - "y": 49, - "w": 45, - "h": 47 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 47 - }, - "frame": { - "x": 134, - "y": 49, - "w": 45, - "h": 47 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 47 - }, - "frame": { - "x": 134, - "y": 49, - "w": 45, - "h": 47 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 47 - }, - "frame": { - "x": 134, - "y": 49, - "w": 45, - "h": 47 + "w": 46, + "h": 48 } }, { @@ -749,545 +56,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 47 - }, - "frame": { - "x": 179, - "y": 49, - "w": 45, - "h": 47 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 47 - }, - "frame": { - "x": 179, - "y": 49, - "w": 45, - "h": 47 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 47 - }, - "frame": { - "x": 179, - "y": 49, - "w": 45, - "h": 47 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 47 - }, - "frame": { - "x": 179, - "y": 49, - "w": 45, - "h": 47 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 45, - "h": 47 - }, - "frame": { - "x": 224, - "y": 49, - "w": 45, - "h": 47 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 269, - "y": 49, - "w": 44, - "h": 50 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 134, - "y": 96, - "w": 44, - "h": 50 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 88, - "y": 98, - "w": 44, - "h": 50 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 178, - "y": 96, - "w": 44, - "h": 50 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 222, - "y": 96, - "w": 44, - "h": 50 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 266, - "y": 99, - "w": 44, - "h": 50 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 132, - "y": 146, - "w": 44, - "h": 50 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 44, - "h": 50 - }, - "frame": { - "x": 88, - "y": 148, - "w": 44, - "h": 50 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 44, - "h": 49 + "w": 46, + "h": 48 }, "frame": { - "x": 176, - "y": 146, - "w": 44, - "h": 49 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, + "x": 1, "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 176, - "y": 146, - "w": 44, - "h": 49 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 176, - "y": 146, - "w": 44, - "h": 49 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 176, - "y": 146, - "w": 44, - "h": 49 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 220, - "y": 146, - "w": 44, - "h": 49 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 220, - "y": 146, - "w": 44, - "h": 49 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 220, - "y": 146, - "w": 44, - "h": 49 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 220, - "y": 146, - "w": 44, - "h": 49 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 264, - "y": 149, - "w": 44, - "h": 49 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 264, - "y": 149, - "w": 44, - "h": 49 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 264, - "y": 149, - "w": 44, - "h": 49 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 264, - "y": 149, - "w": 44, - "h": 49 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 44, - "h": 49 - }, - "frame": { - "x": 176, - "y": 195, - "w": 44, - "h": 49 + "w": 46, + "h": 48 } }, { @@ -1295,82 +77,103 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 44, - "h": 49 + "w": 46, + "h": 48 }, "frame": { - "x": 176, - "y": 195, - "w": 44, - "h": 49 + "x": 1, + "y": 1, + "w": 46, + "h": 48 } }, { - "filename": "0067.png", + "filename": "0049.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 44, - "h": 49 + "w": 46, + "h": 48 }, "frame": { - "x": 176, - "y": 195, - "w": 44, - "h": 49 + "x": 1, + "y": 1, + "w": 46, + "h": 48 } }, { - "filename": "0082.png", + "filename": "0060.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 44, - "h": 49 + "w": 46, + "h": 48 }, "frame": { - "x": 176, - "y": 195, - "w": 44, - "h": 49 + "x": 1, + "y": 1, + "w": 46, + "h": 48 } }, { - "filename": "0116.png", + "filename": "0071.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, "y": 1, - "w": 44, + "w": 46, + "h": 48 + }, + "frame": { + "x": 1, + "y": 51, + "w": 46, + "h": 48 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 45, "h": 49 }, "frame": { - "x": 132, - "y": 196, - "w": 44, + "x": 49, + "y": 1, + "w": 45, "h": 49 } }, @@ -1379,103 +182,40 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 1, - "y": 2, - "w": 44, + "y": 1, + "w": 45, "h": 48 }, "frame": { - "x": 88, - "y": 198, - "w": 44, + "x": 1, + "y": 101, + "w": 45, "h": 48 } }, { - "filename": "0033.png", + "filename": "0015.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 1, - "y": 2, - "w": 44, + "y": 1, + "w": 45, "h": 48 }, "frame": { - "x": 88, - "y": 198, - "w": 44, - "h": 48 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { "x": 1, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 88, - "y": 198, - "w": 44, - "h": 48 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { + "y": 101, "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 88, - "y": 198, - "w": 44, - "h": 48 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 220, - "y": 195, - "w": 44, "h": 48 } }, @@ -1484,40 +224,208 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 44, + "x": 1, + "y": 1, + "w": 45, "h": 48 }, "frame": { - "x": 220, - "y": 195, - "w": 44, + "x": 1, + "y": 101, + "w": 45, "h": 48 } }, { - "filename": "0055.png", + "filename": "0037.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 44, + "x": 1, + "y": 1, + "w": 45, "h": 48 }, "frame": { - "x": 220, - "y": 195, - "w": 44, + "x": 1, + "y": 101, + "w": 45, + "h": 48 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 1, + "y": 101, + "w": 45, + "h": 48 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 1, + "y": 101, + "w": 45, + "h": 48 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 96, + "y": 1, + "w": 45, + "h": 48 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 96, + "y": 1, + "w": 45, + "h": 48 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 96, + "y": 1, + "w": 45, + "h": 48 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 96, + "y": 1, + "w": 45, + "h": 48 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 96, + "y": 1, + "w": 45, + "h": 48 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 45, + "h": 48 + }, + "frame": { + "x": 96, + "y": 1, + "w": 45, "h": 48 } }, @@ -1526,123 +434,102 @@ "rotated": false, "trimmed": true, "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, "w": 45, - "h": 50 + "h": 48 + }, + "frame": { + "x": 1, + "y": 151, + "w": 45, + "h": 48 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, - "y": 2, + "y": 0, "w": 44, - "h": 48 + "h": 49 }, "frame": { - "x": 220, - "y": 195, - "w": 44, - "h": 48 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { "x": 1, - "y": 2, + "y": 201, "w": 44, - "h": 48 - }, - "frame": { - "x": 264, - "y": 198, - "w": 44, - "h": 48 + "h": 49 } }, { - "filename": "0034.png", + "filename": "0007.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 264, - "y": 198, - "w": 44, - "h": 48 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 264, - "y": 198, - "w": 44, - "h": 48 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 264, - "y": 198, - "w": 44, - "h": 48 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, - "y": 2, + "y": 1, "w": 44, "h": 48 }, "frame": { - "x": 220, - "y": 243, + "x": 1, + "y": 252, + "w": 44, + "h": 48 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 44, + "h": 48 + }, + "frame": { + "x": 1, + "y": 252, + "w": 44, + "h": 48 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 44, + "h": 48 + }, + "frame": { + "x": 1, + "y": 252, "w": 44, "h": 48 } @@ -1652,733 +539,82 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, - "y": 2, + "y": 1, "w": 44, "h": 48 }, "frame": { - "x": 220, - "y": 243, + "x": 1, + "y": 252, "w": 44, "h": 48 } }, { - "filename": "0069.png", + "filename": "0051.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 0, - "y": 2, + "y": 1, "w": 44, "h": 48 }, "frame": { - "x": 220, - "y": 243, + "x": 1, + "y": 252, "w": 44, "h": 48 } }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 220, - "y": 243, - "w": 44, - "h": 48 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 176, - "y": 244, - "w": 44, - "h": 48 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 132, - "y": 245, - "w": 44, - "h": 48 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 44, - "h": 48 - }, - "frame": { - "x": 88, - "y": 246, - "w": 44, - "h": 48 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 88, - "y": 294, - "w": 44, - "h": 47 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 132, - "y": 293, - "w": 44, - "h": 47 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 132, - "y": 293, - "w": 44, - "h": 47 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 132, - "y": 293, - "w": 44, - "h": 47 - } - }, { "filename": "0062.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { - "x": 1, - "y": 3, + "x": 0, + "y": 1, "w": 44, - "h": 47 + "h": 48 }, "frame": { - "x": 132, - "y": 293, + "x": 1, + "y": 252, "w": 44, - "h": 47 + "h": 48 } }, { - "filename": "0013.png", + "filename": "0003.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 176, - "y": 292, - "w": 44, - "h": 47 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { + "y": 2, "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, "h": 47 }, "frame": { - "x": 176, - "y": 292, - "w": 44, - "h": 47 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { + "x": 49, + "y": 52, "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 176, - "y": 292, - "w": 44, - "h": 47 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 176, - "y": 292, - "w": 44, - "h": 47 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 45, - "h": 50 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, - "h": 47 - }, - "frame": { - "x": 176, - "y": 292, - "w": 44, "h": 47 } }, @@ -2387,40 +623,82 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 1, - "y": 3, - "w": 44, + "y": 2, + "w": 45, "h": 47 }, "frame": { - "x": 220, - "y": 291, - "w": 44, + "x": 49, + "y": 52, + "w": 45, "h": 47 } }, { - "filename": "0043.png", + "filename": "0025.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 1, - "y": 3, - "w": 44, + "y": 2, + "w": 45, "h": 47 }, "frame": { - "x": 220, - "y": 291, - "w": 44, + "x": 49, + "y": 52, + "w": 45, + "h": 47 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 45, + "h": 47 + }, + "frame": { + "x": 49, + "y": 52, + "w": 45, + "h": 47 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 45, + "h": 47 + }, + "frame": { + "x": 49, + "y": 52, + "w": 45, "h": 47 } }, @@ -2429,61 +707,82 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 1, - "y": 3, - "w": 44, + "y": 2, + "w": 45, "h": 47 }, "frame": { - "x": 220, - "y": 291, - "w": 44, + "x": 49, + "y": 52, + "w": 45, "h": 47 } }, { - "filename": "0087.png", + "filename": "0084.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { - "x": 1, - "y": 3, + "x": 0, + "y": 0, "w": 44, + "h": 49 + }, + "frame": { + "x": 48, + "y": 101, + "w": 44, + "h": 49 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 45, "h": 47 }, "frame": { - "x": 220, - "y": 291, - "w": 44, + "x": 96, + "y": 51, + "w": 45, "h": 47 } }, { - "filename": "0017.png", + "filename": "0021.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, + "x": 0, + "y": 2, + "w": 45, "h": 47 }, "frame": { - "x": 264, - "y": 246, - "w": 44, + "x": 96, + "y": 51, + "w": 45, "h": 47 } }, @@ -2492,83 +791,1112 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, + "x": 0, + "y": 2, + "w": 45, "h": 47 }, "frame": { - "x": 264, - "y": 246, - "w": 44, + "x": 96, + "y": 51, + "w": 45, "h": 47 } }, { - "filename": "0061.png", + "filename": "0043.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 44, + "x": 0, + "y": 2, + "w": 45, "h": 47 }, "frame": { - "x": 264, - "y": 246, - "w": 44, + "x": 96, + "y": 51, + "w": 45, "h": 47 } }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 45, + "h": 47 + }, + "frame": { + "x": 96, + "y": 51, + "w": 45, + "h": 47 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 45, + "h": 47 + }, + "frame": { + "x": 96, + "y": 51, + "w": 45, + "h": 47 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 49 + }, + "frame": { + "x": 143, + "y": 1, + "w": 44, + "h": 49 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 45, + "h": 47 + }, + "frame": { + "x": 189, + "y": 1, + "w": 45, + "h": 47 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 45, + "h": 47 + }, + "frame": { + "x": 236, + "y": 1, + "w": 45, + "h": 47 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 48, + "y": 152, + "w": 44, + "h": 46 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 143, + "y": 52, + "w": 44, + "h": 46 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 143, + "y": 52, + "w": 44, + "h": 46 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 143, + "y": 52, + "w": 44, + "h": 46 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 143, + "y": 52, + "w": 44, + "h": 46 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 143, + "y": 52, + "w": 44, + "h": 46 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 44, + "h": 46 + }, + "frame": { + "x": 143, + "y": 52, + "w": 44, + "h": 46 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 189, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 189, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 189, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 189, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 189, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 189, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 234, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 234, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 234, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 234, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 234, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 234, + "y": 50, + "w": 43, + "h": 48 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 94, + "y": 101, + "w": 43, + "h": 49 + } + }, { "filename": "0076.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 1, - "y": 3, - "w": 44, - "h": 47 + "y": 0, + "w": 43, + "h": 49 }, "frame": { - "x": 264, - "y": 246, - "w": 44, - "h": 47 + "x": 139, + "y": 100, + "w": 43, + "h": 49 } }, { - "filename": "0091.png", + "filename": "0077.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 45, - "h": 50 + "w": 46, + "h": 49 }, "spriteSourceSize": { "x": 1, - "y": 3, - "w": 44, - "h": 47 + "y": 0, + "w": 43, + "h": 49 }, "frame": { - "x": 264, - "y": 293, - "w": 44, - "h": 47 + "x": 184, + "y": 100, + "w": 43, + "h": 49 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 229, + "y": 100, + "w": 43, + "h": 49 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 94, + "y": 152, + "w": 43, + "h": 49 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 139, + "y": 151, + "w": 43, + "h": 49 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 184, + "y": 151, + "w": 43, + "h": 49 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 229, + "y": 151, + "w": 43, + "h": 49 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 42, + "h": 49 + }, + "frame": { + "x": 47, + "y": 201, + "w": 42, + "h": 49 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 47, + "y": 252, + "w": 43, + "h": 48 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 139, + "y": 202, + "w": 43, + "h": 49 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 184, + "y": 202, + "w": 43, + "h": 49 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 43, + "h": 49 + }, + "frame": { + "x": 229, + "y": 202, + "w": 43, + "h": 49 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 46, + "h": 49 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 43, + "h": 48 + }, + "frame": { + "x": 92, + "y": 203, + "w": 43, + "h": 48 } } ] @@ -2577,6 +1905,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e9936479afbfa12e3add90e9463f5c72:d4c500373e36054aceb990f7143e5d30:1d471fa25be339df4c4184625fad00b3$" + "smartupdate": "$TexturePacker:SmartUpdate:a44c0ac06d9b3f225bf4ca6ae3326041:93ae31dcf0673c1e0be8d6dfea13f44f:1d471fa25be339df4c4184625fad00b3$" } } diff --git a/public/images/pokemon/shiny/636.png b/public/images/pokemon/shiny/636.png index 5d03713293d..21088248dee 100644 Binary files a/public/images/pokemon/shiny/636.png and b/public/images/pokemon/shiny/636.png differ diff --git a/public/images/pokemon/shiny/802-zenith.png b/public/images/pokemon/shiny/802-zenith.png index b6db4621a0b..28c5a5e68d9 100644 Binary files a/public/images/pokemon/shiny/802-zenith.png and b/public/images/pokemon/shiny/802-zenith.png differ diff --git a/public/images/pokemon/variant/133-partner.json b/public/images/pokemon/variant/133-partner.json new file mode 100644 index 00000000000..1939d16ec22 --- /dev/null +++ b/public/images/pokemon/variant/133-partner.json @@ -0,0 +1,24 @@ +{ + "1": { + "a5634a": "5982b7", + "734a4a": "334b7d", + "d69c4a": "90c1f1", + "000000": "000000", + "523121": "13235c", + "e6c594": "9db5d8", + "bd9c7b": "5f6f94", + "ffffff": "ffffff", + "ffe6ad": "d7ebff" + }, + "2": { + "a5634a": "915ea3", + "734a4a": "5e3372", + "d69c4a": "bf88cb", + "000000": "000000", + "523121": "461144", + "e6c594": "d7b8ba", + "bd9c7b": "a07c83", + "ffffff": "ffffff", + "ffe6ad": "f3e6e3" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/169.json b/public/images/pokemon/variant/169.json index 3824fc5e351..751102ef4a0 100644 --- a/public/images/pokemon/variant/169.json +++ b/public/images/pokemon/variant/169.json @@ -1,19 +1,4 @@ { - "0": { - "7b4a9c": "d684ce", - "63197b": "9c528c", - "a55ace": "ffb5f7", - "101010": "101010", - "b57bce": "ffd6ef", - "08426b": "638400", - "ce0021": "940821", - "ffd600": "ffd600", - "d69400": "d69400", - "216b94": "8ca508", - "ffffff": "ffffff", - "a5a5a5": "a5a5a5", - "6b6b6b": "6b6b6b" - }, "1": { "7b4a9c": "2f2a5f", "63197b": "14093b", diff --git a/public/images/pokemon/variant/169_1.png b/public/images/pokemon/variant/169_1.png deleted file mode 100644 index 1baf868c278..00000000000 Binary files a/public/images/pokemon/variant/169_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/41.json b/public/images/pokemon/variant/41.json index d3af6fbd948..99ab116de02 100644 --- a/public/images/pokemon/variant/41.json +++ b/public/images/pokemon/variant/41.json @@ -1,28 +1,14 @@ { - "0": { - "101010": "101010", - "637bb5": "398422", - "4a427b": "084a00", - "bdceff": "99e870", - "8cb5ef": "5caf3b", - "b5529c": "bd9273", - "73215a": "a5785e", - "d673bd": "efd69c", - "ffffff": "ffffff", - "d6d6d6": "d6d6d6", - "636363": "636363" - }, "1": { "101010": "101010", - "637bb5": "37326f", + "637bb5": "12325c", "4a427b": "14093b", "bdceff": "868ecc", - "8cb5ef": "4e538f", - "b5529c": "cc7b32", - "73215a": "aa4c18", + "8cb5ef": "205182", + "b5529c": "d58e41", + "73215a": "b6591e", "d673bd": "f0ad57", "ffffff": "ffffff", - "d6d6d6": "d6d6d6", "636363": "636363" }, "2": { @@ -35,7 +21,6 @@ "73215a": "670f10", "d673bd": "bc3b1d", "ffffff": "ffffff", - "d6d6d6": "d6d6d6", "636363": "636363" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/41_1.png b/public/images/pokemon/variant/41_1.png deleted file mode 100644 index 003d45e5591..00000000000 Binary files a/public/images/pokemon/variant/41_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/41_2.png b/public/images/pokemon/variant/41_2.png deleted file mode 100644 index 59605d5265a..00000000000 Binary files a/public/images/pokemon/variant/41_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/41_3.png b/public/images/pokemon/variant/41_3.png deleted file mode 100644 index cd8c4542d2c..00000000000 Binary files a/public/images/pokemon/variant/41_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/42.json b/public/images/pokemon/variant/42.json index 74311a59fb2..af784a0fd2c 100644 --- a/public/images/pokemon/variant/42.json +++ b/public/images/pokemon/variant/42.json @@ -1,31 +1,17 @@ { - "0": { - "3a3a7b": "142557", - "5aadef": "6265b4", - "6384ce": "323f81", - "631052": "093263", - "ce6bb5": "61b6da", - "adceff": "99a3ee", - "000000": "000000", - "ad52ad": "348cc1", - "636363": "636363", - "ffffff": "ffffff", - "d6d6d6": "d6d6d6", - "943a7b": "175990" - }, "1": { - "3a3a7b": "084a00", - "5aadef": "6b9c29", - "6384ce": "317300", - "631052": "c52931", - "ce6bb5": "ffada5", - "adceff": "84d64a", + "3a3a7b": "14093b", + "5aadef": "204882", + "6384ce": "12245c", + "631052": "892d03", + "ce6bb5": "f1a139", + "adceff": "3c74b1", "000000": "000000", - "ad52ad": "e6737b", + "ad52ad": "d5711b", "636363": "636363", "ffffff": "ffffff", "d6d6d6": "d6d6d6", - "943a7b": "d6525a" + "943a7b": "af4e0c" }, "2": { "3a3a7b": "3d2349", diff --git a/public/images/pokemon/variant/42_2.png b/public/images/pokemon/variant/42_2.png deleted file mode 100644 index 629e3a926f4..00000000000 Binary files a/public/images/pokemon/variant/42_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/42_3.png b/public/images/pokemon/variant/42_3.png deleted file mode 100644 index 6fcfcbf1859..00000000000 Binary files a/public/images/pokemon/variant/42_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/563.json b/public/images/pokemon/variant/563.json new file mode 100644 index 00000000000..0657f362348 --- /dev/null +++ b/public/images/pokemon/variant/563.json @@ -0,0 +1,30 @@ +{ + "1": { + "101010": "101010", + "216b7b": "18265c", + "294a4a": "242b71", + "3194ad": "32459b", + "393942": "a40e38", + "6b5a21": "684327", + "b58431": "8c6742", + "ffbd31": "d29887", + "ffffff": "e4d8ff", + "9c2142": "63f3ca", + "ff3121": "a0f7ff", + "393941": "521f2d" + }, + "2": { + "101010": "101010", + "216b7b": "923c1c", + "294a4a": "591105", + "3194ad": "e03241", + "393942": "3ce483", + "6b5a21": "74350f", + "b58431": "9c5e19", + "ffbd31": "d9e878", + "ffffff": "eaffa6", + "9c2142": "b1f1d2", + "ff3121": "ecffeb", + "393941": "2a3430" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/563_2.json b/public/images/pokemon/variant/563_2.json deleted file mode 100644 index 2b619fc1086..00000000000 --- a/public/images/pokemon/variant/563_2.json +++ /dev/null @@ -1,3485 +0,0 @@ -{ - "textures": [ - { - "image": "563_2.png", - "format": "RGBA8888", - "size": { - "w": 500, - "h": 500 - }, - "scale": 1, - "frames": [ - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0156.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0157.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 103, - "h": 88 - }, - "frame": { - "x": 0, - "y": 81, - "w": 103, - "h": 88 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 103, - "h": 88 - }, - "frame": { - "x": 0, - "y": 81, - "w": 103, - "h": 88 - } - }, - { - "filename": "0155.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 103, - "h": 88 - }, - "frame": { - "x": 0, - "y": 81, - "w": 103, - "h": 88 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0158.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0159.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0161.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0162.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 99, - "h": 81 - }, - "frame": { - "x": 0, - "y": 250, - "w": 99, - "h": 81 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 99, - "h": 81 - }, - "frame": { - "x": 0, - "y": 250, - "w": 99, - "h": 81 - } - }, - { - "filename": "0135.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 99, - "h": 81 - }, - "frame": { - "x": 0, - "y": 250, - "w": 99, - "h": 81 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0163.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0164.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0133.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0134.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 108, - "h": 72 - }, - "frame": { - "x": 232, - "y": 0, - "w": 108, - "h": 72 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 108, - "h": 72 - }, - "frame": { - "x": 232, - "y": 0, - "w": 108, - "h": 72 - } - }, - { - "filename": "0160.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 108, - "h": 72 - }, - "frame": { - "x": 232, - "y": 0, - "w": 108, - "h": 72 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0153.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0154.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0143.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0144.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0151.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0152.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 10, - "w": 104, - "h": 67 - }, - "frame": { - "x": 328, - "y": 72, - "w": 104, - "h": 67 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 10, - "w": 104, - "h": 67 - }, - "frame": { - "x": 328, - "y": 72, - "w": 104, - "h": 67 - } - }, - { - "filename": "0145.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 10, - "w": 104, - "h": 67 - }, - "frame": { - "x": 328, - "y": 72, - "w": 104, - "h": 67 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0141.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0142.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 98, - "h": 73 - }, - "frame": { - "x": 205, - "y": 140, - "w": 98, - "h": 73 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 98, - "h": 73 - }, - "frame": { - "x": 205, - "y": 140, - "w": 98, - "h": 73 - } - }, - { - "filename": "0150.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 98, - "h": 73 - }, - "frame": { - "x": 205, - "y": 140, - "w": 98, - "h": 73 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0136.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0137.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 94, - "h": 75 - }, - "frame": { - "x": 197, - "y": 213, - "w": 94, - "h": 75 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 94, - "h": 75 - }, - "frame": { - "x": 197, - "y": 213, - "w": 94, - "h": 75 - } - }, - { - "filename": "0140.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 94, - "h": 75 - }, - "frame": { - "x": 197, - "y": 213, - "w": 94, - "h": 75 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0146.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0147.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0138.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0139.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0148.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0149.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0165.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 98, - "y": 358, - "w": 93, - "h": 78 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 98, - "y": 358, - "w": 93, - "h": 78 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 191, - "y": 366, - "w": 93, - "h": 78 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 19, - "y": 18, - "w": 73, - "h": 64 - }, - "frame": { - "x": 96, - "y": 436, - "w": 73, - "h": 64 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 28, - "y": 17, - "w": 52, - "h": 65 - }, - "frame": { - "x": 446, - "y": 0, - "w": 52, - "h": 65 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 93, - "h": 79 - }, - "frame": { - "x": 303, - "y": 140, - "w": 93, - "h": 79 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 291, - "y": 219, - "w": 93, - "h": 78 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 291, - "y": 219, - "w": 93, - "h": 78 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 93, - "h": 77 - }, - "frame": { - "x": 286, - "y": 297, - "w": 93, - "h": 77 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 85, - "h": 73 - }, - "frame": { - "x": 284, - "y": 374, - "w": 85, - "h": 73 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 16, - "y": 5, - "w": 75, - "h": 79 - }, - "frame": { - "x": 396, - "y": 139, - "w": 75, - "h": 79 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 85, - "h": 79 - }, - "frame": { - "x": 384, - "y": 219, - "w": 85, - "h": 79 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 16, - "y": 15, - "w": 78, - "h": 67 - }, - "frame": { - "x": 379, - "y": 298, - "w": 78, - "h": 67 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 16, - "y": 15, - "w": 78, - "h": 67 - }, - "frame": { - "x": 379, - "y": 298, - "w": 78, - "h": 67 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 21, - "y": 8, - "w": 66, - "h": 76 - }, - "frame": { - "x": 369, - "y": 374, - "w": 66, - "h": 76 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 21, - "y": 8, - "w": 66, - "h": 76 - }, - "frame": { - "x": 369, - "y": 374, - "w": 66, - "h": 76 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 25, - "y": 12, - "w": 59, - "h": 70 - }, - "frame": { - "x": 435, - "y": 365, - "w": 59, - "h": 70 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 25, - "y": 19, - "w": 66, - "h": 63 - }, - "frame": { - "x": 432, - "y": 72, - "w": 66, - "h": 63 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 29, - "y": 20, - "w": 60, - "h": 62 - }, - "frame": { - "x": 435, - "y": 435, - "w": 60, - "h": 62 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 29, - "y": 20, - "w": 60, - "h": 62 - }, - "frame": { - "x": 435, - "y": 435, - "w": 60, - "h": 62 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 16, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 16, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 17, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 17, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 14, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 14, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 15, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 15, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 16, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 16, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 17, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 17, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a1c52466e8cdc83633a9fbd5b8675ca7:19652e451f806ac9b4bbb01e17b071df:12f3eae8283ab6c8e555ff3e46b7d8dc$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/563_2.png b/public/images/pokemon/variant/563_2.png deleted file mode 100644 index 3a0e775d833..00000000000 Binary files a/public/images/pokemon/variant/563_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/563_3.json b/public/images/pokemon/variant/563_3.json deleted file mode 100644 index 9f6a43a4a97..00000000000 --- a/public/images/pokemon/variant/563_3.json +++ /dev/null @@ -1,3485 +0,0 @@ -{ - "textures": [ - { - "image": "563_3.png", - "format": "RGBA8888", - "size": { - "w": 500, - "h": 500 - }, - "scale": 1, - "frames": [ - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0156.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0157.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 116, - "h": 81 - }, - "frame": { - "x": 0, - "y": 0, - "w": 116, - "h": 81 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 103, - "h": 88 - }, - "frame": { - "x": 0, - "y": 81, - "w": 103, - "h": 88 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 103, - "h": 88 - }, - "frame": { - "x": 0, - "y": 81, - "w": 103, - "h": 88 - } - }, - { - "filename": "0155.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 19, - "y": 0, - "w": 103, - "h": 88 - }, - "frame": { - "x": 0, - "y": 81, - "w": 103, - "h": 88 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0158.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0159.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 13, - "w": 116, - "h": 69 - }, - "frame": { - "x": 116, - "y": 0, - "w": 116, - "h": 69 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0161.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0162.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 101, - "h": 81 - }, - "frame": { - "x": 0, - "y": 169, - "w": 101, - "h": 81 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 99, - "h": 81 - }, - "frame": { - "x": 0, - "y": 250, - "w": 99, - "h": 81 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 99, - "h": 81 - }, - "frame": { - "x": 0, - "y": 250, - "w": 99, - "h": 81 - } - }, - { - "filename": "0135.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 99, - "h": 81 - }, - "frame": { - "x": 0, - "y": 250, - "w": 99, - "h": 81 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0163.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0164.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 98, - "h": 81 - }, - "frame": { - "x": 0, - "y": 331, - "w": 98, - "h": 81 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0133.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0134.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 96, - "h": 81 - }, - "frame": { - "x": 0, - "y": 412, - "w": 96, - "h": 81 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 108, - "h": 72 - }, - "frame": { - "x": 232, - "y": 0, - "w": 108, - "h": 72 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 108, - "h": 72 - }, - "frame": { - "x": 232, - "y": 0, - "w": 108, - "h": 72 - } - }, - { - "filename": "0160.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 0, - "y": 10, - "w": 108, - "h": 72 - }, - "frame": { - "x": 232, - "y": 0, - "w": 108, - "h": 72 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0153.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0154.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 13, - "y": 13, - "w": 106, - "h": 72 - }, - "frame": { - "x": 340, - "y": 0, - "w": 106, - "h": 72 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0143.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0144.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 11, - "w": 107, - "h": 68 - }, - "frame": { - "x": 116, - "y": 69, - "w": 107, - "h": 68 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0151.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0152.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 15, - "w": 105, - "h": 68 - }, - "frame": { - "x": 223, - "y": 72, - "w": 105, - "h": 68 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 10, - "w": 104, - "h": 67 - }, - "frame": { - "x": 328, - "y": 72, - "w": 104, - "h": 67 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 10, - "w": 104, - "h": 67 - }, - "frame": { - "x": 328, - "y": 72, - "w": 104, - "h": 67 - } - }, - { - "filename": "0145.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 10, - "w": 104, - "h": 67 - }, - "frame": { - "x": 328, - "y": 72, - "w": 104, - "h": 67 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0141.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0142.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 8, - "y": 14, - "w": 102, - "h": 68 - }, - "frame": { - "x": 103, - "y": 137, - "w": 102, - "h": 68 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 98, - "h": 73 - }, - "frame": { - "x": 205, - "y": 140, - "w": 98, - "h": 73 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 98, - "h": 73 - }, - "frame": { - "x": 205, - "y": 140, - "w": 98, - "h": 73 - } - }, - { - "filename": "0150.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 98, - "h": 73 - }, - "frame": { - "x": 205, - "y": 140, - "w": 98, - "h": 73 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0136.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0137.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 96, - "h": 75 - }, - "frame": { - "x": 101, - "y": 205, - "w": 96, - "h": 75 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 94, - "h": 75 - }, - "frame": { - "x": 197, - "y": 213, - "w": 94, - "h": 75 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 94, - "h": 75 - }, - "frame": { - "x": 197, - "y": 213, - "w": 94, - "h": 75 - } - }, - { - "filename": "0140.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 7, - "w": 94, - "h": 75 - }, - "frame": { - "x": 197, - "y": 213, - "w": 94, - "h": 75 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0146.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0147.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 94, - "h": 78 - }, - "frame": { - "x": 99, - "y": 280, - "w": 94, - "h": 78 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0138.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0139.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0148.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0149.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0165.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 193, - "y": 288, - "w": 93, - "h": 78 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 98, - "y": 358, - "w": 93, - "h": 78 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 98, - "y": 358, - "w": 93, - "h": 78 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 191, - "y": 366, - "w": 93, - "h": 78 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 19, - "y": 18, - "w": 73, - "h": 64 - }, - "frame": { - "x": 96, - "y": 436, - "w": 73, - "h": 64 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 28, - "y": 17, - "w": 52, - "h": 65 - }, - "frame": { - "x": 446, - "y": 0, - "w": 52, - "h": 65 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 93, - "h": 79 - }, - "frame": { - "x": 303, - "y": 140, - "w": 93, - "h": 79 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 291, - "y": 219, - "w": 93, - "h": 78 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 93, - "h": 78 - }, - "frame": { - "x": 291, - "y": 219, - "w": 93, - "h": 78 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 93, - "h": 77 - }, - "frame": { - "x": 286, - "y": 297, - "w": 93, - "h": 77 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 12, - "y": 9, - "w": 85, - "h": 73 - }, - "frame": { - "x": 284, - "y": 374, - "w": 85, - "h": 73 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 16, - "y": 5, - "w": 75, - "h": 79 - }, - "frame": { - "x": 396, - "y": 139, - "w": 75, - "h": 79 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 85, - "h": 79 - }, - "frame": { - "x": 384, - "y": 219, - "w": 85, - "h": 79 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 16, - "y": 15, - "w": 78, - "h": 67 - }, - "frame": { - "x": 379, - "y": 298, - "w": 78, - "h": 67 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 16, - "y": 15, - "w": 78, - "h": 67 - }, - "frame": { - "x": 379, - "y": 298, - "w": 78, - "h": 67 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 21, - "y": 8, - "w": 66, - "h": 76 - }, - "frame": { - "x": 369, - "y": 374, - "w": 66, - "h": 76 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 21, - "y": 8, - "w": 66, - "h": 76 - }, - "frame": { - "x": 369, - "y": 374, - "w": 66, - "h": 76 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 25, - "y": 12, - "w": 59, - "h": 70 - }, - "frame": { - "x": 435, - "y": 365, - "w": 59, - "h": 70 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 25, - "y": 19, - "w": 66, - "h": 63 - }, - "frame": { - "x": 432, - "y": 72, - "w": 66, - "h": 63 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 29, - "y": 20, - "w": 60, - "h": 62 - }, - "frame": { - "x": 435, - "y": 435, - "w": 60, - "h": 62 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 29, - "y": 20, - "w": 60, - "h": 62 - }, - "frame": { - "x": 435, - "y": 435, - "w": 60, - "h": 62 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 16, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 16, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 17, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 17, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 14, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 14, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 15, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 15, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 16, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 16, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 17, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 17, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 122, - "h": 88 - }, - "spriteSourceSize": { - "x": 37, - "y": 20, - "w": 37, - "h": 61 - }, - "frame": { - "x": 457, - "y": 298, - "w": 37, - "h": 61 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a1c52466e8cdc83633a9fbd5b8675ca7:19652e451f806ac9b4bbb01e17b071df:12f3eae8283ab6c8e555ff3e46b7d8dc$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/563_3.png b/public/images/pokemon/variant/563_3.png deleted file mode 100644 index d7988d44d23..00000000000 Binary files a/public/images/pokemon/variant/563_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/622.json b/public/images/pokemon/variant/622.json index e43817498e7..9d3d631c473 100644 --- a/public/images/pokemon/variant/622.json +++ b/public/images/pokemon/variant/622.json @@ -1,20 +1,4 @@ { - "0": { - "106b63": "0d1e10", - "004a52": "102c16", - "84cece": "758076", - "191921": "191921", - "29848c": "224427", - "298c8c": "1c3820", - "5aada5": "3e5d43", - "106b7b": "102c16", - "ffefa5": "ff9942", - "dece94": "e46424", - "bdad73": "cb3000", - "6b4200": "54190e", - "c59c52": "a65c3f", - "9c7329": "763826" - }, "1": { "106b63": "732d02", "004a52": "4c1b11", diff --git a/public/images/pokemon/variant/622_1.png b/public/images/pokemon/variant/622_1.png deleted file mode 100644 index 615a9a629ae..00000000000 Binary files a/public/images/pokemon/variant/622_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/622_2.png b/public/images/pokemon/variant/622_2.png deleted file mode 100644 index 1ce1c3e9f0e..00000000000 Binary files a/public/images/pokemon/variant/622_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/623.json b/public/images/pokemon/variant/623.json index d4a00ad94ba..2a9f0774f9a 100644 --- a/public/images/pokemon/variant/623.json +++ b/public/images/pokemon/variant/623.json @@ -1,19 +1,4 @@ { - "0": { - "297b8c": "152c18", - "105263": "041408", - "5aa5a5": "2b3c2d", - "195a7b": "051b0a", - "84c5ce": "3f4a3f", - "003a52": "020e06", - "191921": "191921", - "ffefa5": "ff9942", - "bdad73": "e46424", - "dece94": "cb3000", - "6b4200": "5e1c0b", - "c59c52": "ad5735", - "9c7329": "943b21" - }, "1": { "297b8c": "6b2808", "105263": "8b2a05", diff --git a/public/images/pokemon/variant/623_1.json b/public/images/pokemon/variant/623_1.json deleted file mode 100644 index 3a12266f102..00000000000 --- a/public/images/pokemon/variant/623_1.json +++ /dev/null @@ -1,3590 +0,0 @@ -{ - "textures": [ - { - "image": "623_1.png", - "format": "RGBA8888", - "size": { - "w": 401, - "h": 401 - }, - "scale": 1, - "frames": [ - { - "filename": "0121.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 80 - }, - "frame": { - "x": 0, - "y": 0, - "w": 83, - "h": 80 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 80 - }, - "frame": { - "x": 0, - "y": 0, - "w": 83, - "h": 80 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 80 - }, - "frame": { - "x": 0, - "y": 80, - "w": 83, - "h": 80 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 80 - }, - "frame": { - "x": 0, - "y": 80, - "w": 83, - "h": 80 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 80 - }, - "frame": { - "x": 83, - "y": 0, - "w": 83, - "h": 80 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 83, - "h": 80 - }, - "frame": { - "x": 83, - "y": 0, - "w": 83, - "h": 80 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 83, - "h": 79 - }, - "frame": { - "x": 0, - "y": 160, - "w": 83, - "h": 79 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 83, - "h": 79 - }, - "frame": { - "x": 0, - "y": 160, - "w": 83, - "h": 79 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 83, - "h": 79 - }, - "frame": { - "x": 83, - "y": 80, - "w": 83, - "h": 79 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 83, - "h": 79 - }, - "frame": { - "x": 83, - "y": 80, - "w": 83, - "h": 79 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 83, - "h": 79 - }, - "frame": { - "x": 166, - "y": 0, - "w": 83, - "h": 79 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 83, - "h": 79 - }, - "frame": { - "x": 166, - "y": 0, - "w": 83, - "h": 79 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 80 - }, - "frame": { - "x": 0, - "y": 239, - "w": 81, - "h": 80 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 80 - }, - "frame": { - "x": 0, - "y": 239, - "w": 81, - "h": 80 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 80 - }, - "frame": { - "x": 83, - "y": 159, - "w": 81, - "h": 80 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 80 - }, - "frame": { - "x": 83, - "y": 159, - "w": 81, - "h": 80 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 80 - }, - "frame": { - "x": 166, - "y": 79, - "w": 81, - "h": 80 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 81, - "h": 80 - }, - "frame": { - "x": 166, - "y": 79, - "w": 81, - "h": 80 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0135.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0136.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0137.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0138.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0169.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0170.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 0, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 81, - "y": 239, - "w": 79, - "h": 80 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 81, - "y": 239, - "w": 79, - "h": 80 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 81, - "y": 239, - "w": 79, - "h": 80 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 81, - "y": 239, - "w": 79, - "h": 80 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 81, - "y": 239, - "w": 79, - "h": 80 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 81, - "y": 239, - "w": 79, - "h": 80 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 81, - "y": 239, - "w": 79, - "h": 80 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 81, - "y": 239, - "w": 79, - "h": 80 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 81, - "y": 239, - "w": 79, - "h": 80 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 81, - "y": 239, - "w": 79, - "h": 80 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 81, - "y": 239, - "w": 79, - "h": 80 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 81, - "y": 239, - "w": 79, - "h": 80 - } - }, - { - "filename": "0139.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 81, - "y": 239, - "w": 79, - "h": 80 - } - }, - { - "filename": "0140.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 81, - "y": 239, - "w": 79, - "h": 80 - } - }, - { - "filename": "0167.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 81, - "y": 239, - "w": 79, - "h": 80 - } - }, - { - "filename": "0168.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 81, - "y": 239, - "w": 79, - "h": 80 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 164, - "y": 159, - "w": 79, - "h": 80 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 164, - "y": 159, - "w": 79, - "h": 80 - } - }, - { - "filename": "0133.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 164, - "y": 159, - "w": 79, - "h": 80 - } - }, - { - "filename": "0134.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 164, - "y": 159, - "w": 79, - "h": 80 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 79, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 79, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 160, - "y": 239, - "w": 79, - "h": 80 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 160, - "y": 239, - "w": 79, - "h": 80 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 158, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 158, - "y": 319, - "w": 79, - "h": 80 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 249, - "y": 0, - "w": 79, - "h": 79 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 249, - "y": 0, - "w": 79, - "h": 79 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 249, - "y": 0, - "w": 79, - "h": 79 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 249, - "y": 0, - "w": 79, - "h": 79 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 249, - "y": 0, - "w": 79, - "h": 79 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 249, - "y": 0, - "w": 79, - "h": 79 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 249, - "y": 0, - "w": 79, - "h": 79 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 249, - "y": 0, - "w": 79, - "h": 79 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 249, - "y": 0, - "w": 79, - "h": 79 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 249, - "y": 0, - "w": 79, - "h": 79 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 249, - "y": 0, - "w": 79, - "h": 79 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 249, - "y": 0, - "w": 79, - "h": 79 - } - }, - { - "filename": "0141.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 249, - "y": 0, - "w": 79, - "h": 79 - } - }, - { - "filename": "0142.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 249, - "y": 0, - "w": 79, - "h": 79 - } - }, - { - "filename": "0165.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 249, - "y": 0, - "w": 79, - "h": 79 - } - }, - { - "filename": "0166.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 249, - "y": 0, - "w": 79, - "h": 79 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 247, - "y": 79, - "w": 79, - "h": 80 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 79, - "h": 80 - }, - "frame": { - "x": 247, - "y": 79, - "w": 79, - "h": 80 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 243, - "y": 159, - "w": 79, - "h": 79 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 243, - "y": 159, - "w": 79, - "h": 79 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 243, - "y": 159, - "w": 79, - "h": 79 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 243, - "y": 159, - "w": 79, - "h": 79 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 243, - "y": 159, - "w": 79, - "h": 79 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 243, - "y": 159, - "w": 79, - "h": 79 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 243, - "y": 159, - "w": 79, - "h": 79 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 243, - "y": 159, - "w": 79, - "h": 79 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 243, - "y": 159, - "w": 79, - "h": 79 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 243, - "y": 159, - "w": 79, - "h": 79 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 243, - "y": 159, - "w": 79, - "h": 79 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 243, - "y": 159, - "w": 79, - "h": 79 - } - }, - { - "filename": "0143.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 243, - "y": 159, - "w": 79, - "h": 79 - } - }, - { - "filename": "0144.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 243, - "y": 159, - "w": 79, - "h": 79 - } - }, - { - "filename": "0163.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 243, - "y": 159, - "w": 79, - "h": 79 - } - }, - { - "filename": "0164.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 79, - "h": 79 - }, - "frame": { - "x": 243, - "y": 159, - "w": 79, - "h": 79 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 79, - "h": 78 - }, - "frame": { - "x": 322, - "y": 159, - "w": 79, - "h": 78 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 79, - "h": 78 - }, - "frame": { - "x": 322, - "y": 159, - "w": 79, - "h": 78 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 79, - "h": 78 - }, - "frame": { - "x": 322, - "y": 159, - "w": 79, - "h": 78 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 79, - "h": 78 - }, - "frame": { - "x": 322, - "y": 159, - "w": 79, - "h": 78 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 79, - "h": 78 - }, - "frame": { - "x": 322, - "y": 159, - "w": 79, - "h": 78 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 79, - "h": 78 - }, - "frame": { - "x": 322, - "y": 159, - "w": 79, - "h": 78 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 79, - "h": 78 - }, - "frame": { - "x": 322, - "y": 159, - "w": 79, - "h": 78 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 79, - "h": 78 - }, - "frame": { - "x": 322, - "y": 159, - "w": 79, - "h": 78 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 79, - "h": 78 - }, - "frame": { - "x": 322, - "y": 159, - "w": 79, - "h": 78 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 79, - "h": 78 - }, - "frame": { - "x": 322, - "y": 159, - "w": 79, - "h": 78 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 79, - "h": 78 - }, - "frame": { - "x": 322, - "y": 159, - "w": 79, - "h": 78 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 79, - "h": 78 - }, - "frame": { - "x": 322, - "y": 159, - "w": 79, - "h": 78 - } - }, - { - "filename": "0145.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 79, - "h": 78 - }, - "frame": { - "x": 322, - "y": 159, - "w": 79, - "h": 78 - } - }, - { - "filename": "0146.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 79, - "h": 78 - }, - "frame": { - "x": 322, - "y": 159, - "w": 79, - "h": 78 - } - }, - { - "filename": "0161.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 79, - "h": 78 - }, - "frame": { - "x": 322, - "y": 159, - "w": 79, - "h": 78 - } - }, - { - "filename": "0162.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 79, - "h": 78 - }, - "frame": { - "x": 322, - "y": 159, - "w": 79, - "h": 78 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 79, - "h": 77 - }, - "frame": { - "x": 322, - "y": 237, - "w": 79, - "h": 77 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 79, - "h": 77 - }, - "frame": { - "x": 322, - "y": 237, - "w": 79, - "h": 77 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 79, - "h": 77 - }, - "frame": { - "x": 322, - "y": 237, - "w": 79, - "h": 77 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 79, - "h": 77 - }, - "frame": { - "x": 322, - "y": 237, - "w": 79, - "h": 77 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 79, - "h": 77 - }, - "frame": { - "x": 322, - "y": 237, - "w": 79, - "h": 77 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 79, - "h": 77 - }, - "frame": { - "x": 322, - "y": 237, - "w": 79, - "h": 77 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 79, - "h": 77 - }, - "frame": { - "x": 322, - "y": 237, - "w": 79, - "h": 77 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 79, - "h": 77 - }, - "frame": { - "x": 322, - "y": 237, - "w": 79, - "h": 77 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 79, - "h": 77 - }, - "frame": { - "x": 322, - "y": 237, - "w": 79, - "h": 77 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 79, - "h": 77 - }, - "frame": { - "x": 322, - "y": 237, - "w": 79, - "h": 77 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 79, - "h": 77 - }, - "frame": { - "x": 322, - "y": 237, - "w": 79, - "h": 77 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 79, - "h": 77 - }, - "frame": { - "x": 322, - "y": 237, - "w": 79, - "h": 77 - } - }, - { - "filename": "0147.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 79, - "h": 77 - }, - "frame": { - "x": 322, - "y": 237, - "w": 79, - "h": 77 - } - }, - { - "filename": "0148.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 79, - "h": 77 - }, - "frame": { - "x": 322, - "y": 237, - "w": 79, - "h": 77 - } - }, - { - "filename": "0159.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 79, - "h": 77 - }, - "frame": { - "x": 322, - "y": 237, - "w": 79, - "h": 77 - } - }, - { - "filename": "0160.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 79, - "h": 77 - }, - "frame": { - "x": 322, - "y": 237, - "w": 79, - "h": 77 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 81, - "h": 77 - }, - "frame": { - "x": 239, - "y": 239, - "w": 81, - "h": 77 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 81, - "h": 77 - }, - "frame": { - "x": 239, - "y": 239, - "w": 81, - "h": 77 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 81, - "h": 77 - }, - "frame": { - "x": 239, - "y": 239, - "w": 81, - "h": 77 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 81, - "h": 77 - }, - "frame": { - "x": 239, - "y": 239, - "w": 81, - "h": 77 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 81, - "h": 77 - }, - "frame": { - "x": 239, - "y": 239, - "w": 81, - "h": 77 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 81, - "h": 77 - }, - "frame": { - "x": 239, - "y": 239, - "w": 81, - "h": 77 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 81, - "h": 77 - }, - "frame": { - "x": 239, - "y": 239, - "w": 81, - "h": 77 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 81, - "h": 77 - }, - "frame": { - "x": 239, - "y": 239, - "w": 81, - "h": 77 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 81, - "h": 77 - }, - "frame": { - "x": 239, - "y": 239, - "w": 81, - "h": 77 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 81, - "h": 77 - }, - "frame": { - "x": 239, - "y": 239, - "w": 81, - "h": 77 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 81, - "h": 77 - }, - "frame": { - "x": 239, - "y": 239, - "w": 81, - "h": 77 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 81, - "h": 77 - }, - "frame": { - "x": 239, - "y": 239, - "w": 81, - "h": 77 - } - }, - { - "filename": "0149.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 81, - "h": 77 - }, - "frame": { - "x": 239, - "y": 239, - "w": 81, - "h": 77 - } - }, - { - "filename": "0150.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 81, - "h": 77 - }, - "frame": { - "x": 239, - "y": 239, - "w": 81, - "h": 77 - } - }, - { - "filename": "0157.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 81, - "h": 77 - }, - "frame": { - "x": 239, - "y": 239, - "w": 81, - "h": 77 - } - }, - { - "filename": "0158.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 81, - "h": 77 - }, - "frame": { - "x": 239, - "y": 239, - "w": 81, - "h": 77 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 76 - }, - "frame": { - "x": 320, - "y": 314, - "w": 81, - "h": 76 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 76 - }, - "frame": { - "x": 320, - "y": 314, - "w": 81, - "h": 76 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 76 - }, - "frame": { - "x": 320, - "y": 314, - "w": 81, - "h": 76 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 76 - }, - "frame": { - "x": 320, - "y": 314, - "w": 81, - "h": 76 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 76 - }, - "frame": { - "x": 320, - "y": 314, - "w": 81, - "h": 76 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 76 - }, - "frame": { - "x": 320, - "y": 314, - "w": 81, - "h": 76 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 76 - }, - "frame": { - "x": 320, - "y": 314, - "w": 81, - "h": 76 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 76 - }, - "frame": { - "x": 320, - "y": 314, - "w": 81, - "h": 76 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 76 - }, - "frame": { - "x": 320, - "y": 314, - "w": 81, - "h": 76 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 76 - }, - "frame": { - "x": 320, - "y": 314, - "w": 81, - "h": 76 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 76 - }, - "frame": { - "x": 320, - "y": 314, - "w": 81, - "h": 76 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 76 - }, - "frame": { - "x": 320, - "y": 314, - "w": 81, - "h": 76 - } - }, - { - "filename": "0151.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 76 - }, - "frame": { - "x": 320, - "y": 314, - "w": 81, - "h": 76 - } - }, - { - "filename": "0152.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 76 - }, - "frame": { - "x": 320, - "y": 314, - "w": 81, - "h": 76 - } - }, - { - "filename": "0155.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 76 - }, - "frame": { - "x": 320, - "y": 314, - "w": 81, - "h": 76 - } - }, - { - "filename": "0156.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 76 - }, - "frame": { - "x": 320, - "y": 314, - "w": 81, - "h": 76 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 82, - "h": 75 - }, - "frame": { - "x": 237, - "y": 319, - "w": 82, - "h": 75 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 82, - "h": 75 - }, - "frame": { - "x": 237, - "y": 319, - "w": 82, - "h": 75 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 82, - "h": 75 - }, - "frame": { - "x": 237, - "y": 319, - "w": 82, - "h": 75 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 82, - "h": 75 - }, - "frame": { - "x": 237, - "y": 319, - "w": 82, - "h": 75 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 82, - "h": 75 - }, - "frame": { - "x": 237, - "y": 319, - "w": 82, - "h": 75 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 82, - "h": 75 - }, - "frame": { - "x": 237, - "y": 319, - "w": 82, - "h": 75 - } - }, - { - "filename": "0153.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 82, - "h": 75 - }, - "frame": { - "x": 237, - "y": 319, - "w": 82, - "h": 75 - } - }, - { - "filename": "0154.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 83, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 82, - "h": 75 - }, - "frame": { - "x": 237, - "y": 319, - "w": 82, - "h": 75 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:76e8001e2d30637bbf46d66a3c01cc86:32d4799151bd0a494e1cc16c07cc1afb:869abf8e0bcb859d5abfb33d03e5db07$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/623_1.png b/public/images/pokemon/variant/623_1.png deleted file mode 100644 index 836f46d459f..00000000000 Binary files a/public/images/pokemon/variant/623_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/623_2.png b/public/images/pokemon/variant/623_2.png deleted file mode 100644 index fc7de7bdccb..00000000000 Binary files a/public/images/pokemon/variant/623_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/802.json b/public/images/pokemon/variant/802.json index 841bb430fad..95a92d8babc 100644 --- a/public/images/pokemon/variant/802.json +++ b/public/images/pokemon/variant/802.json @@ -24,9 +24,9 @@ "f2a455": "ff9a50" }, "2": { - "2c3e30": "5a0423", - "6a806d": "ce3e63", - "536155": "97123b", + "2c3e30": "508294", + "6a806d": "a7eaee", + "536155": "82b7c3", "101010": "101010", "2d3137": "5a0423", "747778": "ce3e63", diff --git a/public/images/pokemon/variant/_masterlist.json b/public/images/pokemon/variant/_masterlist.json index e2feeaa9e55..c936fc8d0a1 100644 --- a/public/images/pokemon/variant/_masterlist.json +++ b/public/images/pokemon/variant/_masterlist.json @@ -125,12 +125,12 @@ 1 ], "41": [ - 1, + 0, 1, 1 ], "42": [ - 1, + 0, 1, 1 ], @@ -364,6 +364,11 @@ 1, 1 ], + "133-partner": [ + 0, + 1, + 1 + ], "134": [ 0, 1, @@ -480,7 +485,7 @@ 2 ], "169": [ - 1, + 0, 1, 1 ], @@ -1721,8 +1726,8 @@ ], "563": [ 0, - 2, - 2 + 1, + 1 ], "568": [ 0, @@ -1895,12 +1900,12 @@ 1 ], "622": [ - 1, + 0, 1, 1 ], "623": [ - 2, + 0, 1, 1 ], @@ -1939,36 +1944,6 @@ 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, @@ -3389,6 +3364,11 @@ 1, 1, 1 + ], + "6215": [ + 0, + 1, + 1 ] }, "back": { @@ -3518,12 +3498,12 @@ 1 ], "41": [ - 1, + 0, 1, 1 ], "42": [ - 1, + 0, 1, 1 ], @@ -3757,6 +3737,11 @@ 1, 1 ], + "133-partner": [ + 0, + 1, + 1 + ], "134": [ 0, 1, @@ -3840,7 +3825,7 @@ "150-mega-y": [ 0, 1, - 0 + 1 ], "150": [ 0, @@ -3873,7 +3858,7 @@ 1 ], "169": [ - 1, + 0, 1, 1 ], @@ -5288,12 +5273,12 @@ 1 ], "622": [ - 1, + 0, 1, 1 ], "623": [ - 2, + 0, 1, 1 ], @@ -6772,6 +6757,11 @@ 1, 1, 1 + ], + "6215": [ + 0, + 1, + 1 ] } }, diff --git a/public/images/pokemon/variant/back/133-partner.json b/public/images/pokemon/variant/back/133-partner.json new file mode 100644 index 00000000000..d48eaad4364 --- /dev/null +++ b/public/images/pokemon/variant/back/133-partner.json @@ -0,0 +1,22 @@ +{ + "1": { + "734a4a": "13235c", + "523121": "0b1145", + "d69c4a": "90c1f1", + "a5634a": "5982b7", + "000000": "000000", + "ffe6ad": "d7ebff", + "bd9c7b": "5f6f94", + "e6c594": "8ca8d2" + }, + "2": { + "734a4a": "5e3372", + "523121": "461144", + "d69c4a": "bf88cb", + "a5634a": "915ea3", + "000000": "000000", + "ffe6ad": "f3e6e3", + "bd9c7b": "a07c83", + "e6c594": "cfa7a9" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/150-mega-y.json b/public/images/pokemon/variant/back/150-mega-y.json index d00e44e0579..daae4ff6ca7 100644 --- a/public/images/pokemon/variant/back/150-mega-y.json +++ b/public/images/pokemon/variant/back/150-mega-y.json @@ -11,5 +11,18 @@ "6e318c": "318c8a", "f8f8f8": "f8f8f8", "f25555": "4bac9a" + }, + "2": { + "101010": "101010", + "36364d": "884c17", + "461f59": "59201f", + "6e318c": "8c3331", + "7a7a99": "d68f40", + "9643bf": "bf4c43", + "be55f2": "f26155", + "acacbf": "edaf5b", + "f25555": "f25555", + "f8f8f8": "ffdd98", + "dadaf2": "ffdd98" } -} \ No newline at end of file +} diff --git a/public/images/pokemon/variant/back/169.json b/public/images/pokemon/variant/back/169.json index b66c1c82caa..34cfabeb573 100644 --- a/public/images/pokemon/variant/back/169.json +++ b/public/images/pokemon/variant/back/169.json @@ -1,27 +1,18 @@ { - "0": { - "63197b": "142557", - "a55ace": "6265b4", - "7b4a9c": "323f81", - "b57bce": "99a3ee", - "101010": "101010", - "08426b": "206f9e", - "216b94": "4aa6ce" - }, "1": { - "63197b": "9c528c", - "a55ace": "ffb5f7", - "7b4a9c": "d684ce", - "b57bce": "ffd6ef", + "63197b": "14093b", + "a55ace": "3d4381", + "7b4a9c": "2f2a5f", + "b57bce": "666fb4", "101010": "101010", - "08426b": "638400", - "216b94": "8ca508" + "08426b": "b06130", + "216b94": "ffb049" }, "2": { "63197b": "3c1e39", - "a55ace": "b5a3b3", - "7b4a9c": "958093", - "b57bce": "d4c3d1", + "a55ace": "b49db2", + "7b4a9c": "80607b", + "b57bce": "c8b6c2", "101010": "101010", "08426b": "901606", "216b94": "b52c0c" diff --git a/public/images/pokemon/variant/back/41.json b/public/images/pokemon/variant/back/41.json index 6a75080db16..42283672198 100644 --- a/public/images/pokemon/variant/back/41.json +++ b/public/images/pokemon/variant/back/41.json @@ -1,16 +1,4 @@ { - "0": { - "101010": "101010", - "8cb5ef": "6569c0", - "4a427b": "142557", - "637bb5": "323f81", - "73215a": "196297", - "b5529c": "61b6da", - "bdceff": "959ee9", - "ffffff": "ffffff", - "636363": "636363", - "d6d6d6": "d6d6d6" - }, "1": { "101010": "101010", "8cb5ef": "205182", @@ -25,12 +13,12 @@ }, "2": { "101010": "101010", - "8cb5ef": "c1aec0", + "8cb5ef": "cbabca", "4a427b": "4d3259", - "637bb5": "866881", + "637bb5": "916c8b", "73215a": "670f10", "b5529c": "94241c", - "bdceff": "dfcddd", + "bdceff": "e8d2e6", "ffffff": "ffffff", "636363": "636363", "d6d6d6": "d6d6d6" diff --git a/public/images/pokemon/variant/back/41_1.png b/public/images/pokemon/variant/back/41_1.png deleted file mode 100644 index 6943a2eddb4..00000000000 Binary files a/public/images/pokemon/variant/back/41_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/back/42.json b/public/images/pokemon/variant/back/42.json index 54417a7af59..df3cf67d3ef 100644 --- a/public/images/pokemon/variant/back/42.json +++ b/public/images/pokemon/variant/back/42.json @@ -1,15 +1,4 @@ { - "0": { - "3a3a7b": "142557", - "6384ce": "323f81", - "adceff": "99a3ee", - "5aadef": "6265b4", - "631052": "093263", - "000000": "000000", - "ce6bb5": "61b6da", - "ad52ad": "348cc1", - "943a7b": "348cc1" - }, "1": { "3a3a7b": "14093b", "6384ce": "12245c", @@ -22,10 +11,10 @@ "943a7b": "af4e0c" }, "2": { - "3a3a7b": "584055", - "6384ce": "866881", + "3a3a7b": "3d2349", + "6384ce": "916c8b", "adceff": "dfcddd", - "5aadef": "c1aec0", + "5aadef": "cbabca", "631052": "54070c", "000000": "000000", "ce6bb5": "bc3b1d", diff --git a/public/images/pokemon/variant/back/42_1.png b/public/images/pokemon/variant/back/42_1.png deleted file mode 100644 index 2f649cdc649..00000000000 Binary files a/public/images/pokemon/variant/back/42_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/back/445.json b/public/images/pokemon/variant/back/445.json index c5b10066d10..7bf76d03212 100644 --- a/public/images/pokemon/variant/back/445.json +++ b/public/images/pokemon/variant/back/445.json @@ -1,8 +1,8 @@ { "0": { - "292952": "091f4e", - "5a63ad": "33719e", - "42428c": "1e4b77", + "292952": "0a1347", + "5a63ad": "226596", + "42428c": "264074", "7b7bce": "65a2d5", "101010": "101010", "c59410": "3aadc5", diff --git a/public/images/pokemon/variant/back/622.json b/public/images/pokemon/variant/back/622.json index 9ad7426a9d7..97f38954bab 100644 --- a/public/images/pokemon/variant/back/622.json +++ b/public/images/pokemon/variant/back/622.json @@ -1,20 +1,4 @@ { - "0": { - "298c8c": "427373", - "5aada5": "6b9c94", - "84cece": "94bdbd", - "004a52": "192121", - "106b63": "21524a", - "191921": "191921", - "106b7b": "293a42", - "29848c": "424a5a", - "6b4200": "523a10", - "c59c52": "b59463", - "9c7329": "846b3a", - "dece94": "b5de21", - "ffefa5": "d6ff42", - "bdad73": "94bd00" - }, "1": { "298c8c": "793907", "5aada5": "9d5915", diff --git a/public/images/pokemon/variant/back/622_1.png b/public/images/pokemon/variant/back/622_1.png deleted file mode 100644 index 8caa7b15ac0..00000000000 Binary files a/public/images/pokemon/variant/back/622_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/back/622_2.png b/public/images/pokemon/variant/back/622_2.png deleted file mode 100644 index 9e57b6fd73a..00000000000 Binary files a/public/images/pokemon/variant/back/622_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/back/623.json b/public/images/pokemon/variant/back/623.json index 56017b98f59..7c3429ecb26 100644 --- a/public/images/pokemon/variant/back/623.json +++ b/public/images/pokemon/variant/back/623.json @@ -1,16 +1,4 @@ { - "0": { - "003a52": "020e06", - "195a7b": "051b0a", - "191921": "191921", - "297b8c": "152c18", - "84c5ce": "3f4a3f", - "5aa5a5": "2b3c2d", - "105263": "041408", - "6b4200": "54190e", - "9c7329": "763826", - "c59c52": "a65c3f" - }, "1": { "003a52": "471205", "195a7b": "4d0a00", diff --git a/public/images/pokemon/variant/back/623_1.json b/public/images/pokemon/variant/back/623_1.json deleted file mode 100644 index 893fe66c597..00000000000 --- a/public/images/pokemon/variant/back/623_1.json +++ /dev/null @@ -1,3590 +0,0 @@ -{ - "textures": [ - { - "image": "623_1.png", - "format": "RGBA8888", - "size": { - "w": 392, - "h": 392 - }, - "scale": 1, - "frames": [ - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 78, - "h": 79 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 79 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 78, - "h": 79 - }, - "frame": { - "x": 0, - "y": 0, - "w": 78, - "h": 79 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 78, - "h": 78 - }, - "frame": { - "x": 0, - "y": 79, - "w": 78, - "h": 78 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 78, - "h": 78 - }, - "frame": { - "x": 0, - "y": 79, - "w": 78, - "h": 78 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 78, - "h": 78 - }, - "frame": { - "x": 78, - "y": 0, - "w": 78, - "h": 78 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 78, - "h": 78 - }, - "frame": { - "x": 78, - "y": 0, - "w": 78, - "h": 78 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 78, - "h": 78 - }, - "frame": { - "x": 78, - "y": 0, - "w": 78, - "h": 78 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 78, - "h": 78 - }, - "frame": { - "x": 78, - "y": 0, - "w": 78, - "h": 78 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 78, - "h": 78 - }, - "frame": { - "x": 0, - "y": 157, - "w": 78, - "h": 78 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 78, - "h": 78 - }, - "frame": { - "x": 0, - "y": 157, - "w": 78, - "h": 78 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 77, - "h": 79 - }, - "frame": { - "x": 78, - "y": 78, - "w": 77, - "h": 79 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 77, - "h": 79 - }, - "frame": { - "x": 78, - "y": 78, - "w": 77, - "h": 79 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 76, - "h": 80 - }, - "frame": { - "x": 0, - "y": 235, - "w": 76, - "h": 80 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 76, - "h": 80 - }, - "frame": { - "x": 0, - "y": 235, - "w": 76, - "h": 80 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 74, - "h": 77 - }, - "frame": { - "x": 0, - "y": 315, - "w": 74, - "h": 77 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 74, - "h": 77 - }, - "frame": { - "x": 0, - "y": 315, - "w": 74, - "h": 77 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 74, - "h": 77 - }, - "frame": { - "x": 0, - "y": 315, - "w": 74, - "h": 77 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 74, - "h": 77 - }, - "frame": { - "x": 0, - "y": 315, - "w": 74, - "h": 77 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 74, - "h": 77 - }, - "frame": { - "x": 0, - "y": 315, - "w": 74, - "h": 77 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 74, - "h": 77 - }, - "frame": { - "x": 0, - "y": 315, - "w": 74, - "h": 77 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 74, - "h": 77 - }, - "frame": { - "x": 0, - "y": 315, - "w": 74, - "h": 77 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 74, - "h": 77 - }, - "frame": { - "x": 0, - "y": 315, - "w": 74, - "h": 77 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 74, - "h": 77 - }, - "frame": { - "x": 0, - "y": 315, - "w": 74, - "h": 77 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 74, - "h": 77 - }, - "frame": { - "x": 0, - "y": 315, - "w": 74, - "h": 77 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 74, - "h": 77 - }, - "frame": { - "x": 0, - "y": 315, - "w": 74, - "h": 77 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 74, - "h": 77 - }, - "frame": { - "x": 0, - "y": 315, - "w": 74, - "h": 77 - } - }, - { - "filename": "0151.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 74, - "h": 77 - }, - "frame": { - "x": 0, - "y": 315, - "w": 74, - "h": 77 - } - }, - { - "filename": "0152.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 74, - "h": 77 - }, - "frame": { - "x": 0, - "y": 315, - "w": 74, - "h": 77 - } - }, - { - "filename": "0155.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 74, - "h": 77 - }, - "frame": { - "x": 0, - "y": 315, - "w": 74, - "h": 77 - } - }, - { - "filename": "0156.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 74, - "h": 77 - }, - "frame": { - "x": 0, - "y": 315, - "w": 74, - "h": 77 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 75, - "h": 79 - }, - "frame": { - "x": 156, - "y": 0, - "w": 75, - "h": 79 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 75, - "h": 79 - }, - "frame": { - "x": 156, - "y": 0, - "w": 75, - "h": 79 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 74, - "h": 80 - }, - "frame": { - "x": 231, - "y": 0, - "w": 74, - "h": 80 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 74, - "h": 80 - }, - "frame": { - "x": 231, - "y": 0, - "w": 74, - "h": 80 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0135.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0136.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0137.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0138.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0169.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0170.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 305, - "y": 0, - "w": 73, - "h": 80 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 74, - "h": 78 - }, - "frame": { - "x": 78, - "y": 157, - "w": 74, - "h": 78 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 74, - "h": 78 - }, - "frame": { - "x": 78, - "y": 157, - "w": 74, - "h": 78 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 74, - "h": 78 - }, - "frame": { - "x": 78, - "y": 157, - "w": 74, - "h": 78 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 74, - "h": 78 - }, - "frame": { - "x": 78, - "y": 157, - "w": 74, - "h": 78 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 74, - "h": 78 - }, - "frame": { - "x": 78, - "y": 157, - "w": 74, - "h": 78 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 74, - "h": 78 - }, - "frame": { - "x": 78, - "y": 157, - "w": 74, - "h": 78 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 74, - "h": 78 - }, - "frame": { - "x": 78, - "y": 157, - "w": 74, - "h": 78 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 74, - "h": 78 - }, - "frame": { - "x": 78, - "y": 157, - "w": 74, - "h": 78 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 74, - "h": 78 - }, - "frame": { - "x": 78, - "y": 157, - "w": 74, - "h": 78 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 74, - "h": 78 - }, - "frame": { - "x": 78, - "y": 157, - "w": 74, - "h": 78 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 74, - "h": 78 - }, - "frame": { - "x": 78, - "y": 157, - "w": 74, - "h": 78 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 74, - "h": 78 - }, - "frame": { - "x": 78, - "y": 157, - "w": 74, - "h": 78 - } - }, - { - "filename": "0149.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 74, - "h": 78 - }, - "frame": { - "x": 78, - "y": 157, - "w": 74, - "h": 78 - } - }, - { - "filename": "0150.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 74, - "h": 78 - }, - "frame": { - "x": 78, - "y": 157, - "w": 74, - "h": 78 - } - }, - { - "filename": "0157.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 74, - "h": 78 - }, - "frame": { - "x": 78, - "y": 157, - "w": 74, - "h": 78 - } - }, - { - "filename": "0158.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 74, - "h": 78 - }, - "frame": { - "x": 78, - "y": 157, - "w": 74, - "h": 78 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 76, - "y": 235, - "w": 73, - "h": 80 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 73, - "h": 80 - }, - "frame": { - "x": 76, - "y": 235, - "w": 73, - "h": 80 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 75, - "h": 76 - }, - "frame": { - "x": 74, - "y": 315, - "w": 75, - "h": 76 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 75, - "h": 76 - }, - "frame": { - "x": 74, - "y": 315, - "w": 75, - "h": 76 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 75, - "h": 76 - }, - "frame": { - "x": 74, - "y": 315, - "w": 75, - "h": 76 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 75, - "h": 76 - }, - "frame": { - "x": 74, - "y": 315, - "w": 75, - "h": 76 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 75, - "h": 76 - }, - "frame": { - "x": 74, - "y": 315, - "w": 75, - "h": 76 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 75, - "h": 76 - }, - "frame": { - "x": 74, - "y": 315, - "w": 75, - "h": 76 - } - }, - { - "filename": "0153.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 75, - "h": 76 - }, - "frame": { - "x": 74, - "y": 315, - "w": 75, - "h": 76 - } - }, - { - "filename": "0154.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 75, - "h": 76 - }, - "frame": { - "x": 74, - "y": 315, - "w": 75, - "h": 76 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 155, - "y": 79, - "w": 72, - "h": 80 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 155, - "y": 79, - "w": 72, - "h": 80 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 155, - "y": 79, - "w": 72, - "h": 80 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 155, - "y": 79, - "w": 72, - "h": 80 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 155, - "y": 79, - "w": 72, - "h": 80 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 155, - "y": 79, - "w": 72, - "h": 80 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 155, - "y": 79, - "w": 72, - "h": 80 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 155, - "y": 79, - "w": 72, - "h": 80 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 155, - "y": 79, - "w": 72, - "h": 80 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 155, - "y": 79, - "w": 72, - "h": 80 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 155, - "y": 79, - "w": 72, - "h": 80 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 155, - "y": 79, - "w": 72, - "h": 80 - } - }, - { - "filename": "0139.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 155, - "y": 79, - "w": 72, - "h": 80 - } - }, - { - "filename": "0140.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 155, - "y": 79, - "w": 72, - "h": 80 - } - }, - { - "filename": "0167.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 155, - "y": 79, - "w": 72, - "h": 80 - } - }, - { - "filename": "0168.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 155, - "y": 79, - "w": 72, - "h": 80 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 227, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 227, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 227, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 227, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 227, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 227, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 227, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 227, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 227, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 227, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 227, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 227, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0141.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 227, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0142.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 227, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0165.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 227, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0166.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 227, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 299, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 299, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 299, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 299, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 299, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 299, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 299, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 299, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 299, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 299, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 299, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 299, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0143.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 299, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0144.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 299, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0163.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 299, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0164.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 299, - "y": 80, - "w": 72, - "h": 80 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 72, - "h": 79 - }, - "frame": { - "x": 152, - "y": 159, - "w": 72, - "h": 79 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 72, - "h": 79 - }, - "frame": { - "x": 152, - "y": 159, - "w": 72, - "h": 79 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 72, - "h": 79 - }, - "frame": { - "x": 152, - "y": 159, - "w": 72, - "h": 79 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 72, - "h": 79 - }, - "frame": { - "x": 152, - "y": 159, - "w": 72, - "h": 79 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 72, - "h": 79 - }, - "frame": { - "x": 152, - "y": 159, - "w": 72, - "h": 79 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 72, - "h": 79 - }, - "frame": { - "x": 152, - "y": 159, - "w": 72, - "h": 79 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 72, - "h": 79 - }, - "frame": { - "x": 152, - "y": 159, - "w": 72, - "h": 79 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 72, - "h": 79 - }, - "frame": { - "x": 152, - "y": 159, - "w": 72, - "h": 79 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 72, - "h": 79 - }, - "frame": { - "x": 152, - "y": 159, - "w": 72, - "h": 79 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 72, - "h": 79 - }, - "frame": { - "x": 152, - "y": 159, - "w": 72, - "h": 79 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 72, - "h": 79 - }, - "frame": { - "x": 152, - "y": 159, - "w": 72, - "h": 79 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 72, - "h": 79 - }, - "frame": { - "x": 152, - "y": 159, - "w": 72, - "h": 79 - } - }, - { - "filename": "0145.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 72, - "h": 79 - }, - "frame": { - "x": 152, - "y": 159, - "w": 72, - "h": 79 - } - }, - { - "filename": "0146.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 72, - "h": 79 - }, - "frame": { - "x": 152, - "y": 159, - "w": 72, - "h": 79 - } - }, - { - "filename": "0161.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 72, - "h": 79 - }, - "frame": { - "x": 152, - "y": 159, - "w": 72, - "h": 79 - } - }, - { - "filename": "0162.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 1, - "w": 72, - "h": 79 - }, - "frame": { - "x": 152, - "y": 159, - "w": 72, - "h": 79 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 149, - "y": 238, - "w": 72, - "h": 80 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 149, - "y": 238, - "w": 72, - "h": 80 - } - }, - { - "filename": "0133.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 149, - "y": 238, - "w": 72, - "h": 80 - } - }, - { - "filename": "0134.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 149, - "y": 238, - "w": 72, - "h": 80 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 72, - "h": 78 - }, - "frame": { - "x": 224, - "y": 160, - "w": 72, - "h": 78 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 72, - "h": 78 - }, - "frame": { - "x": 224, - "y": 160, - "w": 72, - "h": 78 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 72, - "h": 78 - }, - "frame": { - "x": 224, - "y": 160, - "w": 72, - "h": 78 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 72, - "h": 78 - }, - "frame": { - "x": 224, - "y": 160, - "w": 72, - "h": 78 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 72, - "h": 78 - }, - "frame": { - "x": 224, - "y": 160, - "w": 72, - "h": 78 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 72, - "h": 78 - }, - "frame": { - "x": 224, - "y": 160, - "w": 72, - "h": 78 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 72, - "h": 78 - }, - "frame": { - "x": 224, - "y": 160, - "w": 72, - "h": 78 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 72, - "h": 78 - }, - "frame": { - "x": 224, - "y": 160, - "w": 72, - "h": 78 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 72, - "h": 78 - }, - "frame": { - "x": 224, - "y": 160, - "w": 72, - "h": 78 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 72, - "h": 78 - }, - "frame": { - "x": 224, - "y": 160, - "w": 72, - "h": 78 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 72, - "h": 78 - }, - "frame": { - "x": 224, - "y": 160, - "w": 72, - "h": 78 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 72, - "h": 78 - }, - "frame": { - "x": 224, - "y": 160, - "w": 72, - "h": 78 - } - }, - { - "filename": "0147.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 72, - "h": 78 - }, - "frame": { - "x": 224, - "y": 160, - "w": 72, - "h": 78 - } - }, - { - "filename": "0148.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 72, - "h": 78 - }, - "frame": { - "x": 224, - "y": 160, - "w": 72, - "h": 78 - } - }, - { - "filename": "0159.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 72, - "h": 78 - }, - "frame": { - "x": 224, - "y": 160, - "w": 72, - "h": 78 - } - }, - { - "filename": "0160.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 72, - "h": 78 - }, - "frame": { - "x": 224, - "y": 160, - "w": 72, - "h": 78 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 221, - "y": 238, - "w": 72, - "h": 80 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 221, - "y": 238, - "w": 72, - "h": 80 - } - }, - { - "filename": "0131.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 296, - "y": 160, - "w": 72, - "h": 80 - } - }, - { - "filename": "0132.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 72, - "h": 80 - }, - "frame": { - "x": 296, - "y": 160, - "w": 72, - "h": 80 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 71, - "h": 80 - }, - "frame": { - "x": 293, - "y": 240, - "w": 71, - "h": 80 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 78, - "h": 80 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 71, - "h": 80 - }, - "frame": { - "x": 293, - "y": 240, - "w": 71, - "h": 80 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:d2a0b4f8d67951bad9facc61ed8ecd29:029ea763f8f267a92908e8da6c5b70c9:869abf8e0bcb859d5abfb33d03e5db07$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/623_1.png b/public/images/pokemon/variant/back/623_1.png deleted file mode 100644 index b02cc764502..00000000000 Binary files a/public/images/pokemon/variant/back/623_1.png and /dev/null differ diff --git a/public/images/pokemon/variant/back/623_2.png b/public/images/pokemon/variant/back/623_2.png deleted file mode 100644 index 456f439cd86..00000000000 Binary files a/public/images/pokemon/variant/back/623_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/back/female/6215.json b/public/images/pokemon/variant/back/female/6215.json new file mode 100644 index 00000000000..741d6ddc0bb --- /dev/null +++ b/public/images/pokemon/variant/back/female/6215.json @@ -0,0 +1,32 @@ +{ + "1": { + "724ca2": "12968b", + "503678": "0f5d6d", + "956cbe": "31dabb", + "9c9bce": "ae8976", + "514a80": "402010", + "dcdbf7": "d0b3a4", + "080808": "080808", + "28234b": "220d0a", + "7d6ca4": "853a36", + "584d80": "562627", + "f6f6ff": "f6f6ff", + "bdbdc5": "bdbdc5", + "c52973": "ea903f" + }, + "2": { + "724ca2": "982e33", + "503678": "601522", + "956cbe": "cc5427", + "9c9bce": "3c8775", + "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/380-mega.json b/public/images/pokemon/variant/exp/380-mega.json index 8774aec6dcd..aedcc39909c 100644 --- a/public/images/pokemon/variant/exp/380-mega.json +++ b/public/images/pokemon/variant/exp/380-mega.json @@ -9,8 +9,8 @@ "ffffff": "fafafa", "7b73a4": "b48f79", "cdcdee": "f3e6df", - "ff005a": "6734bf", - "62004a": "97440c", + "ffcd5a": "9b75ff", + "cda44a": "6734bf", "cd4a52": "6734bf" }, "2": { @@ -23,8 +23,8 @@ "ffffff": "fafafa", "7b73a4": "c78ac4", "cdcdee": "eedaea", - "ff005a": "dd6800", - "62004a": "2393a2", + "ffcd5a": "e88a00", + "cda44a": "dd6800", "cd4a52": "dd6800" } -} \ No newline at end of file +} diff --git a/public/images/pokemon/variant/exp/381-mega.json b/public/images/pokemon/variant/exp/381-mega.json index 5b4d0638c6d..bb5b7cffd0b 100644 --- a/public/images/pokemon/variant/exp/381-mega.json +++ b/public/images/pokemon/variant/exp/381-mega.json @@ -9,8 +9,8 @@ "ffffff": "fafafa", "7b73a4": "b673ad", "cdcdee": "f9cfed", - "ffcd5a": "f78232", - "cda44a": "f78232", + "ff005a": "f78232", + "62004a": "f78232", "cd4a52": "d05718" }, "2": { @@ -23,8 +23,8 @@ "ffffff": "fafafa", "7b73a4": "d086ac", "cdcdee": "f7d9ec", - "ffcd5a": "9344b8", - "cda44a": "9344b8", + "ff005a": "9344b8", + "62004a": "9344b8", "cd4a52": "70309f" } -} \ No newline at end of file +} diff --git a/public/images/pokemon/variant/female/118.json b/public/images/pokemon/variant/female/118.json index 659fcbf17d3..ba5a9377fdb 100644 --- a/public/images/pokemon/variant/female/118.json +++ b/public/images/pokemon/variant/female/118.json @@ -1,22 +1,5 @@ { "1": { - "52525a": "2e5453", - "ffffff": "f0fff8", - "101010": "101010", - "8c8c94": "4c867a", - "d6d6de": "9cd8c4", - "efefef": "c3f0dd", - "ceb57b": "65aaae", - "ffc57b": "5addc9", - "ef7b42": "4cb5b1", - "d64210": "2a7580", - "ad1000": "174a5a", - "006b63": "8c3824", - "42ada5": "af704f", - "ad5273": "1f562f", - "f7848c": "5e9964" - }, - "2": { "52525a": "5b3856", "ffffff": "fff9fc", "101010": "101010", @@ -32,5 +15,22 @@ "42ada5": "ffdf5b", "ad5273": "762066", "f7848c": "c450a5" + }, + "2": { + "52525a": "2e5453", + "ffffff": "f0fff8", + "101010": "101010", + "8c8c94": "4c867a", + "d6d6de": "9cd8c4", + "efefef": "c3f0dd", + "ceb57b": "65aaae", + "ffc57b": "5addc9", + "ef7b42": "4cb5b1", + "d64210": "2a7580", + "ad1000": "174a5a", + "006b63": "8c3824", + "42ada5": "af704f", + "ad5273": "1f562f", + "f7848c": "5e9964" } } \ No newline at end of file diff --git a/public/images/pokemon/variant/female/41_2.png b/public/images/pokemon/variant/female/41_2.png deleted file mode 100644 index 9ef30a5e98e..00000000000 Binary files a/public/images/pokemon/variant/female/41_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/female/41_3.png b/public/images/pokemon/variant/female/41_3.png deleted file mode 100644 index cbc73b70515..00000000000 Binary files a/public/images/pokemon/variant/female/41_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/female/42_2.png b/public/images/pokemon/variant/female/42_2.png deleted file mode 100644 index a8183eaf60b..00000000000 Binary files a/public/images/pokemon/variant/female/42_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/female/42_3.png b/public/images/pokemon/variant/female/42_3.png deleted file mode 100644 index a0029ba8548..00000000000 Binary files a/public/images/pokemon/variant/female/42_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/female/6215.json b/public/images/pokemon/variant/female/6215.json new file mode 100644 index 00000000000..99e0c880142 --- /dev/null +++ b/public/images/pokemon/variant/female/6215.json @@ -0,0 +1,36 @@ +{ + "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" + }, + "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" + } +} \ No newline at end of file diff --git a/public/images/pokemon_icons_7v.json b/public/images/pokemon_icons_7v.json index ceb7a0b991f..cf34740925a 100644 --- a/public/images/pokemon_icons_7v.json +++ b/public/images/pokemon_icons_7v.json @@ -1096,7 +1096,7 @@ }, "frame": { "x": 96, - "y": 445, + "y": 446, "w": 17, "h": 22 } diff --git a/public/images/pokemon_icons_7v.png b/public/images/pokemon_icons_7v.png index 822f7950f3e..308e405525d 100644 Binary files a/public/images/pokemon_icons_7v.png and b/public/images/pokemon_icons_7v.png differ diff --git a/public/images/ui/discord.png b/public/images/ui/discord.png new file mode 100644 index 00000000000..1cd833854b0 Binary files /dev/null and b/public/images/ui/discord.png differ diff --git a/public/images/ui/google.png b/public/images/ui/google.png new file mode 100644 index 00000000000..82760552886 Binary files /dev/null and b/public/images/ui/google.png differ diff --git a/public/images/ui/legacy/discord.png b/public/images/ui/legacy/discord.png new file mode 100644 index 00000000000..eac801cdd9d Binary files /dev/null and b/public/images/ui/legacy/discord.png differ diff --git a/public/images/ui/legacy/google.png b/public/images/ui/legacy/google.png new file mode 100644 index 00000000000..82760552886 Binary files /dev/null and b/public/images/ui/legacy/google.png differ diff --git a/public/images/ui/legacy/passive_bg.png b/public/images/ui/legacy/passive_bg.png new file mode 100644 index 00000000000..1e18a47b881 Binary files /dev/null and b/public/images/ui/legacy/passive_bg.png differ diff --git a/public/images/ui/legacy/scroll_bar.png b/public/images/ui/legacy/scroll_bar.png new file mode 100644 index 00000000000..e4e5eb34dd2 Binary files /dev/null and b/public/images/ui/legacy/scroll_bar.png differ diff --git a/public/images/ui/legacy/scroll_bar_handle.png b/public/images/ui/legacy/scroll_bar_handle.png new file mode 100644 index 00000000000..95a1726b3ba Binary files /dev/null and b/public/images/ui/legacy/scroll_bar_handle.png differ diff --git a/public/images/ui/legacy/starter_container_bg.png b/public/images/ui/legacy/starter_container_bg.png new file mode 100644 index 00000000000..5b60fcf551e Binary files /dev/null and b/public/images/ui/legacy/starter_container_bg.png differ diff --git a/public/images/ui/passive_bg.png b/public/images/ui/passive_bg.png new file mode 100644 index 00000000000..1e18a47b881 Binary files /dev/null and b/public/images/ui/passive_bg.png differ diff --git a/public/images/ui/scroll_bar.png b/public/images/ui/scroll_bar.png new file mode 100644 index 00000000000..e4e5eb34dd2 Binary files /dev/null and b/public/images/ui/scroll_bar.png differ diff --git a/public/images/ui/scroll_bar_handle.png b/public/images/ui/scroll_bar_handle.png new file mode 100644 index 00000000000..95a1726b3ba Binary files /dev/null and b/public/images/ui/scroll_bar_handle.png differ diff --git a/public/images/ui/starter_container_bg.png b/public/images/ui/starter_container_bg.png new file mode 100644 index 00000000000..5b60fcf551e Binary files /dev/null and b/public/images/ui/starter_container_bg.png differ diff --git a/public/images/ui/starter_select_bg.png b/public/images/ui/starter_select_bg.png index f02182fe140..8b11f55a963 100644 Binary files a/public/images/ui/starter_select_bg.png and b/public/images/ui/starter_select_bg.png differ diff --git a/src/account.ts b/src/account.ts index 4d19513908f..7fd1d208496 100644 --- a/src/account.ts +++ b/src/account.ts @@ -4,6 +4,8 @@ import * as Utils from "./utils"; export interface UserInfo { username: string; lastSessionSlot: integer; + discordId: string; + googleId: string; } export let loggedInUser: UserInfo = null; @@ -11,13 +13,13 @@ export let loggedInUser: UserInfo = null; export const clientSessionId = Utils.randomString(32); export function initLoggedInUser(): void { - loggedInUser = { username: "Guest", lastSessionSlot: -1 }; + loggedInUser = { username: "Guest", lastSessionSlot: -1, discordId: "", googleId: ""}; } export function updateUserInfo(): Promise<[boolean, integer]> { return new Promise<[boolean, integer]>(resolve => { if (bypassLogin) { - loggedInUser = { username: "Guest", lastSessionSlot: -1 }; + loggedInUser = { username: "Guest", lastSessionSlot: -1, discordId: "", googleId: "" }; let lastSessionSlot = -1; for (let s = 0; s < 5; s++) { if (localStorage.getItem(`sessionData${s ? s : ""}_${loggedInUser.username}`)) { diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 169c024d329..249ddebdd60 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -48,11 +48,11 @@ import { SceneBase } from "./scene-base"; import CandyBar from "./ui/candy-bar"; import { Variant, variantData } from "./data/variant"; import { Localizable } from "#app/interfaces/locales"; -import * as Overrides from "./overrides"; +import Overrides from "#app/overrides"; import { InputsController } from "./inputs-controller"; import { UiInputs } from "./ui-inputs"; import { NewArenaEvent } from "./events/battle-scene"; -import ArenaFlyout from "./ui/arena-flyout"; +import { ArenaFlyout } from "./ui/arena-flyout"; import { EaseType } from "#enums/ease-type"; import { Abilities } from "#enums/abilities"; import { BattleSpec } from "#enums/battle-spec"; @@ -66,6 +66,7 @@ import { Species } from "#enums/species"; import { UiTheme } from "#enums/ui-theme"; import { TimedEventManager } from "#app/timed-event-manager.js"; import i18next from "i18next"; +import {TrainerType} from "#enums/trainer-type"; import IMysteryEncounter from "./data/mystery-encounters/mystery-encounter"; import { allMysteryEncounters, AVERAGE_ENCOUNTERS_PER_RUN_TARGET, BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT, mysteryEncountersByBiome, WEIGHT_INCREMENT_ON_SPAWN_MISS } from "./data/mystery-encounters/mystery-encounters"; import { MysteryEncounterData } from "#app/data/mystery-encounters/mystery-encounter-data"; @@ -184,11 +185,16 @@ export default class BattleScene extends SceneBase { public gameData: GameData; public sessionSlotId: integer; + /** PhaseQueue: dequeue/remove the first element to get the next phase */ public phaseQueue: Phase[]; public conditionalQueue: Array<[() => boolean, Phase]>; + /** PhaseQueuePrepend: is a temp storage of what will be added to PhaseQueue */ private phaseQueuePrepend: Phase[]; + + /** overrides default of inserting phases to end of phaseQueuePrepend array, useful or inserting Phases "out of order" */ private phaseQueuePrependSpliceIndex: integer; private nextCommandPhaseQueue: Phase[]; + private currentPhase: Phase; private standbyPhase: Phase; public field: Phaser.GameObjects.Container; @@ -230,6 +236,9 @@ export default class BattleScene extends SceneBase { private fieldOverlay: Phaser.GameObjects.Rectangle; private shopOverlay: Phaser.GameObjects.Rectangle; + private shopOverlayShown: boolean = false; + private shopOverlayOpacity: number = .80; + public modifiers: PersistentModifier[]; private enemyModifiers: PersistentModifier[]; public uiContainer: Phaser.GameObjects.Container; @@ -1067,6 +1076,10 @@ export default class BattleScene extends SceneBase { this.applyModifiers(DoubleBattleChanceBoosterModifier, true, doubleChance); playerField.forEach(p => applyAbAttrs(DoubleBattleChanceAbAttr, p, null, doubleChance)); doubleTrainer = !Utils.randSeedInt(doubleChance.value); + // 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 === TrainerType.TATE || trainerType === TrainerType.LIZA)) { + doubleTrainer = false; + } } newTrainer = trainerData !== undefined ? trainerData.toTrainer(this) : new Trainer(this, trainerType, doubleTrainer ? TrainerVariant.DOUBLE : Utils.randSeedInt(2) ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT); this.field.add(newTrainer); @@ -1120,11 +1133,11 @@ export default class BattleScene extends SceneBase { newDouble = !!double; } - if (Overrides.DOUBLE_BATTLE_OVERRIDE) { + if (Overrides.BATTLE_TYPE_OVERRIDE === "double") { newDouble = true; } /* Override battles into single only if not fighting with trainers */ - if (newBattleType !== BattleType.TRAINER && Overrides.SINGLE_BATTLE_OVERRIDE) { + if (newBattleType !== BattleType.TRAINER && Overrides.BATTLE_TYPE_OVERRIDE === "single") { newDouble = false; } @@ -1185,7 +1198,7 @@ export default class BattleScene extends SceneBase { this.arena.updatePoolsForTimeOfDay(); } if (resetArenaState) { - this.arena.removeAllTags(); + this.arena.resetArenaEffects(); // If last battle was mystery encounter and no battle occurred, skip return phases if (lastBattle?.mysteryEncounter?.encounterMode !== MysteryEncounterMode.NO_BATTLE) { @@ -1493,19 +1506,29 @@ export default class BattleScene extends SceneBase { }); } + updateShopOverlayOpacity(value: number): void { + this.shopOverlayOpacity = value; + + if (this.shopOverlayShown) { + this.shopOverlay.setAlpha(this.shopOverlayOpacity); + } + } + showShopOverlay(duration: integer): Promise { + this.shopOverlayShown = true; return new Promise(resolve => { this.tweens.add({ targets: this.shopOverlay, - alpha: 0.8, + alpha: this.shopOverlayOpacity, ease: "Sine.easeOut", - duration: duration, + duration, onComplete: () => resolve() }); }); } hideShopOverlay(duration: integer): Promise { + this.shopOverlayShown = false; return new Promise(resolve => { this.tweens.add({ targets: this.shopOverlay, @@ -1958,7 +1981,7 @@ export default class BattleScene extends SceneBase { case "battle_legendary_pecharunt": //SV Pecharunt Battle return 6.508; case "battle_rival": //BW Rival Battle - return 13.689; + return 14.110; case "battle_rival_2": //BW N Battle return 17.714; case "battle_rival_3": //BW Final N Battle @@ -2013,6 +2036,7 @@ 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. * @@ -2027,11 +2051,19 @@ export default class BattleScene extends SceneBase { this.conditionalQueue.push([condition, phase]); } - + /** + * Adds a phase to nextCommandPhaseQueue, as long as boolean passed in is false + * @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 { (!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 + */ unshiftPhase(phase: Phase): void { if (this.phaseQueuePrependSpliceIndex === -1) { this.phaseQueuePrepend.push(phase); @@ -2040,18 +2072,32 @@ export default class BattleScene extends SceneBase { } } + /** + * Clears the phaseQueue + */ clearPhaseQueue(): void { this.phaseQueue.splice(0, this.phaseQueue.length); } + /** + * Used by function unshiftPhase(), sets index to start inserting at current length instead of the end of the array, useful if phaseQueuePrepend gets longer with Phases + */ setPhaseQueueSplice(): void { this.phaseQueuePrependSpliceIndex = this.phaseQueuePrepend.length; } + /** + * Resets phaseQueuePrependSpliceIndex to -1, implies that calls to unshiftPhase will insert at end of phaseQueuePrepend + */ clearPhaseQueueSplice(): void { this.phaseQueuePrependSpliceIndex = -1; } + /** + * Is called by each Phase implementations "end()" by default + * We dump everything from phaseQueuePrepend to the start of of phaseQueue + * then removes first Phase and starts it + */ shiftPhase(): void { if (this.standbyPhase) { this.currentPhase = this.standbyPhase; @@ -2069,7 +2115,7 @@ export default class BattleScene extends SceneBase { } if (!this.phaseQueue.length) { this.populatePhaseQueue(); - // clear the conditionalQueue if there are no phases left in the phaseQueue + // Clear the conditionalQueue if there are no phases left in the phaseQueue this.conditionalQueue = []; } this.currentPhase = this.phaseQueue.shift(); @@ -2080,8 +2126,8 @@ export default class BattleScene extends SceneBase { const conditionalPhase = this.conditionalQueue.shift(); // Evaluate the condition associated with the phase if (conditionalPhase[0]()) { - // If the condition is met, add the phase to the front of the phase queue - this.unshiftPhase(conditionalPhase[1]); + // If the condition is met, add the phase to the phase queue + this.pushPhase(conditionalPhase[1]); } else { // If the condition is not met, re-add the phase back to the front of the conditional queue this.conditionalQueue.unshift(conditionalPhase); @@ -2136,15 +2182,46 @@ export default class BattleScene extends SceneBase { } } + /** + * Tries to add the input phase to index before target phase in the phaseQueue, else simply calls unshiftPhase() + * @param phase {@linkcode Phase} the phase to be added + * @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 { + const targetIndex = this.phaseQueue.findIndex(ph => ph instanceof targetPhase); + + if (targetIndex !== -1) { + this.phaseQueue.splice(targetIndex, 0, phase); + return true; + } else { + this.unshiftPhase(phase); + return false; + } + } + + /** + * Adds a MessagePhase, either to PhaseQueuePrepend or nextCommandPhaseQueue + * @param message string for MessagePhase + * @param callbackDelay optional param for MessagePhase constructor + * @param prompt optional param for MessagePhase constructor + * @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, prompt?: boolean, promptDelay?: integer, defer?: boolean) { const phase = new MessagePhase(this, message, callbackDelay, prompt, promptDelay); if (!defer) { + // adds to the end of PhaseQueuePrepend this.unshiftPhase(phase); } else { + //remember that pushPhase adds it to nextCommandPhaseQueue this.pushPhase(phase); } } + /** + * Moves everything from nextCommandPhaseQueue to phaseQueue (keeping order) + */ populatePhaseQueue(): void { if (this.nextCommandPhaseQueue.length) { this.phaseQueue.push(...this.nextCommandPhaseQueue); diff --git a/src/battle.ts b/src/battle.ts index b30b820e628..7205b883eb9 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -161,7 +161,7 @@ export default class Battle { } addPostBattleLoot(enemyPokemon: EnemyPokemon): void { - this.postBattleLoot.push(...enemyPokemon.scene.findModifiers(m => m instanceof PokemonHeldItemModifier && m.pokemonId === enemyPokemon.id && m.getTransferrable(false), false).map(i => { + this.postBattleLoot.push(...enemyPokemon.scene.findModifiers(m => m instanceof PokemonHeldItemModifier && m.pokemonId === enemyPokemon.id && m.isTransferrable, false).map(i => { const ret = i as PokemonHeldItemModifier; ret.pokemonId = null; return ret; @@ -298,9 +298,20 @@ export default class Battle { 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 (pokemon.species.speciesId === Species.COSMOG || pokemon.species.speciesId === Species.COSMOEM || pokemon.species.speciesId === Species.SOLGALEO || pokemon.species.speciesId === Species.LUNALA || pokemon.species.speciesId === Species.NECROZMA) { + if (pokemon.species.speciesId === Species.COSMOG || pokemon.species.speciesId === Species.COSMOEM || pokemon.species.speciesId === Species.SOLGALEO || pokemon.species.speciesId === Species.LUNALA) { return "battle_legendary_sol_lun"; } + if (pokemon.species.speciesId === Species.NECROZMA) { + if (pokemon.getFormKey() === "") { + 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 (pokemon.species.speciesId === Species.NIHILEGO || pokemon.species.speciesId === Species.BUZZWOLE || pokemon.species.speciesId === Species.PHEROMOSA || pokemon.species.speciesId === Species.XURKITREE || pokemon.species.speciesId === Species.CELESTEELA || pokemon.species.speciesId === Species.KARTANA || pokemon.species.speciesId === Species.GUZZLORD || pokemon.species.speciesId === Species.POIPOLE || pokemon.species.speciesId === Species.NAGANADEL || pokemon.species.speciesId === Species.STAKATAKA || pokemon.species.speciesId === Species.BLACEPHALON) { return "battle_legendary_ub"; } diff --git a/src/data/ability.ts b/src/data/ability.ts index f449b33992b..40461f72e97 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -4,7 +4,7 @@ import { Constructor } from "#app/utils"; import * as Utils from "../utils"; import { BattleStat, getBattleStatName } from "./battle-stat"; import { MovePhase, PokemonHealPhase, ShowAbilityPhase, StatChangePhase } from "../phases"; -import { getPokemonMessage, getPokemonNameWithAffix } from "../messages"; +import { getPokemonNameWithAffix } from "../messages"; import { Weather, WeatherType } from "./weather"; import { BattlerTag, GroundedTag } from "./battler-tags"; import { StatusEffect, getNonVolatileStatusEffects, getStatusEffectDescriptor, getStatusEffectHealText } from "./status-effect"; @@ -266,7 +266,7 @@ export class PreDefendFormChangeAbAttr extends PreDefendAbAttr { } export class PreDefendFullHpEndureAbAttr extends PreDefendAbAttr { applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { - if (pokemon.hp === pokemon.getMaxHp() && + 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 pokemon.addTag(BattlerTagType.STURDY, 1); @@ -284,7 +284,10 @@ export class BlockItemTheftAbAttr extends AbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]) { - return getPokemonMessage(pokemon, `'s ${abilityName}\nprevents item theft!`); + return i18next.t("abilityTriggers:blockItemTheft", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + abilityName: abilityName, + }); } } @@ -361,13 +364,13 @@ export class TypeImmunityAbAttr extends PreDefendAbAttr { /** * Applies immunity if this ability grants immunity to the type of the given move. - * @param pokemon {@linkcode Pokemon} the defending Pokemon - * @param passive N/A - * @param attacker {@linkcode Pokemon} the attacking Pokemon - * @param move {@linkcode Move} the attacking move - * @param cancelled N/A + * @param pokemon {@linkcode Pokemon} The defending Pokemon. + * @param passive - Whether the ability is passive. + * @param attacker {@linkcode Pokemon} The attacking Pokemon. + * @param move {@linkcode Move} The attacking move. + * @param cancelled {@linkcode Utils.BooleanHolder} - A holder for a boolean value indicating if the move was cancelled. * @param args [0] {@linkcode Utils.NumberHolder} gets set to 0 if move is immuned by an ability. - * @param args [1] {@linkcode Utils.NumberHolder} type of move being defended against in case it has changed from default type + * @param args [1] - Whether the move is simulated. */ applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean { // Field moves should ignore immunity @@ -397,12 +400,12 @@ export class TypeImmunityHealAbAttr extends TypeImmunityAbAttr { const ret = super.applyPreDefend(pokemon, passive, attacker, move, cancelled, args); if (ret) { - if (pokemon.getHpRatio() < 1) { + if (!pokemon.isFullHp()) { const simulated = args.length > 1 && args[1]; if (!simulated) { const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, pokemon.getBattlerIndex(), - Math.max(Math.floor(pokemon.getMaxHp() / 4), 1), getPokemonMessage(pokemon, `'s ${abilityName}\nrestored its HP a little!`), true)); + Math.max(Math.floor(pokemon.getMaxHp() / 4), 1), i18next.t("abilityTriggers:typeImmunityHeal", {pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: abilityName}), true)); } } return true; @@ -480,7 +483,10 @@ export class NonSuperEffectiveImmunityAbAttr extends TypeImmunityAbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return getPokemonMessage(pokemon, ` avoided damage\nwith ${abilityName}!`); + return i18next.t("abilityTriggers:nonSuperEffectiveImmunity", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + abilityName: abilityName, + }); } } @@ -501,7 +507,7 @@ export class PostDefendDisguiseAbAttr extends PostDefendAbAttr { } pokemon.damageAndUpdate(recoilDamage, HitResult.OTHER); pokemon.turnData.damageTaken += recoilDamage; - pokemon.scene.queueMessage(getPokemonMessage(pokemon, "'s disguise was busted!")); + pokemon.scene.queueMessage(i18next.t("abilityTriggers:postDefendDisguise", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); return true; } @@ -573,7 +579,7 @@ export class MoveImmunityAbAttr extends PreDefendAbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return `It doesn\'t affect ${pokemon.name}!`; + return i18next.t("abilityTriggers:moveImmunity", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); } } @@ -637,7 +643,7 @@ export class ReverseDrainAbAttr extends PostDefendAbAttr { */ applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { if (move.hasAttr(HitHealAttr)) { - pokemon.scene.queueMessage(getPokemonMessage(attacker, " sucked up the liquid ooze!")); + pokemon.scene.queueMessage(i18next.t("abilityTriggers:reverseDrain", { pokemonNameWithAffix: getPokemonNameWithAffix(attacker) })); return true; } return false; @@ -746,7 +752,7 @@ export class PostDefendApplyBattlerTagAbAttr extends PostDefendAbAttr { if (this.condition(pokemon, attacker, move)) { if (!pokemon.getTag(this.tagType)) { pokemon.addTag(this.tagType, undefined, undefined, pokemon.id); - pokemon.scene.queueMessage(i18next.t("abilityTriggers:windPowerCharged", { pokemonName: pokemon.name, moveName: move.name })); + pokemon.scene.queueMessage(i18next.t("abilityTriggers:windPowerCharged", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name })); } return true; } @@ -769,7 +775,11 @@ export class PostDefendTypeChangeAbAttr extends PostDefendAbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return getPokemonMessage(pokemon, `'s ${abilityName}\nmade it the ${Utils.toReadableString(Type[pokemon.getTypes(true)[0]])} type!`); + return i18next.t("abilityTriggers:postDefendTypeChange", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + abilityName: abilityName, + typeName: i18next.t(`pokemonInfo:Type.${Type[pokemon.getTypes(true)[0]]}`) + }); } } @@ -889,7 +899,10 @@ export class PostDefendContactDamageAbAttr extends PostDefendAbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return getPokemonMessage(pokemon, `'s ${abilityName}\nhurt its attacker!`); + return i18next.t("abilityTriggers:postDefendContactDamage", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + abilityName: abilityName, + }); } } /** @@ -961,7 +974,7 @@ export class PostDefendAbilitySwapAbAttr extends PostDefendAbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return getPokemonMessage(pokemon, " swapped\nabilities with its target!"); + return i18next.t("abilityTriggers:postDefendAbilitySwap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); } } @@ -984,7 +997,10 @@ export class PostDefendAbilityGiveAbAttr extends PostDefendAbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return getPokemonMessage(pokemon, ` gave its target\n${abilityName}!`); + return i18next.t("abilityTriggers:postDefendAbilityGive", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + abilityName: abilityName, + }); } } @@ -1014,7 +1030,10 @@ export class PostDefendMoveDisableAbAttr extends PostDefendAbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return getPokemonMessage(this.attacker, `'s ${this.move.name}\nwas disabled!`); + return i18next.t("abilityTriggers:postDefendMoveDisable", { + pokemonNameWithAffix: getPokemonNameWithAffix(this.attacker), + moveName: this.move.name, + }); } } @@ -1064,7 +1083,9 @@ export class MoveEffectChanceMultiplierAbAttr extends AbAttr { * [1]: {@linkcode Moves } Move used by the ability user. */ apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { - + //Disable showAbility during getTargetBenefitScore + const showAbility = args[4]; + this.showAbility = showAbility; if ((args[0] as Utils.NumberHolder).value <= 0 || (args[1] as Move).id === Moves.ORDER_UP) { return false; } @@ -1227,7 +1248,10 @@ export class PokemonTypeChangeAbAttr extends PreAttackAbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return getPokemonMessage(pokemon, ` transformed into the ${Type[this.moveType]} type!`); + return i18next.t("abilityTriggers:pokemonTypeChange", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + moveType: i18next.t(`pokemonInfo:Type.${Type[this.moveType]}`), + }); } } @@ -1525,12 +1549,12 @@ export class PostAttackStealHeldItemAbAttr extends PostAttackAbAttr { applyPostAttack(pokemon: Pokemon, passive: boolean, defender: Pokemon, move: Move, hitResult: HitResult, args: any[]): Promise { return new Promise(resolve => { if (hitResult < HitResult.NO_EFFECT && (!this.condition || this.condition(pokemon, defender, move))) { - const heldItems = this.getTargetHeldItems(defender).filter(i => i.getTransferrable(false)); + const heldItems = this.getTargetHeldItems(defender).filter(i => i.isTransferrable); if (heldItems.length) { const stolenItem = heldItems[pokemon.randSeedInt(heldItems.length)]; pokemon.scene.tryTransferHeldItemModifier(stolenItem, pokemon, false).then(success => { if (success) { - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` stole\n${defender.name}'s ${stolenItem.type.name}!`)); + pokemon.scene.queueMessage(i18next.t("abilityTriggers:postAttackStealHeldItem", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), defenderName: defender.name, stolenItemType: stolenItem.type.name })); } resolve(success); }); @@ -1543,7 +1567,7 @@ export class PostAttackStealHeldItemAbAttr extends PostAttackAbAttr { getTargetHeldItems(target: Pokemon): PokemonHeldItemModifier[] { return target.scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && (m as PokemonHeldItemModifier).pokemonId === target.id, target.isPlayer()) as PokemonHeldItemModifier[]; + && m.pokemonId === target.id, target.isPlayer()) as PokemonHeldItemModifier[]; } } @@ -1614,12 +1638,12 @@ export class PostDefendStealHeldItemAbAttr extends PostDefendAbAttr { applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): Promise { return new Promise(resolve => { if (hitResult < HitResult.NO_EFFECT && (!this.condition || this.condition(pokemon, attacker, move))) { - const heldItems = this.getTargetHeldItems(attacker).filter(i => i.getTransferrable(false)); + const heldItems = this.getTargetHeldItems(attacker).filter(i => i.isTransferrable); if (heldItems.length) { const stolenItem = heldItems[pokemon.randSeedInt(heldItems.length)]; pokemon.scene.tryTransferHeldItemModifier(stolenItem, pokemon, false).then(success => { if (success) { - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` stole\n${attacker.name}'s ${stolenItem.type.name}!`)); + pokemon.scene.queueMessage(i18next.t("abilityTriggers:postDefendStealHeldItem", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), attackerName: attacker.name, stolenItemType: stolenItem.type.name })); } resolve(success); }); @@ -1632,7 +1656,7 @@ export class PostDefendStealHeldItemAbAttr extends PostDefendAbAttr { getTargetHeldItems(target: Pokemon): PokemonHeldItemModifier[] { return target.scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && (m as PokemonHeldItemModifier).pokemonId === target.id, target.isPlayer()) as PokemonHeldItemModifier[]; + && m.pokemonId === target.id, target.isPlayer()) as PokemonHeldItemModifier[]; } } @@ -1718,7 +1742,7 @@ export class CopyFaintedAllyAbilityAbAttr extends PostKnockOutAbAttr { applyPostKnockOut(pokemon: Pokemon, passive: boolean, knockedOut: Pokemon, args: any[]): boolean | Promise { if (pokemon.isPlayer() === knockedOut.isPlayer() && !knockedOut.getAbility().hasAttr(UncopiableAbilityAbAttr)) { pokemon.summonData.ability = knockedOut.getAbility().id; - pokemon.scene.queueMessage(getPokemonMessage(knockedOut, `'s ${allAbilities[knockedOut.getAbility().id].name} was taken over!`)); + pokemon.scene.queueMessage(i18next.t("abilityTriggers:copyFaintedAllyAbility", { pokemonNameWithAffix: getPokemonNameWithAffix(knockedOut), abilityName: allAbilities[knockedOut.getAbility().id].name })); return true; } @@ -1771,7 +1795,10 @@ export class IntimidateImmunityAbAttr extends AbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return getPokemonMessage(pokemon, `'s ${abilityName} prevented it from being Intimidated!`); + return i18next.t("abilityTriggers:intimidateImmunity", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + abilityName: abilityName, + }); } } @@ -1937,7 +1964,7 @@ export class PostSummonAllyHealAbAttr extends PostSummonAbAttr { const target = pokemon.getAlly(); if (target?.isActive(true)) { target.scene.unshiftPhase(new PokemonHealPhase(target.scene, target.getBattlerIndex(), - Math.max(Math.floor(pokemon.getMaxHp() / this.healRatio), 1), getPokemonMessage(target, ` drank down all the\nmatcha that ${pokemon.name} made!`), true, !this.showAnim)); + Math.max(Math.floor(pokemon.getMaxHp() / this.healRatio), 1), i18next.t("abilityTriggers:postSummonAllyHeal", { pokemonNameWithAffix: getPokemonNameWithAffix(target), pokemonName: pokemon.name }), true, !this.showAnim)); return true; } @@ -1965,7 +1992,7 @@ export class PostSummonClearAllyStatsAbAttr extends PostSummonAbAttr { target.summonData.battleStats[s] = 0; } - target.scene.queueMessage(getPokemonMessage(target, "'s stat changes\nwere removed!")); + target.scene.queueMessage(i18next.t("abilityTriggers:postSummonClearAllyStats", { pokemonNameWithAffix: getPokemonNameWithAffix(target) })); return true; } @@ -2180,7 +2207,7 @@ export class PostSummonTransformAbAttr extends PostSummonAbAttr { pokemon.loadAssets(false).then(() => pokemon.playAnim()); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` transformed\ninto ${target.name}!`)); + pokemon.scene.queueMessage(i18next.t("abilityTriggers:postSummonTransform", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), targetName: target.name, })); return true; } @@ -2256,7 +2283,7 @@ export class PreSwitchOutClearWeatherAbAttr extends PreSwitchOutAbAttr { export class PreSwitchOutHealAbAttr extends PreSwitchOutAbAttr { applyPreSwitchOut(pokemon: Pokemon, passive: boolean, args: any[]): boolean | Promise { - if (pokemon.getHpRatio() < 1 ) { + if (!pokemon.isFullHp()) { const healAmount = Math.floor(pokemon.getMaxHp() * 0.33); pokemon.heal(healAmount); pokemon.updateInfo(); @@ -2325,7 +2352,11 @@ export class ProtectStatAbAttr extends PreStatChangeAbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return getPokemonMessage(pokemon, `'s ${abilityName}\nprevents lowering its ${this.protectedStat !== undefined ? getBattleStatName(this.protectedStat) : "stats"}!`); + return i18next.t("abilityTriggers:protectStat", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + abilityName: abilityName, + statName: this.protectedStat !== undefined ? getBattleStatName(this.protectedStat) : "stats", // TODO : Change "stats" to i18next.t("battle:stats") after PR#2600 merged to 'main' + }); } } @@ -2387,7 +2418,16 @@ export class StatusEffectImmunityAbAttr extends PreSetStatusAbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return getPokemonMessage(pokemon, `'s ${abilityName}\nprevents ${this.immuneEffects.length ? getStatusEffectDescriptor(args[0] as StatusEffect) : "status problems"}!`); + return this.immuneEffects.length ? + i18next.t("abilityTriggers:statusEffectImmunityWithName", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + abilityName: abilityName, + statusEffectName: getStatusEffectDescriptor(args[0] as StatusEffect) + }) : + i18next.t("abilityTriggers:statusEffectImmunity", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + abilityName: abilityName, + }); } } @@ -2416,7 +2456,11 @@ export class BattlerTagImmunityAbAttr extends PreApplyBattlerTagAbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return getPokemonMessage(pokemon, `'s ${abilityName}\nprevents ${(args[0] as BattlerTag).getDescriptor()}!`); + return i18next.t("abilityTriggers:battlerTagImmunity", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + abilityName: abilityName, + battlerTagName: (args[0] as BattlerTag).getDescriptor() + }); } } @@ -2720,7 +2764,7 @@ export class ForewarnAbAttr extends PostSummonAbAttr { } } } - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " was forewarned about " + maxMove + "!")); + pokemon.scene.queueMessage(i18next.t("abilityTriggers:forewarn", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: maxMove })); return true; } } @@ -2732,7 +2776,7 @@ export class FriskAbAttr extends PostSummonAbAttr { applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean { for (const opponent of pokemon.getOpponents()) { - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " frisked " + opponent.name + "'s " + opponent.getAbility().name + "!")); + pokemon.scene.queueMessage(i18next.t("abilityTriggers:frisk", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), opponentName: opponent.name, opponentAbilityName: opponent.getAbility().name })); setAbilityRevealed(opponent); } return true; @@ -2796,11 +2840,11 @@ export class PostWeatherLapseHealAbAttr extends PostWeatherLapseAbAttr { } applyPostWeatherLapse(pokemon: Pokemon, passive: boolean, weather: Weather, args: any[]): boolean { - if (pokemon.getHpRatio() < 1) { + if (!pokemon.isFullHp()) { const scene = pokemon.scene; const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; scene.unshiftPhase(new PokemonHealPhase(scene, pokemon.getBattlerIndex(), - Math.max(Math.floor(pokemon.getMaxHp() / (16 / this.healFactor)), 1), getPokemonMessage(pokemon, `'s ${abilityName}\nrestored its HP a little!`), true)); + Math.max(Math.floor(pokemon.getMaxHp() / (16 / this.healFactor)), 1), i18next.t("abilityTriggers:postWeatherLapseHeal", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: abilityName }), true)); return true; } @@ -2820,7 +2864,7 @@ export class PostWeatherLapseDamageAbAttr extends PostWeatherLapseAbAttr { applyPostWeatherLapse(pokemon: Pokemon, passive: boolean, weather: Weather, args: any[]): boolean { const scene = pokemon.scene; const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; - scene.queueMessage(getPokemonMessage(pokemon, ` is hurt\nby its ${abilityName}!`)); + scene.queueMessage(i18next.t("abilityTriggers:postWeatherLapseDamage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: abilityName })); pokemon.damageAndUpdate(Math.ceil(pokemon.getMaxHp() / (16 / this.damageFactor)), HitResult.OTHER); return true; } @@ -2890,11 +2934,11 @@ export class PostTurnStatusHealAbAttr extends PostTurnAbAttr { */ applyPostTurn(pokemon: Pokemon, passive: boolean, args: any[]): boolean | Promise { if (this.effects.includes(pokemon.status?.effect)) { - if (pokemon.getMaxHp() !== pokemon.hp) { + if (!pokemon.isFullHp()) { const scene = pokemon.scene; const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; scene.unshiftPhase(new PokemonHealPhase(scene, pokemon.getBattlerIndex(), - Math.max(Math.floor(pokemon.getMaxHp() / 8), 1), i18next.t("abilityTriggers:poisonHeal", { pokemonName: pokemon.name, abilityName: abilityName}), true)); + Math.max(Math.floor(pokemon.getMaxHp() / 8), 1), i18next.t("abilityTriggers:poisonHeal", { pokemonName: getPokemonNameWithAffix(pokemon), abilityName: abilityName}), true)); return true; } } @@ -2987,12 +3031,16 @@ export class PostTurnLootAbAttr extends PostTurnAbAttr { ) as BerryModifier | undefined; if (!berryModifier) { - pokemon.scene.addModifier(new BerryModifier(chosenBerry, pokemon.id, chosenBerryType, 1)); + if (pokemon.isPlayer()) { + pokemon.scene.addModifier(new BerryModifier(chosenBerry, pokemon.id, chosenBerryType, 1)); + } else { + pokemon.scene.addEnemyModifier(new BerryModifier(chosenBerry, pokemon.id, chosenBerryType, 1)); + } } else if (berryModifier.stackCount < berryModifier.getMaxHeldItemCount(pokemon)) { berryModifier.stackCount++; } - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` harvested one ${chosenBerry.name}!`)); + pokemon.scene.queueMessage(i18next.t("abilityTriggers:postTurnLootCreateEatenBerry", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), berryName: chosenBerry.name })); pokemon.scene.updateModifiers(pokemon.isPlayer()); return true; @@ -3043,11 +3091,11 @@ export class PostTurnStatChangeAbAttr extends PostTurnAbAttr { export class PostTurnHealAbAttr extends PostTurnAbAttr { applyPostTurn(pokemon: Pokemon, passive: boolean, args: any[]): boolean { - if (pokemon.getHpRatio() < 1) { + if (!pokemon.isFullHp()) { const scene = pokemon.scene; const abilityName = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name; scene.unshiftPhase(new PokemonHealPhase(scene, pokemon.getBattlerIndex(), - Math.max(Math.floor(pokemon.getMaxHp() / 16), 1), getPokemonMessage(pokemon, `'s ${abilityName}\nrestored its HP a little!`), true)); + Math.max(Math.floor(pokemon.getMaxHp() / 16), 1), i18next.t("abilityTriggers:postTurnHeal", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: abilityName }), true)); return true; } @@ -3123,7 +3171,7 @@ export class FetchBallAbAttr extends PostTurnAbAttr { if (lastUsed !== null && pokemon.isPlayer) { pokemon.scene.pokeballCounts[lastUsed]++; pokemon.scene.currentBattle.lastUsedPokeball = null; - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` found a\n${getPokeballName(lastUsed)}!`)); + pokemon.scene.queueMessage(i18next.t("abilityTriggers:fetchBall", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), pokeballName: getPokeballName(lastUsed) })); return true; } return false; @@ -3299,7 +3347,7 @@ export class HealFromBerryUseAbAttr extends AbAttr { pokemon.scene, pokemon.getBattlerIndex(), Math.max(Math.floor(pokemon.getMaxHp() * this.healPercent), 1), - getPokemonMessage(pokemon, `'s ${abilityName}\nrestored its HP!`), + i18next.t("abilityTriggers:healFromBerryUse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: abilityName }), true ) ); @@ -3374,7 +3422,7 @@ export class ArenaTrapAbAttr extends CheckTrappedAbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return getPokemonMessage(pokemon, `\'s ${abilityName}\nprevents switching!`); + return i18next.t("abilityTriggers:arenaTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: abilityName }); } } @@ -3403,7 +3451,7 @@ export class PostBattleLootAbAttr extends PostBattleAbAttr { const randItem = Utils.randSeedItem(postBattleLoot); if (pokemon.scene.tryTransferHeldItemModifier(randItem, pokemon, true, 1, true)) { postBattleLoot.splice(postBattleLoot.indexOf(randItem), 1); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` picked up\n${randItem.type.name}!`)); + pokemon.scene.queueMessage(i18next.t("abilityTriggers:postBattleLoot", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), itemName: randItem.type.name })); return true; } } @@ -3492,7 +3540,7 @@ export class PostFaintContactDamageAbAttr extends PostFaintAbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return getPokemonMessage(pokemon, `'s ${abilityName} hurt\nits attacker!`); + return i18next.t("abilityTriggers:postFaintContactDamage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: abilityName }); } } @@ -3512,7 +3560,7 @@ export class PostFaintHPDamageAbAttr extends PostFaintAbAttr { } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return getPokemonMessage(pokemon, `'s ${abilityName} hurt\nits attacker!`); + return i18next.t("abilityTriggers:postFaintHpDamage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), abilityName: abilityName }); } } @@ -3870,7 +3918,7 @@ export class IceFaceBlockPhysicalAbAttr extends ReceivedMoveDamageMultiplierAbAt * @returns {string} - The trigger message. */ getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { - return i18next.t("abilityTriggers:iceFaceAvoidedDamage", { pokemonName: pokemon.name, abilityName: abilityName }); + return i18next.t("abilityTriggers:iceFaceAvoidedDamage", { pokemonName: getPokemonNameWithAffix(pokemon), abilityName: abilityName }); } } @@ -3922,47 +3970,42 @@ export class BypassSpeedChanceAbAttr extends AbAttr { } } -function applyAbAttrsInternal(attrType: Constructor, - pokemon: Pokemon, applyFunc: AbAttrApplyFunc, args: any[], isAsync: boolean = false, showAbilityInstant: boolean = false, quiet: boolean = false, passive: boolean = false): Promise { - return new Promise(resolve => { +async function applyAbAttrsInternal( + attrType: Constructor, + pokemon: Pokemon, + applyFunc: AbAttrApplyFunc, + args: any[], + showAbilityInstant: boolean = false, + quiet: boolean = false, +) { + for (const passive of [false, true]) { if (!pokemon.canApplyAbility(passive)) { - if (!passive) { - return applyAbAttrsInternal(attrType, pokemon, applyFunc, args, isAsync, showAbilityInstant, quiet, true).then(() => resolve()); - } else { - return resolve(); - } + continue; } - const ability = (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()); - const attrs = ability.getAttrs(attrType); + const ability = passive ? pokemon.getPassiveAbility() : pokemon.getAbility(); + for (const attr of ability.getAttrs(attrType)) { + const condition = attr.getCondition(); + if (condition && !condition(pokemon)) { + continue; + } - const clearSpliceQueueAndResolve = () => { - pokemon.scene?.clearPhaseQueueSplice(); - if (!passive) { - return applyAbAttrsInternal(attrType, pokemon, applyFunc, args, isAsync, showAbilityInstant, quiet, true).then(() => resolve()); - } else { - return resolve(); - } - }; - const applyNextAbAttr = () => { - if (attrs.length) { - applyAbAttr(attrs.shift()); - } else { - clearSpliceQueueAndResolve(); - } - }; - const applyAbAttr = (attr: TAttr) => { - if (!canApplyAttr(pokemon, attr)) { - return applyNextAbAttr(); - } pokemon.scene.setPhaseQueueSplice(); - const onApplySuccess = () => { + + let result = applyFunc(attr, passive); + // TODO Remove this when promises get reworked PR#924 + 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 && !pokemon.battleData.abilitiesApplied.includes(ability.id)) { pokemon.battleData.abilitiesApplied.push(ability.id); } + if (attr.showAbility && !quiet) { if (showAbilityInstant) { pokemon.scene.abilityBar.showAbility(pokemon, passive); @@ -3970,34 +4013,18 @@ function applyAbAttrsInternal(attrType: Constructor queueShowAbility(pokemon, passive); } } + if (!quiet) { - const message = attr.getTriggerMessage(pokemon, (!passive ? pokemon.getAbility() : pokemon.getPassiveAbility()).name, args); + const message = attr.getTriggerMessage(pokemon, ability.name, args); if (message) { - if (isAsync) { - pokemon.scene.ui.showText(message, null, () => pokemon.scene.ui.showText(null, 0), null, true); - } else { - pokemon.scene.queueMessage(message); - } + pokemon.scene.queueMessage(message); } } - }; - const result = applyFunc(attr, passive); - if (result instanceof Promise) { - result.then(success => { - if (success) { - onApplySuccess(); - } - applyNextAbAttr(); - }); - } else { - if (result) { - onApplySuccess(); - } - applyNextAbAttr(); } - }; - applyNextAbAttr(); - }); + } + + pokemon.scene.clearPhaseQueueSplice(); + } } export function applyAbAttrs(attrType: Constructor, pokemon: Pokemon, cancelled: Utils.BooleanHolder, ...args: any[]): Promise { @@ -4012,7 +4039,7 @@ export function applyPostBattleInitAbAttrs(attrType: Constructor, pokemon: Pokemon, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, ...args: any[]): Promise { const simulated = args.length > 1 && args[1]; - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreDefend(pokemon, passive, attacker, move, cancelled, args), args, false, false, simulated); + return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreDefend(pokemon, passive, attacker, move, cancelled, args), args, false, simulated); } export function applyPostDefendAbAttrs(attrType: Constructor, @@ -4072,7 +4099,7 @@ export function applyPostSummonAbAttrs(attrType: Constructor, export function applyPreSwitchOutAbAttrs(attrType: Constructor, pokemon: Pokemon, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreSwitchOut(pokemon, passive, args), args, false, true); + return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreSwitchOut(pokemon, passive, args), args, true); } export function applyPreStatChangeAbAttrs(attrType: Constructor, @@ -4088,7 +4115,7 @@ export function applyPostStatChangeAbAttrs(attrType: Constructor, pokemon: Pokemon, effect: StatusEffect, cancelled: Utils.BooleanHolder, ...args: any[]): Promise { const simulated = args.length > 1 && args[1]; - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreSetStatus(pokemon, passive, effect, cancelled, args), args, false, false, !simulated); + return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreSetStatus(pokemon, passive, effect, cancelled, args), args, false, !simulated); } export function applyPreApplyBattlerTagAbAttrs(attrType: Constructor, @@ -4098,7 +4125,7 @@ export function applyPreApplyBattlerTagAbAttrs(attrType: Constructor, pokemon: Pokemon, weather: Weather, cancelled: Utils.BooleanHolder, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreWeatherEffect(pokemon, passive, weather, cancelled, args), args, false, true); + return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreWeatherEffect(pokemon, passive, weather, cancelled, args), args, true); } export function applyPostTurnAbAttrs(attrType: Constructor, @@ -4123,7 +4150,7 @@ export function applyPostTerrainChangeAbAttrs(attrType: Constructor, pokemon: Pokemon, trapped: Utils.BooleanHolder, otherPokemon: Pokemon, ...args: any[]): Promise { - return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyCheckTrapped(pokemon, passive, trapped, otherPokemon, args), args, true); + return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyCheckTrapped(pokemon, passive, trapped, otherPokemon, args), args); } export function applyPostBattleAbAttrs(attrType: Constructor, @@ -4136,11 +4163,6 @@ export function applyPostFaintAbAttrs(attrType: Constructor, return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostFaint(pokemon, passive, attacker, move, hitResult, args), args); } -function canApplyAttr(pokemon: Pokemon, attr: AbAttr): boolean { - const condition = attr.getCondition(); - return !condition || condition(pokemon); -} - function queueShowAbility(pokemon: Pokemon, passive: boolean): void { pokemon.scene.unshiftPhase(new ShowAbilityPhase(pokemon.scene, pokemon.id, passive)); pokemon.scene.clearPhaseQueueSplice(); @@ -4202,7 +4224,8 @@ export function initAbilities() { .attr(IntimidateImmunityAbAttr) .ignorable(), new Ability(Abilities.CLOUD_NINE, 3) - .attr(SuppressWeatherEffectAbAttr, true), + .attr(SuppressWeatherEffectAbAttr, true) + .attr(PostSummonUnnamedMessageAbAttr, "The effects of the weather disappeared."), new Ability(Abilities.COMPOUND_EYES, 3) .attr(BattleStatMultiplierAbAttr, BattleStat.ACC, 1.3), new Ability(Abilities.INSOMNIA, 3) @@ -4311,7 +4334,7 @@ export function initAbilities() { .attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.SANDSTORM), new Ability(Abilities.PRESSURE, 3) .attr(IncreasePpAbAttr) - .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, " is exerting its Pressure!")), + .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) @@ -4334,7 +4357,7 @@ export function initAbilities() { new Ability(Abilities.TRUANT, 3) .attr(PostSummonAddBattlerTagAbAttr, BattlerTagType.TRUANT, 1, false), new Ability(Abilities.HUSTLE, 3) - .attr(BattleStatMultiplierAbAttr, BattleStat.ATK, 1.5, (user, target, move) => move.category === MoveCategory.PHYSICAL) + .attr(BattleStatMultiplierAbAttr, BattleStat.ATK, 1.5) .attr(BattleStatMultiplierAbAttr, BattleStat.ACC, 0.8, (user, target, move) => move.category === MoveCategory.PHYSICAL), new Ability(Abilities.CUTE_CHARM, 3) .attr(PostDefendContactApplyTagChanceAbAttr, 30, BattlerTagType.INFATUATED), @@ -4480,7 +4503,7 @@ export function initAbilities() { new Ability(Abilities.KLUTZ, 4) .unimplemented(), new Ability(Abilities.MOLD_BREAKER, 4) - .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, " breaks the mold!")) + .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonMoldBreaker", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })) .attr(MoveAbilityBypassAbAttr), new Ability(Abilities.SUPER_LUCK, 4) .attr(BonusCritAbAttr) @@ -4489,7 +4512,7 @@ export function initAbilities() { .attr(PostFaintContactDamageAbAttr,4) .bypassFaint(), new Ability(Abilities.ANTICIPATION, 4) - .conditionalAttr(getAnticipationCondition(), PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, " shuddered!")), + .conditionalAttr(getAnticipationCondition(), PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonAnticipation", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })), new Ability(Abilities.FOREWARN, 4) .attr(ForewarnAbAttr), new Ability(Abilities.UNAWARE, 4) @@ -4575,7 +4598,7 @@ export function initAbilities() { .attr(WeightMultiplierAbAttr, 0.5) .ignorable(), new Ability(Abilities.MULTISCALE, 5) - .attr(ReceivedMoveDamageMultiplierAbAttr,(target, user, move) => target.getHpRatio() === 1, 0.5) + .attr(ReceivedMoveDamageMultiplierAbAttr,(target, user, move) => target.isFullHp(), 0.5) .ignorable(), new Ability(Abilities.TOXIC_BOOST, 5) .attr(MovePowerBoostAbAttr, (user, target, move) => move.category === MoveCategory.PHYSICAL && (user.status?.effect === StatusEffect.POISON || user.status?.effect === StatusEffect.TOXIC), 1.5), @@ -4664,10 +4687,10 @@ export function initAbilities() { .attr(BattleStatMultiplierAbAttr, BattleStat.ACC, 1.1) .partial(), new Ability(Abilities.TURBOBLAZE, 5) - .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, " is radiating a blazing aura!")) + .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonTurboblaze", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })) .attr(MoveAbilityBypassAbAttr), new Ability(Abilities.TERAVOLT, 5) - .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, " is radiating a bursting aura!")) + .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonTeravolt", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })) .attr(MoveAbilityBypassAbAttr), new Ability(Abilities.AROMA_VEIL, 6) .ignorable() @@ -4706,7 +4729,7 @@ export function initAbilities() { .attr(UnsuppressableAbilityAbAttr) .attr(NoFusionAbilityAbAttr), new Ability(Abilities.GALE_WINGS, 6) - .attr(IncrementMovePriorityAbAttr, (pokemon, move) => pokemon.getHpRatio() === 1 && move.type === Type.FLYING), + .attr(IncrementMovePriorityAbAttr, (pokemon, move) => pokemon.isFullHp() && move.type === Type.FLYING), new Ability(Abilities.MEGA_LAUNCHER, 6) .attr(MovePowerBoostAbAttr, (user, target, move) => move.hasFlag(MoveFlags.PULSE_MOVE), 1.5), new Ability(Abilities.GRASS_PELT, 6) @@ -4725,10 +4748,10 @@ export function initAbilities() { new Ability(Abilities.PARENTAL_BOND, 6) .attr(AddSecondStrikeAbAttr, 0.25), new Ability(Abilities.DARK_AURA, 6) - .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, " is radiating a Dark Aura!")) + .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonDarkAura", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })) .attr(FieldMoveTypePowerBoostAbAttr, Type.DARK, 4 / 3), new Ability(Abilities.FAIRY_AURA, 6) - .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, " is radiating a Fairy Aura!")) + .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonFairyAura", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })) .attr(FieldMoveTypePowerBoostAbAttr, Type.FAIRY, 4 / 3), new Ability(Abilities.AURA_BREAK, 6) .ignorable() @@ -4911,7 +4934,7 @@ export function initAbilities() { new Ability(Abilities.FULL_METAL_BODY, 7) .attr(ProtectStatAbAttr), new Ability(Abilities.SHADOW_SHIELD, 7) - .attr(ReceivedMoveDamageMultiplierAbAttr,(target, user, move) => target.getHpRatio() === 1, 0.5), + .attr(ReceivedMoveDamageMultiplierAbAttr,(target, user, move) => target.isFullHp(), 0.5), new Ability(Abilities.PRISM_ARMOR, 7) .attr(ReceivedMoveDamageMultiplierAbAttr,(target, user, move) => target.getAttackTypeEffectiveness(move.type, user) >= 2, 0.75), new Ability(Abilities.NEUROFORCE, 7) @@ -4991,7 +5014,7 @@ export function initAbilities() { .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) .attr(NoTransformAbilityAbAttr) - .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, "'s Neutralizing Gas filled the area!")) + .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonNeutralizingGas", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })) .partial(), new Ability(Abilities.PASTEL_VEIL, 8) .attr(StatusEffectImmunityAbAttr, StatusEffect.POISON, StatusEffect.TOXIC) @@ -5019,14 +5042,14 @@ export function initAbilities() { new Ability(Abilities.GRIM_NEIGH, 8) .attr(PostVictoryStatChangeAbAttr, BattleStat.SPATK, 1), new Ability(Abilities.AS_ONE_GLASTRIER, 8) - .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, " has two Abilities!")) + .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonAsOneGlastrier", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })) .attr(PreventBerryUseAbAttr) .attr(PostVictoryStatChangeAbAttr, BattleStat.ATK, 1) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) .attr(UnsuppressableAbilityAbAttr), new Ability(Abilities.AS_ONE_SPECTRIER, 8) - .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, " has two Abilities!")) + .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonAsOneSpectrier", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })) .attr(PreventBerryUseAbAttr) .attr(PostVictoryStatChangeAbAttr, BattleStat.SPATK, 1) .attr(UncopiableAbilityAbAttr) @@ -5099,19 +5122,19 @@ export function initAbilities() { .partial(), new Ability(Abilities.VESSEL_OF_RUIN, 9) .attr(FieldMultiplyBattleStatAbAttr, Stat.SPATK, 0.75) - .attr(PostSummonMessageAbAttr, (user) => getPokemonMessage(user, `'s Vessel of Ruin lowered the ${getStatName(Stat.SPATK)}\nof all surrounding Pokémon!`)) + .attr(PostSummonMessageAbAttr, (user) => i18next.t("abilityTriggers:postSummonVesselOfRuin", { pokemonNameWithAffix: getPokemonNameWithAffix(user), statName: getStatName(Stat.SPATK) })) .ignorable(), new Ability(Abilities.SWORD_OF_RUIN, 9) .attr(FieldMultiplyBattleStatAbAttr, Stat.DEF, 0.75) - .attr(PostSummonMessageAbAttr, (user) => getPokemonMessage(user, `'s Sword of Ruin lowered the ${getStatName(Stat.DEF)}\nof all surrounding Pokémon!`)) + .attr(PostSummonMessageAbAttr, (user) => i18next.t("abilityTriggers:postSummonSwordOfRuin", { pokemonNameWithAffix: getPokemonNameWithAffix(user), statName: getStatName(Stat.DEF) })) .ignorable(), new Ability(Abilities.TABLETS_OF_RUIN, 9) .attr(FieldMultiplyBattleStatAbAttr, Stat.ATK, 0.75) - .attr(PostSummonMessageAbAttr, (user) => getPokemonMessage(user, `'s Tablets of Ruin lowered the ${getStatName(Stat.ATK)}\nof all surrounding Pokémon!`)) + .attr(PostSummonMessageAbAttr, (user) => i18next.t("abilityTriggers:postSummonTabletsOfRuin", { pokemonNameWithAffix: getPokemonNameWithAffix(user), statName: getStatName(Stat.ATK) })) .ignorable(), new Ability(Abilities.BEADS_OF_RUIN, 9) .attr(FieldMultiplyBattleStatAbAttr, Stat.SPDEF, 0.75) - .attr(PostSummonMessageAbAttr, (user) => getPokemonMessage(user, `'s Beads of Ruin lowered the ${getStatName(Stat.SPDEF)}\nof all surrounding Pokémon!`)) + .attr(PostSummonMessageAbAttr, (user) => i18next.t("abilityTriggers:postSummonBeadsOfRuin", { pokemonNameWithAffix: getPokemonNameWithAffix(user), statName: getStatName(Stat.SPDEF) })) .ignorable(), new Ability(Abilities.ORICHALCUM_PULSE, 9) .attr(PostSummonWeatherChangeAbAttr, WeatherType.SUNNY) diff --git a/src/data/arena-tag.ts b/src/data/arena-tag.ts index 28d38daffb4..d678f36c802 100644 --- a/src/data/arena-tag.ts +++ b/src/data/arena-tag.ts @@ -2,7 +2,7 @@ import { Arena } from "../field/arena"; import { Type } from "./type"; import * as Utils from "../utils"; import { MoveCategory, allMoves, MoveTarget } from "./move"; -import { getPokemonMessage } from "../messages"; +import { getPokemonMessage, getPokemonNameWithAffix } from "../messages"; import Pokemon, { HitResult, PokemonMove } from "../field/pokemon"; import { MoveEffectPhase, PokemonHealPhase, ShowAbilityPhase, StatChangePhase } from "../phases"; import { StatusEffect } from "./status-effect"; @@ -635,7 +635,7 @@ class StealthRockTag extends ArenaTrapTag { if (damageHpRatio) { const damage = Math.ceil(pokemon.getMaxHp() * damageHpRatio); - pokemon.scene.queueMessage(`Pointed stones dug into\n${pokemon.name}!`); + pokemon.scene.queueMessage(`Pointed stones dug into\n${getPokemonNameWithAffix(pokemon)}!`); pokemon.damageAndUpdate(damage, HitResult.OTHER); if (pokemon.turnData) { pokemon.turnData.damageTaken += damage; @@ -677,7 +677,7 @@ class StickyWebTag extends ArenaTrapTag { const cancelled = new Utils.BooleanHolder(false); applyAbAttrs(ProtectStatAbAttr, pokemon, cancelled); if (!cancelled.value) { - pokemon.scene.queueMessage(`The opposing ${pokemon.name} was caught in a sticky web!`); + pokemon.scene.queueMessage(`The opposing ${pokemon.getNameToRender()} was caught in a sticky web!`); const statLevels = new Utils.NumberHolder(-1); pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), false, [BattleStat.SPD], statLevels.value)); } @@ -759,7 +759,7 @@ class TailwindTag extends ArenaTag { // 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: pokemon.name, moveName: this.getMoveName() })); + pokemon.scene.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)) { diff --git a/src/data/battle-stat.ts b/src/data/battle-stat.ts index 7dccd4f8a7c..47f52b46d94 100644 --- a/src/data/battle-stat.ts +++ b/src/data/battle-stat.ts @@ -1,4 +1,4 @@ -import i18next from "i18next"; +import i18next, {ParseKeys} from "i18next"; export enum BattleStat { ATK, @@ -32,7 +32,7 @@ export function getBattleStatName(stat: BattleStat) { } } -export function getBattleStatLevelChangeDescription(pokemonNameWithAffix: string, stats: string, levels: integer, up: boolean) { +export function getBattleStatLevelChangeDescription(pokemonNameWithAffix: string, stats: string, levels: integer, up: boolean, count: integer = 1) { const stringKey = (() => { if (up) { switch (levels) { @@ -64,6 +64,5 @@ export function getBattleStatLevelChangeDescription(pokemonNameWithAffix: string } } })(); - - return i18next.t(stringKey, { pokemonNameWithAffix, stats }); + return i18next.t(stringKey as ParseKeys, { pokemonNameWithAffix, stats, count }); } diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 060bf3efa19..5cdb0bc3946 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -1,6 +1,6 @@ import { CommonAnim, CommonBattleAnim } from "./battle-anims"; -import { CommonAnimPhase, MoveEffectPhase, MovePhase, PokemonHealPhase, ShowAbilityPhase, StatChangePhase } from "../phases"; -import { getPokemonMessage, getPokemonNameWithAffix } from "../messages"; +import { CommonAnimPhase, MoveEffectPhase, MovePhase, PokemonHealPhase, ShowAbilityPhase, StatChangeCallback, StatChangePhase } from "../phases"; +import { getPokemonNameWithAffix } from "../messages"; import Pokemon, { MoveResult, HitResult } from "../field/pokemon"; import { Stat, getStatName } from "./pokemon-stat"; import { StatusEffect } from "./status-effect"; @@ -31,14 +31,14 @@ export enum BattlerTagLapseType { export class BattlerTag { public tagType: BattlerTagType; - public lapseType: BattlerTagLapseType; - public turnCount: integer; + public lapseType: BattlerTagLapseType[]; + public turnCount: number; public sourceMove: Moves; - public sourceId?: integer; + public sourceId?: number; - constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType, turnCount: integer, sourceMove: Moves, sourceId?: integer) { + constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType | BattlerTagLapseType[], turnCount: number, sourceMove: Moves, sourceId?: number) { this.tagType = tagType; - this.lapseType = lapseType; + this.lapseType = typeof lapseType === "number" ? [ lapseType ] : lapseType; this.turnCount = turnCount; this.sourceMove = sourceMove; this.sourceId = sourceId; @@ -92,30 +92,34 @@ export interface TerrainBattlerTag { terrainTypes: TerrainType[]; } +/** + * BattlerTag that represents the "recharge" effects of moves like Hyper Beam. + */ export class RechargingTag extends BattlerTag { constructor(sourceMove: Moves) { - super(BattlerTagType.RECHARGING, BattlerTagLapseType.PRE_MOVE, 1, 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: [] }); } + /** Cancels the source's move this turn and queues a "__ must recharge!" message */ lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { - super.lapse(pokemon, lapseType); - - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsRechargingLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); - (pokemon.scene.getCurrentPhase() as MovePhase).cancel(); - pokemon.getMoveQueue().shift(); - - return true; + if (lapseType === BattlerTagLapseType.PRE_MOVE) { + pokemon.scene.queueMessage(i18next.t("battle:battlerTagsRechargingLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + (pokemon.scene.getCurrentPhase() as MovePhase).cancel(); + pokemon.getMoveQueue().shift(); + } + return super.lapse(pokemon, lapseType); } } export class TrappedTag extends BattlerTag { - constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType, turnCount: integer, sourceMove: Moves, sourceId: integer) { + constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType, turnCount: number, sourceMove: Moves, sourceId: number) { super(tagType, lapseType, turnCount, sourceMove, sourceId); } @@ -142,7 +146,7 @@ export class TrappedTag extends BattlerTag { } getDescriptor(): string { - return "trapping"; + return i18next.t("battlerTags:trappedDesc"); } isSourceLinked(): boolean { @@ -154,9 +158,12 @@ export class TrappedTag extends BattlerTag { } } +/** + * BattlerTag that represents the {@link https://bulbapedia.bulbagarden.net/wiki/Flinch Flinch} status condition + */ export class FlinchedTag extends BattlerTag { constructor(sourceMove: Moves) { - super(BattlerTagType.FLINCHED, BattlerTagLapseType.PRE_MOVE, 0, sourceMove); + super(BattlerTagType.FLINCHED, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END ], 0, sourceMove); } onAdd(pokemon: Pokemon): void { @@ -169,17 +176,23 @@ export class FlinchedTag extends BattlerTag { return !pokemon.isMax(); } + /** + * Cancels the Pokemon's next Move on the turn this tag is applied + * @param pokemon The {@linkcode Pokemon} with this tag + * @param lapseType The {@linkcode BattlerTagLapseType lapse type} used for this function call + * @returns `false` (This tag is always removed after applying its effects) + */ lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { - super.lapse(pokemon, lapseType); + if (lapseType === BattlerTagLapseType.PRE_MOVE) { + (pokemon.scene.getCurrentPhase() as MovePhase).cancel(); + pokemon.scene.queueMessage(i18next.t("battle:battlerTagsFlinchedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + } - (pokemon.scene.getCurrentPhase() as MovePhase).cancel(); - pokemon.scene.queueMessage(i18next.t("battle:battlerTagsFlinchedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); - - return true; + return super.lapse(pokemon, lapseType); } getDescriptor(): string { - return "flinching"; + return i18next.t("battlerTags:flinchedDesc"); } } @@ -200,17 +213,16 @@ export class InterruptedTag extends BattlerTag { } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { - super.lapse(pokemon, lapseType); (pokemon.scene.getCurrentPhase() as MovePhase).cancel(); - return true; + return super.lapse(pokemon, lapseType); } } /** - * BattlerTag that represents the {@link https://bulbapedia.bulbagarden.net/wiki/Confusion_(status_condition)} + * BattlerTag that represents the {@link https://bulbapedia.bulbagarden.net/wiki/Confusion_(status_condition) Confusion} status condition */ export class ConfusedTag extends BattlerTag { - constructor(turnCount: integer, sourceMove: Moves) { + constructor(turnCount: number, sourceMove: Moves) { super(BattlerTagType.CONFUSED, BattlerTagLapseType.MOVE, turnCount, sourceMove); } @@ -260,7 +272,7 @@ export class ConfusedTag extends BattlerTag { } getDescriptor(): string { - return "confusion"; + return i18next.t("battlerTags:confusedDesc"); } } @@ -270,7 +282,7 @@ export class ConfusedTag extends BattlerTag { * @see {@linkcode apply} */ export class DestinyBondTag extends BattlerTag { - constructor(sourceMove: Moves, sourceId: integer) { + constructor(sourceMove: Moves, sourceId: number) { super(BattlerTagType.DESTINY_BOND, BattlerTagLapseType.PRE_MOVE, 1, sourceMove, sourceId); } @@ -313,7 +325,7 @@ export class DestinyBondTag extends BattlerTag { } export class InfatuatedTag extends BattlerTag { - constructor(sourceMove: integer, sourceId: integer) { + constructor(sourceMove: number, sourceId: number) { super(BattlerTagType.INFATUATED, BattlerTagLapseType.MOVE, 1, sourceMove, sourceId); } @@ -327,7 +339,7 @@ export class InfatuatedTag extends BattlerTag { pokemon.scene.queueMessage( i18next.t("battle:battlerTagsInfatuatedOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - sourcePokemonName: pokemon.scene.getPokemonById(this.sourceId).name + sourcePokemonName: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId)) }) ); } @@ -345,7 +357,7 @@ export class InfatuatedTag extends BattlerTag { pokemon.scene.queueMessage( i18next.t("battle:battlerTagsInfatuatedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - sourcePokemonName: pokemon.scene.getPokemonById(this.sourceId).name + sourcePokemonName: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId)) }) ); pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), undefined, CommonAnim.ATTRACT)); @@ -370,14 +382,14 @@ export class InfatuatedTag extends BattlerTag { } getDescriptor(): string { - return "infatuation"; + return i18next.t("battlerTags:infatuatedDesc"); } } export class SeedTag extends BattlerTag { - private sourceIndex: integer; + private sourceIndex: number; - constructor(sourceId: integer) { + constructor(sourceId: number) { super(BattlerTagType.SEEDED, BattlerTagLapseType.TURN_END, 1, Moves.LEECH_SEED, sourceId); } @@ -427,7 +439,7 @@ export class SeedTag extends BattlerTag { } getDescriptor(): string { - return "seeding"; + return i18next.t("battlerTags:seedDesc"); } } @@ -467,24 +479,26 @@ export class NightmareTag extends BattlerTag { } getDescriptor(): string { - return "nightmares"; + return i18next.t("battlerTags:nightmareDesc"); } } export class FrenzyTag extends BattlerTag { - constructor(sourceMove: Moves, sourceId: integer) { - super(BattlerTagType.FRENZY, BattlerTagLapseType.CUSTOM, 1, sourceMove, sourceId); + constructor(turnCount: number, sourceMove: Moves, sourceId: number) { + super(BattlerTagType.FRENZY, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId); } onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - pokemon.addTag(BattlerTagType.CONFUSED, pokemon.randSeedIntRange(2, 4)); + 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 ChargingTag extends BattlerTag { - constructor(sourceMove: Moves, sourceId: integer) { + constructor(sourceMove: Moves, sourceId: number) { super(BattlerTagType.CHARGING, BattlerTagLapseType.CUSTOM, 1, sourceMove, sourceId); } } @@ -492,7 +506,7 @@ export class ChargingTag extends BattlerTag { export class EncoreTag extends BattlerTag { public moveId: Moves; - constructor(sourceId: integer) { + constructor(sourceId: number) { super(BattlerTagType.ENCORE, BattlerTagLapseType.AFTER_MOVE, 3, Moves.ENCORE, sourceId); } @@ -565,7 +579,7 @@ export class EncoreTag extends BattlerTag { } export class HelpingHandTag extends BattlerTag { - constructor(sourceId: integer) { + constructor(sourceId: number) { super(BattlerTagType.HELPING_HAND, BattlerTagLapseType.TURN_END, 1, Moves.HELPING_HAND, sourceId); } @@ -573,7 +587,7 @@ export class HelpingHandTag extends BattlerTag { pokemon.scene.queueMessage( i18next.t("battle:battlerTagsHelpingHandOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId)), - pokemonName: pokemon.name + pokemonName: getPokemonNameWithAffix(pokemon) }) ); } @@ -584,7 +598,7 @@ export class HelpingHandTag extends BattlerTag { * @extends TrappedTag */ export class IngrainTag extends TrappedTag { - constructor(sourceId: integer) { + constructor(sourceId: number) { super(BattlerTagType.INGRAIN, BattlerTagLapseType.TURN_END, 1, Moves.INGRAIN, sourceId); } @@ -622,7 +636,33 @@ export class IngrainTag extends TrappedTag { } getDescriptor(): string { - return "roots"; + return i18next.t("battlerTags:ingrainDesc"); + } +} + +/** + * Octolock traps the target pokemon and reduces its DEF and SPDEF by one stage at the + * end of each turn. + */ +export class OctolockTag extends TrappedTag { + constructor(sourceId: number) { + super(BattlerTagType.OCTOLOCK, BattlerTagLapseType.TURN_END, 1, Moves.OCTOLOCK, sourceId); + } + + canAdd(pokemon: Pokemon): boolean { + const isOctolocked = pokemon.getTag(BattlerTagType.OCTOLOCK); + return !isOctolocked; + } + + lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { + const shouldLapse = lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType); + + if (shouldLapse) { + pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.DEF, BattleStat.SPDEF], -1)); + return true; + } + + return false; } } @@ -648,7 +688,7 @@ export class AquaRingTag extends BattlerTag { Math.floor(pokemon.getMaxHp() / 16), i18next.t("battle:battlerTagsAquaRingLapse", { moveName: this.getMoveName(), - pokemonName: pokemon.name + pokemonName: getPokemonNameWithAffix(pokemon) }), true)); } @@ -709,14 +749,14 @@ export class DrowsyTag extends BattlerTag { } getDescriptor(): string { - return "drowsiness"; + return i18next.t("battlerTags:drowsyDesc"); } } export abstract class DamagingTrapTag extends TrappedTag { private commonAnim: CommonAnim; - constructor(tagType: BattlerTagType, commonAnim: CommonAnim, turnCount: integer, sourceMove: Moves, sourceId: integer) { + constructor(tagType: BattlerTagType, commonAnim: CommonAnim, turnCount: number, sourceMove: Moves, sourceId: number) { super(tagType, BattlerTagLapseType.TURN_END, turnCount, sourceMove, sourceId); this.commonAnim = commonAnim; @@ -760,34 +800,34 @@ export abstract class DamagingTrapTag extends TrappedTag { } export class BindTag extends DamagingTrapTag { - constructor(turnCount: integer, sourceId: integer) { + constructor(turnCount: number, sourceId: number) { super(BattlerTagType.BIND, CommonAnim.BIND, turnCount, Moves.BIND, sourceId); } getTrapMessage(pokemon: Pokemon): string { return i18next.t("battle:battlerTagsBindOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - sourcePokemonName: pokemon.scene.getPokemonById(this.sourceId).name, + sourcePokemonName: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId)), moveName: this.getMoveName() }); } } export class WrapTag extends DamagingTrapTag { - constructor(turnCount: integer, sourceId: integer) { + constructor(turnCount: number, sourceId: number) { super(BattlerTagType.WRAP, CommonAnim.WRAP, turnCount, Moves.WRAP, sourceId); } getTrapMessage(pokemon: Pokemon): string { return i18next.t("battle:battlerTagsWrapOnTrap", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), - sourcePokemonName: pokemon.scene.getPokemonById(this.sourceId).name + sourcePokemonName: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId)) }); } } export abstract class VortexTrapTag extends DamagingTrapTag { - constructor(tagType: BattlerTagType, commonAnim: CommonAnim, turnCount: integer, sourceMove: Moves, sourceId: integer) { + constructor(tagType: BattlerTagType, commonAnim: CommonAnim, turnCount: number, sourceMove: Moves, sourceId: number) { super(tagType, commonAnim, turnCount, sourceMove, sourceId); } @@ -797,32 +837,32 @@ export abstract class VortexTrapTag extends DamagingTrapTag { } export class FireSpinTag extends VortexTrapTag { - constructor(turnCount: integer, sourceId: integer) { + constructor(turnCount: number, sourceId: number) { super(BattlerTagType.FIRE_SPIN, CommonAnim.FIRE_SPIN, turnCount, Moves.FIRE_SPIN, sourceId); } } export class WhirlpoolTag extends VortexTrapTag { - constructor(turnCount: integer, sourceId: integer) { + constructor(turnCount: number, sourceId: number) { super(BattlerTagType.WHIRLPOOL, CommonAnim.WHIRLPOOL, turnCount, Moves.WHIRLPOOL, sourceId); } } export class ClampTag extends DamagingTrapTag { - constructor(turnCount: integer, sourceId: integer) { + constructor(turnCount: number, sourceId: number) { super(BattlerTagType.CLAMP, CommonAnim.CLAMP, turnCount, Moves.CLAMP, sourceId); } getTrapMessage(pokemon: Pokemon): string { return i18next.t("battle:battlerTagsClampOnTrap", { sourcePokemonNameWithAffix: getPokemonNameWithAffix(pokemon.scene.getPokemonById(this.sourceId)), - pokemonName: pokemon.name, + pokemonName: getPokemonNameWithAffix(pokemon), }); } } export class SandTombTag extends DamagingTrapTag { - constructor(turnCount: integer, sourceId: integer) { + constructor(turnCount: number, sourceId: number) { super(BattlerTagType.SAND_TOMB, CommonAnim.SAND_TOMB, turnCount, Moves.SAND_TOMB, sourceId); } @@ -835,7 +875,7 @@ export class SandTombTag extends DamagingTrapTag { } export class MagmaStormTag extends DamagingTrapTag { - constructor(turnCount: integer, sourceId: integer) { + constructor(turnCount: number, sourceId: number) { super(BattlerTagType.MAGMA_STORM, CommonAnim.MAGMA_STORM, turnCount, Moves.MAGMA_STORM, sourceId); } @@ -845,7 +885,7 @@ export class MagmaStormTag extends DamagingTrapTag { } export class SnapTrapTag extends DamagingTrapTag { - constructor(turnCount: integer, sourceId: integer) { + constructor(turnCount: number, sourceId: number) { super(BattlerTagType.SNAP_TRAP, CommonAnim.SNAP_TRAP, turnCount, Moves.SNAP_TRAP, sourceId); } @@ -855,7 +895,7 @@ export class SnapTrapTag extends DamagingTrapTag { } export class ThunderCageTag extends DamagingTrapTag { - constructor(turnCount: integer, sourceId: integer) { + constructor(turnCount: number, sourceId: number) { super(BattlerTagType.THUNDER_CAGE, CommonAnim.THUNDER_CAGE, turnCount, Moves.THUNDER_CAGE, sourceId); } @@ -868,7 +908,7 @@ export class ThunderCageTag extends DamagingTrapTag { } export class InfestationTag extends DamagingTrapTag { - constructor(turnCount: integer, sourceId: integer) { + constructor(turnCount: number, sourceId: number) { super(BattlerTagType.INFESTATION, CommonAnim.INFESTATION, turnCount, Moves.INFESTATION, sourceId); } @@ -883,7 +923,7 @@ export class InfestationTag extends DamagingTrapTag { export class ProtectedTag extends BattlerTag { constructor(sourceMove: Moves, tagType: BattlerTagType = BattlerTagType.PROTECTED) { - super(tagType, BattlerTagLapseType.CUSTOM, 0, sourceMove); + super(tagType, BattlerTagLapseType.TURN_END, 0, sourceMove); } onAdd(pokemon: Pokemon): void { @@ -910,9 +950,9 @@ export class ProtectedTag extends BattlerTag { } export class ContactDamageProtectedTag extends ProtectedTag { - private damageRatio: integer; + private damageRatio: number; - constructor(sourceMove: Moves, damageRatio: integer) { + constructor(sourceMove: Moves, damageRatio: number) { super(sourceMove, BattlerTagType.SPIKY_SHIELD); this.damageRatio = damageRatio; @@ -946,9 +986,9 @@ export class ContactDamageProtectedTag extends ProtectedTag { export class ContactStatChangeProtectedTag extends ProtectedTag { private stat: BattleStat; - private levels: integer; + private levels: number; - constructor(sourceMove: Moves, tagType: BattlerTagType, stat: BattleStat, levels: integer) { + constructor(sourceMove: Moves, tagType: BattlerTagType, stat: BattleStat, levels: number) { super(sourceMove, tagType); this.stat = stat; @@ -1057,7 +1097,7 @@ export class SturdyTag extends BattlerTag { } export class PerishSongTag extends BattlerTag { - constructor(turnCount: integer) { + constructor(turnCount: number) { super(BattlerTagType.PERISH_SONG, BattlerTagLapseType.TURN_END, turnCount, Moves.PERISH_SONG); } @@ -1106,14 +1146,14 @@ export class CenterOfAttentionTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " became the center\nof attention!")); + pokemon.scene.queueMessage(i18next.t("battle:battlerTagsCenterOfAttentionOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } } export class AbilityBattlerTag extends BattlerTag { public ability: Abilities; - constructor(tagType: BattlerTagType, ability: Abilities, lapseType: BattlerTagLapseType, turnCount: integer) { + constructor(tagType: BattlerTagType, ability: Abilities, lapseType: BattlerTagLapseType, turnCount: number) { super(tagType, lapseType, turnCount, undefined); this.ability = ability; @@ -1201,7 +1241,7 @@ export class HighestStatBoostTag extends AbilityBattlerTag { const stats = [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ]; let highestStat: Stat; - stats.map(s => pokemon.getBattleStat(s)).reduce((highestValue: integer, value: integer, i: integer) => { + stats.map(s => pokemon.getBattleStat(s)).reduce((highestValue: number, value: number, i: number) => { if (value > highestValue) { highestStat = stats[i]; return value; @@ -1267,7 +1307,7 @@ export class TerrainHighestStatBoostTag extends HighestStatBoostTag implements T } export class SemiInvulnerableTag extends BattlerTag { - constructor(tagType: BattlerTagType, turnCount: integer, sourceMove: Moves) { + constructor(tagType: BattlerTagType, turnCount: number, sourceMove: Moves) { super(tagType, BattlerTagLapseType.MOVE_EFFECT, turnCount, sourceMove); } @@ -1313,13 +1353,13 @@ export class MagnetRisenTag extends TypeImmuneTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " levitated with electromagnetism!")); + pokemon.scene.queueMessage(i18next.t("battle:battlerTagsMagnetRisenOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, " stopped levitating!")); + pokemon.scene.queueMessage(i18next.t("battle:battlerTagsMagnetRisenOnRemove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } } @@ -1386,10 +1426,22 @@ export class IgnoreAccuracyTag extends BattlerTag { } } -export class SaltCuredTag extends BattlerTag { - private sourceIndex: integer; +export class AlwaysGetHitTag extends BattlerTag { + constructor(sourceMove: Moves) { + super(BattlerTagType.ALWAYS_GET_HIT, BattlerTagLapseType.PRE_MOVE, 1, sourceMove); + } +} - constructor(sourceId: integer) { +export class ReceiveDoubleDamageTag extends BattlerTag { + constructor(sourceMove: Moves) { + super(BattlerTagType.RECEIVE_DOUBLE_DAMAGE, BattlerTagLapseType.PRE_MOVE, 1, sourceMove); + } +} + +export class SaltCuredTag extends BattlerTag { + private sourceIndex: number; + + constructor(sourceId: number) { super(BattlerTagType.SALT_CURED, BattlerTagLapseType.TURN_END, 1, Moves.SALT_CURE, sourceId); } @@ -1436,9 +1488,9 @@ export class SaltCuredTag extends BattlerTag { } export class CursedTag extends BattlerTag { - private sourceIndex: integer; + private sourceIndex: number; - constructor(sourceId: integer) { + constructor(sourceId: number) { super(BattlerTagType.CURSED, BattlerTagLapseType.TURN_END, 1, Moves.CURSE, sourceId); } @@ -1477,8 +1529,8 @@ export class CursedTag extends BattlerTag { /** * Battler tag for effects that ground the source, allowing Ground-type moves to hit them. Encompasses two tag types: - * @item IGNORE_FLYING: Persistent grounding effects (i.e. from Smack Down and Thousand Waves) - * @item ROOSTED: One-turn grounding effects (i.e. from Roost) + * @item `IGNORE_FLYING`: Persistent grounding effects (i.e. from Smack Down and Thousand Waves) + * @item `ROOSTED`: One-turn grounding effects (i.e. from Roost) */ export class GroundedTag extends BattlerTag { constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType, sourceMove: Moves) { @@ -1537,6 +1589,95 @@ export class IceFaceTag extends BattlerTag { } } + +/** + * Battler tag enabling the Stockpile mechanic. This tag handles: + * - Stack tracking, including max limit enforcement (which is replicated in Stockpile for redundancy). + * + * - Stat changes on adding a stack. Adding a stockpile stack attempts to raise the pokemon's DEF and SPDEF by +1. + * + * - Stat changes on removal of (all) stacks. + * - Removing stacks decreases DEF and SPDEF, independently, by one stage for each stack that successfully changed + * the stat when added. + */ +export class StockpilingTag extends BattlerTag { + public stockpiledCount: number = 0; + public statChangeCounts: { [BattleStat.DEF]: number; [BattleStat.SPDEF]: number } = { + [BattleStat.DEF]: 0, + [BattleStat.SPDEF]: 0 + }; + + constructor(sourceMove: Moves = Moves.NONE) { + super(BattlerTagType.STOCKPILING, BattlerTagLapseType.CUSTOM, 1, sourceMove); + } + + private onStatsChanged: StatChangeCallback = (_, statsChanged, statChanges) => { + const defChange = statChanges[statsChanged.indexOf(BattleStat.DEF)] ?? 0; + const spDefChange = statChanges[statsChanged.indexOf(BattleStat.SPDEF)] ?? 0; + + if (defChange) { + this.statChangeCounts[BattleStat.DEF]++; + } + + if (spDefChange) { + this.statChangeCounts[BattleStat.SPDEF]++; + } + }; + + loadTag(source: BattlerTag | any): void { + super.loadTag(source); + this.stockpiledCount = source.stockpiledCount || 0; + this.statChangeCounts = { + [BattleStat.DEF]: source.statChangeCounts?.[BattleStat.DEF] || 0, + [BattleStat.SPDEF]: source.statChangeCounts?.[BattleStat.SPDEF] || 0, + }; + } + + /** + * Adds a stockpile stack to a pokemon, up to a maximum of 3 stacks. Note that onOverlap defers to this method. + * + * If a stack is added, a message is displayed and the pokemon's DEF and SPDEF are increased by 1. + * For each stat, an internal counter is incremented (by 1) if the stat was successfully changed. + */ + onAdd(pokemon: Pokemon): void { + if (this.stockpiledCount < 3) { + this.stockpiledCount++; + + pokemon.scene.queueMessage(i18next.t("battle:battlerTagsStockpilingOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + stockpiledCount: this.stockpiledCount + })); + + // Attempt to increase DEF and SPDEF by one stage, keeping track of successful changes. + pokemon.scene.unshiftPhase(new StatChangePhase( + pokemon.scene, pokemon.getBattlerIndex(), true, + [BattleStat.SPDEF, BattleStat.DEF], 1, true, false, true, this.onStatsChanged + )); + } + } + + onOverlap(pokemon: Pokemon): void { + this.onAdd(pokemon); + } + + /** + * Removing the tag removes all stacks, and the pokemon's DEF and SPDEF are decreased by + * one stage for each stack which had successfully changed that particular stat during onAdd. + */ + onRemove(pokemon: Pokemon): void { + const defChange = this.statChangeCounts[BattleStat.DEF]; + const spDefChange = this.statChangeCounts[BattleStat.SPDEF]; + + if (defChange) { + pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.DEF], -defChange, true, false, true)); + } + + if (spDefChange) { + pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.SPDEF], -spDefChange, true, false, true)); + } + } +} + export class MysteryEncounterPostSummonTag extends BattlerTag { constructor(sourceMove: Moves) { super(BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON, BattlerTagLapseType.CUSTOM, 1, sourceMove); @@ -1569,7 +1710,7 @@ export class MysteryEncounterPostSummonTag extends BattlerTag { } } -export function getBattlerTag(tagType: BattlerTagType, turnCount: integer, sourceMove: Moves, sourceId: integer): BattlerTag { +export function getBattlerTag(tagType: BattlerTagType, turnCount: number, sourceMove: Moves, sourceId: number): BattlerTag { switch (tagType) { case BattlerTagType.RECHARGING: return new RechargingTag(sourceMove); @@ -1586,7 +1727,7 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: integer, sourc case BattlerTagType.NIGHTMARE: return new NightmareTag(); case BattlerTagType.FRENZY: - return new FrenzyTag(sourceMove, sourceId); + return new FrenzyTag(turnCount, sourceMove, sourceId); case BattlerTagType.CHARGING: return new ChargingTag(sourceMove, sourceId); case BattlerTagType.ENCORE: @@ -1666,6 +1807,10 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: integer, sourc return new BattlerTag(tagType, BattlerTagLapseType.AFTER_MOVE, turnCount, sourceMove); case BattlerTagType.IGNORE_ACCURACY: return new IgnoreAccuracyTag(sourceMove); + case BattlerTagType.ALWAYS_GET_HIT: + return new AlwaysGetHitTag(sourceMove); + case BattlerTagType.RECEIVE_DOUBLE_DAMAGE: + return new ReceiveDoubleDamageTag(sourceMove); case BattlerTagType.BYPASS_SLEEP: return new BattlerTag(BattlerTagType.BYPASS_SLEEP, BattlerTagLapseType.TURN_END, turnCount, sourceMove); case BattlerTagType.IGNORE_FLYING: @@ -1686,6 +1831,10 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: integer, sourc return new DestinyBondTag(sourceMove, sourceId); case BattlerTagType.ICE_FACE: return new IceFaceTag(sourceMove); + case BattlerTagType.STOCKPILING: + return new StockpilingTag(sourceMove); + case BattlerTagType.OCTOLOCK: + return new OctolockTag(sourceId); case BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON: return new MysteryEncounterPostSummonTag(sourceMove); case BattlerTagType.NONE: diff --git a/src/data/berry.ts b/src/data/berry.ts index 2f0f466d8a9..5ca64544544 100644 --- a/src/data/berry.ts +++ b/src/data/berry.ts @@ -1,5 +1,5 @@ import { PokemonHealPhase, StatChangePhase } from "../phases"; -import { getPokemonMessage, getPokemonNameWithAffix } from "../messages"; +import { getPokemonNameWithAffix } from "../messages"; import Pokemon, { HitResult } from "../field/pokemon"; import { BattleStat } from "./battle-stat"; import { getStatusEffectHealText } from "./status-effect"; @@ -72,7 +72,7 @@ export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc { const hpHealed = new Utils.NumberHolder(Math.floor(pokemon.getMaxHp() / 4)); applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, hpHealed); pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, pokemon.getBattlerIndex(), - hpHealed.value, getPokemonMessage(pokemon, `'s ${getBerryName(berryType)}\nrestored its HP!`), true)); + hpHealed.value, i18next.t("battle:hpHealBerry", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), berryName: getBerryName(berryType) }), true)); }; case BerryType.LUM: return (pokemon: Pokemon) => { @@ -123,7 +123,7 @@ export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc { const ppRestoreMove = pokemon.getMoveset().find(m => !m.getPpRatio()) ? pokemon.getMoveset().find(m => !m.getPpRatio()) : pokemon.getMoveset().find(m => m.getPpRatio() < 1); if (ppRestoreMove !== undefined) { ppRestoreMove.ppUsed = Math.max(ppRestoreMove.ppUsed - 10, 0); - pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` restored PP to its move ${ppRestoreMove.getName()}\nusing its ${getBerryName(berryType)}!`)); + pokemon.scene.queueMessage(i18next.t("battle:ppHealBerry", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: ppRestoreMove.getName(), berryName: getBerryName(berryType) })); } }; } diff --git a/src/data/challenge.ts b/src/data/challenge.ts index 75b200b24ee..ad8c312bdf6 100644 --- a/src/data/challenge.ts +++ b/src/data/challenge.ts @@ -1,52 +1,94 @@ import * as Utils from "../utils"; import i18next from "i18next"; -import { DexAttrProps, GameData } from "#app/system/game-data.js"; +import { defaultStarterSpecies, DexAttrProps, GameData } from "#app/system/game-data.js"; import PokemonSpecies, { getPokemonSpecies, getPokemonSpeciesForm, speciesStarters } from "./pokemon-species"; -import Pokemon from "#app/field/pokemon.js"; +import Pokemon, { PokemonMove } from "#app/field/pokemon.js"; import { BattleType, FixedBattleConfig } from "#app/battle.js"; import Trainer, { TrainerVariant } from "#app/field/trainer.js"; import { GameMode } from "#app/game-mode.js"; import { Type } from "./type"; -import { pokemonEvolutions } from "./pokemon-evolutions"; -import { pokemonFormChanges } from "./pokemon-forms"; import { Challenges } from "#enums/challenges"; import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; +import { Nature } from "./nature"; +import { Moves } from "#app/enums/moves.js"; import { TypeColor, TypeShadow } from "#app/enums/color.js"; +import { Gender } from "./gender"; +import { pokemonEvolutions } from "./pokemon-evolutions"; +import { pokemonFormChanges } from "./pokemon-forms"; /** * An enum for all the challenge types. The parameter entries on these describe the * parameters to use when calling the applyChallenges function. */ export enum ChallengeType { - /** - * Challenges which modify what starters you can choose - * @param args [0] {@link PokemonSpecies} The species to check - * [1] {@link Utils.BooleanHolder} Sets to false if illegal, pass in true. - */ + /** + * Challenges which modify what starters you can choose + * @see {@link Challenge.applyStarterChoice} + */ STARTER_CHOICE, - /** - * Challenges which modify how many starter points you have - * @param args [0] {@link Utils.NumberHolder} The amount of starter points you have - */ + /** + * 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 - * Not Fully Implemented + * @see {@link Challenge.applyStarterModify} */ STARTER_MODIFY, /** * Challenges which limit which pokemon you can have in battle. - * @param args [0] {@link Pokemon} The pokemon to check - * [1] {@link Utils.BooleanHolder} Sets to false if illegal, pass in true. + * @see {@link Challenge.applyPokemonInBattle} */ POKEMON_IN_BATTLE, /** * Adds or modifies the fixed battles in a run - * @param args [0] integer The wave to get a battle for - * [1] {@link FixedBattleConfig} A new fixed battle. It'll be modified if a battle exists. + * @see {@link Challenge.applyFixedBattle} */ FIXED_BATTLES, + /** + * Modifies what level the AI pokemon are. UNIMPLEMENTED. + */ + AI_LEVEL, + /** + * Modifies how many move slots the AI has. UNIMPLEMENTED. + */ + AI_MOVE_SLOTS, + /** + * Modifies if a pokemon has its passive. UNIMPLEMENTED. + */ + PASSIVE_ACCESS, + /** + * Modifies the game mode settings in some way. UNIMPLEMENTED. + */ + GAME_MODE_MODIFY, + /** + * Modifies what level AI pokemon can access a move. UNIMPLEMENTED. + */ + MOVE_ACCESS, + /** + * Modifies what weight AI pokemon have when generating movesets. UNIMPLEMENTED. + */ + MOVE_WEIGHT, +} + +/** + * Used for challenge types that modify movesets, these denote the various sources of moves for pokemon. + */ +export enum MoveSourceType { + LEVEL_UP, // Currently unimplemented for move access + RELEARNER, // Relearner moves currently unimplemented + COMMON_TM, + GREAT_TM, + ULTRA_TM, + COMMON_EGG, + RARE_EGG } /** @@ -61,10 +103,9 @@ export abstract class Challenge { public maxSeverity: integer; // The maximum severity of the challenge. public conditions: ChallengeCondition[]; - public challengeTypes: ChallengeType[]; /** - * @param {Challenges} id The enum value for the challenge + * @param id {@link Challenges} The enum value for the challenge */ constructor(id: Challenges, maxValue: integer = Number.MAX_SAFE_INTEGER) { this.id = id; @@ -74,7 +115,6 @@ export abstract class Challenge { this.severity = 0; this.maxSeverity = 0; this.conditions = []; - this.challengeTypes = []; } /** @@ -87,7 +127,7 @@ export abstract class Challenge { /** * Gets the localisation key for the challenge - * @returns The i18n key for this 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(""); @@ -95,8 +135,8 @@ export abstract class Challenge { /** * Used for unlockable challenges to check if they're unlocked. - * @param {GameData} data The save data. - * @returns {boolean} Whether this challenge is unlocked. + * @param data {@link GameData} The save data. + * @returns {@link boolean} Whether this challenge is unlocked. */ isUnlocked(data: GameData): boolean { return this.conditions.every(f => f(data)); @@ -104,8 +144,8 @@ export abstract class Challenge { /** * Adds an unlock condition to this challenge. - * @param {ChallengeCondition} condition The condition to add. - * @returns {Challenge} This challenge + * @param condition {@link ChallengeCondition} The condition to add. + * @returns {@link Challenge} This challenge */ condition(condition: ChallengeCondition): Challenge { this.conditions.push(condition); @@ -114,27 +154,7 @@ export abstract class Challenge { } /** - * If this challenge is of a particular type - * @param {ChallengeType} challengeType The challenge type to check. - * @returns {Challenge} This challenge - */ - isOfType(challengeType: ChallengeType): boolean { - return this.challengeTypes.some(c => c === challengeType); - } - - /** - * Adds a challenge type to this challenge. - * @param {ChallengeType} challengeType The challenge type to add. - * @returns {Challenge} This challenge - */ - addChallengeType(challengeType: ChallengeType): Challenge { - this.challengeTypes.push(challengeType); - - return this; - } - - /** - * @returns {string} The localised name of this challenge. + * @returns {@link string} The localised name of this challenge. */ getName(): string { return i18next.t(`challenges:${this.geti18nKey()}.name`); @@ -142,8 +162,8 @@ export abstract class Challenge { /** * Returns the textual representation of a challenge's current value. - * @param {value} overrideValue The value to check for. If undefined, gets the current value. - * @returns {string} The localised name for the current value. + * @param overrideValue {@link integer} The value to check for. If undefined, gets the current value. + * @returns {@link string} The localised name for the current value. */ getValue(overrideValue?: integer): string { if (overrideValue === undefined) { @@ -154,19 +174,19 @@ export abstract class Challenge { /** * Returns the description of a challenge's current value. - * @param {value} overrideValue The value to check for. If undefined, gets the current value. - * @returns {string} The localised description for the current value. + * @param overrideValue {@link integer} The value to check for. If undefined, gets the current value. + * @returns {@link string} The localised description for the current value. */ getDescription(overrideValue?: integer): string { if (overrideValue === undefined) { overrideValue = this.value; } - return `${i18next.t("challenges:usePokemon")}${i18next.t(`challenges:${this.geti18nKey()}.desc.${this.value}`)}`; + return `${i18next.t([`challenges:${this.geti18nKey()}.desc.${this.value}`, `challenges:${this.geti18nKey()}.desc`])}`; } /** * Increase the value of the challenge - * @returns {boolean} Returns true if the value changed + * @returns {@link boolean} Returns true if the value changed */ increaseValue(): boolean { if (this.value < this.maxValue) { @@ -178,7 +198,7 @@ export abstract class Challenge { /** * Decrease the value of the challenge - * @returns {boolean} Returns true if the value changed + * @returns {@link boolean} Returns true if the value changed */ decreaseValue(): boolean { if (this.value > 0) { @@ -197,7 +217,7 @@ export abstract class Challenge { /** * Decrease the severity of the challenge - * @returns {boolean} Returns true if the value changed + * @returns {@link boolean} Returns true if the value changed */ decreaseSeverity(): boolean { if (this.severity > 0) { @@ -209,7 +229,7 @@ export abstract class Challenge { /** * Increase the severity of the challenge - * @returns {boolean} Returns true if the value changed + * @returns {@link boolean} Returns true if the value changed */ increaseSeverity(): boolean { if (this.severity < this.maxSeverity) { @@ -221,7 +241,7 @@ export abstract class Challenge { /** * Gets the "difficulty" value of this challenge. - * @returns {integer} The difficulty value. + * @returns {@link integer} The difficulty value. */ getDifficulty(): integer { return this.value; @@ -229,27 +249,147 @@ export abstract class Challenge { /** * Gets the minimum difficulty added by this challenge. - * @returns {integer} The difficulty value. + * @returns {@link integer} The difficulty value. */ getMinDifficulty(): integer { return 0; } - /** - * Modifies the data or game state in some way to apply the challenge. - * @param {ChallengeType} challengeType Which challenge type this is being applied for. - * @param args Irrelevant. See the specific challenge's apply function for additional information. - */ - abstract apply(challengeType: ChallengeType, args: any[]): boolean; - /** * Clones a challenge, either from another challenge or json. Chainable. - * @param {Challenge | any} source The source challenge of json. - * @returns {Challenge} This challenge. + * @param source The source challenge or json. + * @returns This 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 checkEvolutions {@link boolean} If true, check the pokemon's future evolutions + * @param checkForms {@link boolean} If true, check the pokemon's alternative forms + * @returns {@link boolean} Whether this function did anything. + */ + applyStarterChoice(pokemon: PokemonSpecies, valid: Utils.BooleanHolder, dexAttr: DexAttrProps, soft: boolean = false, checkEvolutions?: boolean, checkForms?: boolean): 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. + * @returns {@link boolean} Whether this function did anything. + */ + 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. + * @returns {@link boolean} Whether this function did anything. + */ + 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. + * @returns {@link boolean} Whether this function did anything. + */ + 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. + * @returns {@link boolean} Whether this function did anything. + */ + 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. + * @returns {@link boolean} Whether this function did anything. + */ + applyFixedBattle(waveIndex: Number, battleConfig: FixedBattleConfig): 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. + * @returns {@link boolean} Whether this function did anything. + */ + applyLevelChange(level: Utils.IntegerHolder, 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. + * @returns {@link boolean} Whether this function did anything. + */ + applyMoveSlot(pokemon: Pokemon, moveSlots: Utils.IntegerHolder): boolean { + return false; + } + + /** + * An apply function for PASSIVE_ACCESS challenges. Derived classes should alter this. + * @param pokemon {@link Pokemon} The pokemon to change. + * @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 { + return false; + } + + /** + * An apply function for GAME_MODE_MODIFY challenges. Derived classes should alter this. + * @param gameMode {@link GameMode} The current game mode. + * @returns {@link boolean} Whether this function did anything. + */ + 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. + * @returns {@link boolean} Whether this function did anything. + */ + applyMoveAccessLevel(pokemon: Pokemon, moveSource: MoveSourceType, move: Moves, level: Utils.IntegerHolder): 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 + * @returns {@link boolean} Whether this function did anything. + */ + applyMoveWeight(pokemon: Pokemon, moveSource: MoveSourceType, move: Moves, level: Utils.IntegerHolder): boolean { + return false; + } } type ChallengeCondition = (data: GameData) => boolean; @@ -260,87 +400,75 @@ type ChallengeCondition = (data: GameData) => boolean; export class SingleGenerationChallenge extends Challenge { constructor() { super(Challenges.SINGLE_GENERATION, 9); - this.addChallengeType(ChallengeType.STARTER_CHOICE); - this.addChallengeType(ChallengeType.POKEMON_IN_BATTLE); - this.addChallengeType(ChallengeType.FIXED_BATTLES); } - apply(challengeType: ChallengeType, args: any[]): boolean { - if (this.value === 0) { - return false; - } - + applyStarterChoice(pokemon: PokemonSpecies, valid: Utils.BooleanHolder, dexAttr: DexAttrProps, soft: boolean = false, checkEvolutions?: boolean): boolean { /** * We have special code below for victini because it is classed as a generation 4 pokemon in the code * despite being a generation 5 pokemon. This is due to UI constraints, the starter select screen has * no more room for pokemon so victini is put in the gen 4 section instead. This code just overrides the * normal generation check to correctly treat victini as gen 5. */ - switch (challengeType) { - case ChallengeType.STARTER_CHOICE: - const species = args[0] as PokemonSpecies; - const isValidStarter = args[1] as Utils.BooleanHolder; - const amountOfPokemon = args[3] as number; - const starterGeneration = species.speciesId === Species.VICTINI ? 5 : species.generation; - const generations = [starterGeneration]; - if (amountOfPokemon > 0) { - const speciesToCheck = [species.speciesId]; - while (speciesToCheck.length) { - const checking = speciesToCheck.pop(); - if (pokemonEvolutions.hasOwnProperty(checking)) { - pokemonEvolutions[checking].forEach(e => { - speciesToCheck.push(e.speciesId); - generations.push(getPokemonSpecies(e.speciesId).generation); - }); - } + const starterGeneration = pokemon.speciesId === Species.VICTINI ? 5 : pokemon.generation; + const generations = [starterGeneration]; + const checkPokemonEvolutions = checkEvolutions ?? true as boolean; + if (soft) { + const speciesToCheck = [pokemon.speciesId]; + while (speciesToCheck.length) { + const checking = speciesToCheck.pop(); + if (pokemonEvolutions.hasOwnProperty(checking) && checkPokemonEvolutions) { + pokemonEvolutions[checking].forEach(e => { + speciesToCheck.push(e.speciesId); + generations.push(getPokemonSpecies(e.speciesId).generation); + }); } } - if (!generations.includes(this.value)) { - isValidStarter.value = false; - return true; - } - break; - case ChallengeType.POKEMON_IN_BATTLE: - const pokemon = args[0] as Pokemon; - const isValidPokemon = args[1] as Utils.BooleanHolder; - 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; - if (pokemon.isPlayer() && (baseGeneration !== this.value || (pokemon.isFusion() && fusionGeneration !== this.value))) { - isValidPokemon.value = false; - return true; - } - break; - case ChallengeType.FIXED_BATTLES: - const waveIndex = args[0] as integer; - const battleConfig = args[1] as FixedBattleConfig; - let trainerTypes: TrainerType[] = []; - 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 ]; - break; - case 184: - trainerTypes = [ TrainerType.BRUNO, TrainerType.KOGA, TrainerType.PHOEBE, TrainerType.BERTHA, TrainerType.MARSHAL, TrainerType.SIEBOLD, TrainerType.OLIVIA, TrainerType.NESSA_ELITE, TrainerType.POPPY ]; - 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 ]; - break; - case 188: - trainerTypes = [ TrainerType.LANCE, TrainerType.KAREN, TrainerType.DRAKE, TrainerType.LUCIAN, TrainerType.CAITLIN, TrainerType.DRASNA, TrainerType.KAHILI, TrainerType.RAIHAN_ELITE, TrainerType.HASSEL ]; - 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 ]) ]; - break; - } - if (trainerTypes.length === 0) { - return false; - } else { - battleConfig.setBattleType(BattleType.TRAINER).setGetTrainerFunc(scene => new Trainer(scene, trainerTypes[this.value - 1], TrainerVariant.DEFAULT)); - return true; - } + } + + if (!generations.includes(this.value)) { + valid.value = false; + return true; } return false; } + 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; + 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[] = []; + 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 ]; + break; + case 184: + trainerTypes = [ TrainerType.BRUNO, TrainerType.KOGA, TrainerType.PHOEBE, TrainerType.BERTHA, TrainerType.MARSHAL, TrainerType.SIEBOLD, TrainerType.OLIVIA, TrainerType.NESSA_ELITE, TrainerType.POPPY ]; + 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 ]; + break; + case 188: + trainerTypes = [ TrainerType.LANCE, TrainerType.KAREN, TrainerType.DRAKE, TrainerType.LUCIAN, TrainerType.CAITLIN, TrainerType.DRASNA, TrainerType.KAHILI, TrainerType.RAIHAN_ELITE, TrainerType.HASSEL ]; + 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 ]) ]; + break; + } + if (trainerTypes.length === 0) { + return false; + } else { + battleConfig.setBattleType(BattleType.TRAINER).setGetTrainerFunc(scene => new Trainer(scene, trainerTypes[this.value - 1], TrainerVariant.DEFAULT)); + return true; + } + } + /** * @overrides */ @@ -407,62 +535,49 @@ export class SingleTypeChallenge extends Challenge { constructor() { super(Challenges.SINGLE_TYPE, 18); - this.addChallengeType(ChallengeType.STARTER_CHOICE); - this.addChallengeType(ChallengeType.POKEMON_IN_BATTLE); } - apply(challengeType: ChallengeType, args: any[]): boolean { - if (this.value === 0) { - return false; - } - - switch (challengeType) { - case ChallengeType.STARTER_CHOICE: - const species = args[0] as PokemonSpecies; - const isValidStarter = args[1] as Utils.BooleanHolder; - const dexAttr = args[2] as DexAttrProps; - const amountOfPokemon = args[3] as number; - const speciesForm = getPokemonSpeciesForm(species.speciesId, dexAttr.formIndex); - const types = [speciesForm.type1, speciesForm.type2]; - if (amountOfPokemon > 0) { - const speciesToCheck = [species.speciesId]; - while (speciesToCheck.length) { - const checking = speciesToCheck.pop(); - if (pokemonEvolutions.hasOwnProperty(checking)) { - pokemonEvolutions[checking].forEach(e => { - speciesToCheck.push(e.speciesId); - types.push(getPokemonSpecies(e.speciesId).type1, getPokemonSpecies(e.speciesId).type2); + applyStarterChoice(pokemon: PokemonSpecies, valid: Utils.BooleanHolder, dexAttr: DexAttrProps, soft: boolean = false, checkEvolutions?: boolean, checkForms?: boolean): boolean { + const speciesForm = getPokemonSpeciesForm(pokemon.speciesId, dexAttr.formIndex); + const types = [speciesForm.type1, speciesForm.type2]; + const checkPokemonEvolutions = checkEvolutions ?? true as boolean; + const checkPokemonForms = checkForms ?? true as boolean; + if (soft) { + const speciesToCheck = [pokemon.speciesId]; + while (speciesToCheck.length) { + const checking = speciesToCheck.pop(); + if (pokemonEvolutions.hasOwnProperty(checking) && checkPokemonEvolutions) { + pokemonEvolutions[checking].forEach(e => { + speciesToCheck.push(e.speciesId); + types.push(getPokemonSpecies(e.speciesId).type1, getPokemonSpecies(e.speciesId).type2); + }); + } + if (pokemonFormChanges.hasOwnProperty(checking) && checkPokemonForms) { + pokemonFormChanges[checking].forEach(f1 => { + getPokemonSpecies(checking).forms.forEach(f2 => { + if (f1.formKey === f2.formKey) { + types.push(f2.type1, f2.type2); + } }); - } - if (pokemonFormChanges.hasOwnProperty(checking)) { - pokemonFormChanges[checking].forEach(f1 => { - getPokemonSpecies(checking).forms.forEach(f2 => { - if (f1.formKey === f2.formKey) { - types.push(f2.type1, f2.type2); - } - }); - }); - } + }); } } - if (!types.includes(this.value - 1)) { - isValidStarter.value = false; - return true; - } - break; - case ChallengeType.POKEMON_IN_BATTLE: - const pokemon = args[0] as Pokemon; - const isValidPokemon = args[1] as Utils.BooleanHolder; - 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)) { - isValidPokemon.value = false; - return true; - } - break; + } + if (!types.includes(this.value - 1)) { + valid.value = false; + return true; } return false; } + 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)) { + valid.value = false; + return true; + } + } + /** * @overrides */ @@ -512,28 +627,38 @@ export class SingleTypeChallenge extends Challenge { export class FreshStartChallenge extends Challenge { constructor() { super(Challenges.FRESH_START, 1); - this.addChallengeType(ChallengeType.STARTER_CHOICE); - this.addChallengeType(ChallengeType.STARTER_MODIFY); } - apply(challengeType: ChallengeType, args: any[]): boolean { - if (this.value === 0) { - return false; - } - - switch (challengeType) { - case ChallengeType.STARTER_CHOICE: - const species = args[0] as PokemonSpecies; - const isValidStarter = args[1] as Utils.BooleanHolder; - if (species) { - isValidStarter.value = false; - return true; - } - break; + applyStarterChoice(pokemon: PokemonSpecies, valid: Utils.BooleanHolder): boolean { + if (!defaultStarterSpecies.includes(pokemon.speciesId)) { + valid.value = false; + return true; } return false; } + applyStarterCost(species: Species, cost: Utils.NumberHolder): boolean { + if (defaultStarterSpecies.includes(species) && cost.value !== 3) { + cost.value = 3; + return true; + } + return false; + } + + applyStarterModify(pokemon: Pokemon): boolean { + 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.luck = 0; // No luck + pokemon.shiny = false; // Not shiny + pokemon.variant = 0; // Not shiny + pokemon.gender = Gender.MALE; // Starters default to male + pokemon.formIndex = 0; // Froakie should be base form + pokemon.ivs = [10, 10, 10, 10, 10, 10]; // Default IVs of 10 for all stats + return true; + } + /** * @overrides */ @@ -555,7 +680,6 @@ export class FreshStartChallenge extends Challenge { export class LowerStarterMaxCostChallenge extends Challenge { constructor() { super(Challenges.LOWER_MAX_STARTER_COST, 9); - this.addChallengeType(ChallengeType.STARTER_CHOICE); } /** @@ -568,19 +692,10 @@ export class LowerStarterMaxCostChallenge extends Challenge { return (10 - overrideValue).toString(); } - apply(challengeType: ChallengeType, args: any[]): boolean { - if (this.value === 0) { - return false; - } - - switch (challengeType) { - case ChallengeType.STARTER_CHOICE: - const species = args[0] as PokemonSpecies; - const isValid = args[1] as Utils.BooleanHolder; - if (speciesStarters[species.speciesId] > 10 - this.value) { - isValid.value = false; - return true; - } + applyStarterChoice(pokemon: PokemonSpecies, valid: Utils.BooleanHolder): boolean { + if (speciesStarters[pokemon.speciesId] > 10 - this.value) { + valid.value = false; + return true; } return false; } @@ -599,7 +714,6 @@ export class LowerStarterMaxCostChallenge extends Challenge { export class LowerStarterPointsChallenge extends Challenge { constructor() { super(Challenges.LOWER_STARTER_POINTS, 9); - this.addChallengeType(ChallengeType.STARTER_POINTS); } /** @@ -612,18 +726,9 @@ export class LowerStarterPointsChallenge extends Challenge { return (10 - overrideValue).toString(); } - apply(challengeType: ChallengeType, args: any[]): boolean { - if (this.value === 0) { - return false; - } - - switch (challengeType) { - case ChallengeType.STARTER_POINTS: - const points = args[0] as Utils.NumberHolder; - points.value -= this.value; - return true; - } - return false; + applyStarterPoints(points: Utils.NumberHolder): boolean { + points.value -= this.value; + return true; } static loadChallenge(source: LowerStarterPointsChallenge | any): LowerStarterPointsChallenge { @@ -635,22 +740,169 @@ export class LowerStarterPointsChallenge extends Challenge { } /** - * Apply all challenges of a given challenge type. - * @param {GameMode} gameMode The current game mode - * @param {ChallengeType} challengeType What challenge type to apply - * @param {any[]} args Any args for that challenge type - * @returns {boolean} True if any challenge was successfully applied. + * Apply all challenges that modify starter choice. + * @param gameMode {@link GameMode} The current gameMode + * @param challengeType {@link ChallengeType} ChallengeType.STARTER_CHOICE + * @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 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, checkEvolutions?: boolean, checkForms?: boolean): boolean; +/** + * Apply all challenges that modify available total starter points. + * @param gameMode {@link GameMode} The current gameMode + * @param challengeType {@link ChallengeType} ChallengeType.STARTER_POINTS + * @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; +/** + * Apply all challenges that modify the cost of a starter. + * @param gameMode {@link GameMode} The current gameMode + * @param challengeType {@link ChallengeType} ChallengeType.STARTER_COST + * @param species {@link Species} The pokemon to change the cost of. + * @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; +/** + * Apply all challenges that modify a starter after selection. + * @param gameMode {@link GameMode} The current gameMode + * @param challengeType {@link ChallengeType} ChallengeType.STARTER_MODIFY + * @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; +/** + * Apply all challenges that what pokemon you can have in battle. + * @param gameMode {@link GameMode} The current gameMode + * @param challengeType {@link ChallengeType} ChallengeType.POKEMON_IN_BATTLE + * @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 True if any challenge was successfully applied. + */ +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 + * @param challengeType {@link ChallengeType} ChallengeType.FIXED_BATTLES + * @param waveIndex {@link Number} The current wave index. + * @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; +/** + * 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 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; +/** + * 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. + * @returns True if any challenge was successfully applied. + */ +export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.AI_MOVE_SLOTS, pokemon: Pokemon, moveSlots: Utils.IntegerHolder): boolean; +/** + * Apply all challenges that modify whether a pokemon has its passive. + * @param gameMode {@link GameMode} The current gameMode + * @param challengeType {@link ChallengeType} ChallengeType.PASSIVE_ACCESS + * @param pokemon {@link Pokemon} The pokemon to modify. + * @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; +/** + * Apply all challenges that modify the game modes settings. + * @param gameMode {@link GameMode} The current gameMode + * @param challengeType {@link ChallengeType} ChallengeType.GAME_MODE_MODIFY + * @returns True if any challenge was successfully applied. + */ +export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.GAME_MODE_MODIFY): boolean; +/** + * Apply all challenges that modify what level a pokemon can access a move. + * @param gameMode {@link GameMode} The current gameMode + * @param challengeType {@link ChallengeType} ChallengeType.MOVE_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.IntegerHolder} 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; +/** + * Apply all challenges that modify what weight a pokemon gives to move generation + * @param gameMode {@link GameMode} The current gameMode + * @param challengeType {@link ChallengeType} ChallengeType.MOVE_WEIGHT + * @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. + * @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, ...args: any[]): boolean { let ret = false; - gameMode.challenges.forEach(v => { - if (v.isOfType(challengeType)) { - ret ||= v.apply(challengeType, args); + gameMode.challenges.forEach(c => { + if (c.value !== 0) { + switch (challengeType) { + case ChallengeType.STARTER_CHOICE: + ret ||= c.applyStarterChoice(args[0], args[1], args[2], args[3], args[4], args[5]); + break; + case ChallengeType.STARTER_POINTS: + ret ||= c.applyStarterPoints(args[0]); + break; + case ChallengeType.STARTER_COST: + ret ||= c.applyStarterCost(args[0], args[1]); + break; + case ChallengeType.STARTER_MODIFY: + ret ||= c.applyStarterModify(args[0]); + break; + case ChallengeType.POKEMON_IN_BATTLE: + ret ||= c.applyPokemonInBattle(args[0], args[1]); + break; + case ChallengeType.FIXED_BATTLES: + ret ||= c.applyFixedBattle(args[0], args[1]); + break; + case ChallengeType.AI_LEVEL: + ret ||= c.applyLevelChange(args[0], args[1], args[2], args[3]); + break; + case ChallengeType.AI_MOVE_SLOTS: + ret ||= c.applyMoveSlot(args[0], args[1]); + break; + case ChallengeType.PASSIVE_ACCESS: + ret ||= c.applyPassiveAccess(args[0], args[1]); + break; + case ChallengeType.GAME_MODE_MODIFY: + ret ||= c.applyGameModeModify(gameMode); + break; + case ChallengeType.MOVE_ACCESS: + ret ||= c.applyMoveAccessLevel(args[0], args[1], args[2], args[3]); + break; + case ChallengeType.MOVE_WEIGHT: + ret ||= c.applyMoveWeight(args[0], args[1], args[2], args[3]); + break; + } } }); return ret; } +/** + * + * @param source A challenge to copy, or an object of a challenge's properties. Missing values are treated as defaults. + * @returns The challenge in question. + */ export function copyChallenge(source: Challenge | any): Challenge { switch (source.id) { case Challenges.SINGLE_GENERATION: @@ -661,6 +913,8 @@ export function copyChallenge(source: Challenge | any): Challenge { return LowerStarterMaxCostChallenge.loadChallenge(source); case Challenges.LOWER_STARTER_POINTS: return LowerStarterPointsChallenge.loadChallenge(source); + case Challenges.FRESH_START: + return FreshStartChallenge.loadChallenge(source); } throw new Error("Unknown challenge copied"); } @@ -671,8 +925,6 @@ export function initChallenges() { allChallenges.push( new SingleGenerationChallenge(), new SingleTypeChallenge(), - // new LowerStarterMaxCostChallenge(), - // new LowerStarterPointsChallenge(), - // new FreshStartChallenge() + new FreshStartChallenge(), ); } diff --git a/src/data/egg.ts b/src/data/egg.ts index bb952d71fb0..bf4d6577dd7 100644 --- a/src/data/egg.ts +++ b/src/data/egg.ts @@ -2,7 +2,7 @@ import BattleScene from "../battle-scene"; import PokemonSpecies, { getPokemonSpecies, speciesStarters } from "./pokemon-species"; import { VariantTier } from "../enums/variant-tiers"; import * as Utils from "../utils"; -import * as Overrides from "../overrides"; +import Overrides from "#app/overrides"; import { pokemonPrevolutions } from "./pokemon-evolutions"; import { PlayerPokemon } from "#app/field/pokemon"; import i18next from "i18next"; @@ -166,12 +166,12 @@ export class Egg { if (eggOptions.species) { this._tier = this.getEggTierFromSpeciesStarterValue(); this._hatchWaves = eggOptions.hatchWaves ?? this.getEggTierDefaultHatchWaves(); - // If species has no variant, set variantTier to common. This needs to - // be done because species with no variants get filtered at rollSpecies but since the - // species is set the check never happens - if (!getPokemonSpecies(this.species).hasVariants()) { - this._variantTier = VariantTier.COMMON; - } + } + // If species has no variant, set variantTier to common. This needs to + // be done because species with no variants get filtered at rollSpecies but if the + // species is set via options or the legendary gacha pokemon gets choosen the check never happens + if (this._species && !getPokemonSpecies(this._species).hasVariants()) { + this._variantTier = VariantTier.COMMON; } // Needs this._tier so it needs to be generated afer the tier override if bought from same species this._eggMoveIndex = eggOptions.eggMoveIndex ?? this.rollEggMoveIndex(); diff --git a/src/data/move.ts b/src/data/move.ts index 321fbc6d097..a2b879a388b 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -1,18 +1,18 @@ import { ChargeAnim, MoveChargeAnim, initMoveAnim, loadMoveAnimAssets } from "./battle-anims"; -import { BattleEndPhase, MovePhase, NewBattlePhase, PartyStatusCurePhase, PokemonHealPhase, StatChangePhase, SwitchSummonPhase } from "../phases"; +import { BattleEndPhase, MoveEndPhase, MovePhase, NewBattlePhase, PartyStatusCurePhase, PokemonHealPhase, StatChangePhase, SwitchSummonPhase } from "../phases"; import { BattleStat, getBattleStatName } from "./battle-stat"; -import { EncoreTag, SemiInvulnerableTag } from "./battler-tags"; +import { EncoreTag, HelpingHandTag, SemiInvulnerableTag, StockpilingTag, TypeBoostTag } from "./battler-tags"; import { getPokemonMessage, getPokemonNameWithAffix } from "../messages"; import Pokemon, { AttackMoveResult, EnemyPokemon, HitResult, MoveResult, PlayerPokemon, PokemonMove, TurnMove } from "../field/pokemon"; import { StatusEffect, getStatusEffectHealText, isNonVolatileStatusEffect, getNonVolatileStatusEffects} from "./status-effect"; -import { Type } from "./type"; +import { getTypeResistances, Type } from "./type"; import { Constructor } from "#app/utils"; import * as Utils from "../utils"; import { WeatherType } from "./weather"; -import { ArenaTagSide, ArenaTrapTag } from "./arena-tag"; -import { UnswappableAbilityAbAttr, UncopiableAbilityAbAttr, UnsuppressableAbilityAbAttr, BlockRecoilDamageAttr, BlockOneHitKOAbAttr, IgnoreContactAbAttr, MaxMultiHitAbAttr, applyAbAttrs, BlockNonDirectDamageAbAttr, applyPreSwitchOutAbAttrs, PreSwitchOutAbAttr, applyPostDefendAbAttrs, PostDefendContactApplyStatusEffectAbAttr, MoveAbilityBypassAbAttr, ReverseDrainAbAttr, FieldPreventExplosiveMovesAbAttr, ForceSwitchOutImmunityAbAttr, BlockItemTheftAbAttr, applyPostAttackAbAttrs, ConfusionOnStatusEffectAbAttr, HealFromBerryUseAbAttr, IgnoreProtectOnContactAbAttr, IgnoreMoveEffectsAbAttr, applyPreDefendAbAttrs, MoveEffectChanceMultiplierAbAttr } from "./ability"; +import { ArenaTagSide, ArenaTrapTag, WeakenMoveTypeTag } from "./arena-tag"; +import { UnswappableAbilityAbAttr, UncopiableAbilityAbAttr, UnsuppressableAbilityAbAttr, BlockRecoilDamageAttr, BlockOneHitKOAbAttr, IgnoreContactAbAttr, MaxMultiHitAbAttr, applyAbAttrs, BlockNonDirectDamageAbAttr, applyPreSwitchOutAbAttrs, PreSwitchOutAbAttr, applyPostDefendAbAttrs, PostDefendContactApplyStatusEffectAbAttr, MoveAbilityBypassAbAttr, ReverseDrainAbAttr, FieldPreventExplosiveMovesAbAttr, ForceSwitchOutImmunityAbAttr, BlockItemTheftAbAttr, applyPostAttackAbAttrs, ConfusionOnStatusEffectAbAttr, HealFromBerryUseAbAttr, IgnoreProtectOnContactAbAttr, IgnoreMoveEffectsAbAttr, applyPreDefendAbAttrs, MoveEffectChanceMultiplierAbAttr, WonderSkinAbAttr, applyPreAttackAbAttrs, MoveTypeChangeAttr, UserFieldMoveTypePowerBoostAbAttr, FieldMoveTypePowerBoostAbAttr, AllyMoveCategoryPowerBoostAbAttr, VariableMovePowerAbAttr } from "./ability"; import { allAbilities } from "./ability"; -import { PokemonHeldItemModifier, BerryModifier, PreserveBerryModifier } from "../modifier/modifier"; +import { PokemonHeldItemModifier, BerryModifier, PreserveBerryModifier, PokemonMoveAccuracyBoosterModifier, AttackTypeBoosterModifier, PokemonMultiHitModifier } from "../modifier/modifier"; import { BattlerIndex } from "../battle"; import { Stat } from "./pokemon-stat"; import { TerrainType } from "./terrain"; @@ -92,6 +92,10 @@ export enum MoveFlags { * Enables all hits of a multi-hit move to be accuracy checked individually */ CHECK_ALL_HITS = 1 << 17, + /** + * Indicates a move is able to be redirected to allies in a double battle if the attacker faints + */ + REDIRECT_COUNTER = 1 << 18, } type MoveConditionFunc = (user: Pokemon, target: Pokemon, move: Move) => boolean; @@ -549,6 +553,17 @@ export default class Move implements Localizable { return this; } + /** + * Sets the {@linkcode MoveFlags.REDIRECT_COUNTER} flag for the calling Move + * @param redirectCounter The value (boolean) to set the flag to + * example: @see {@linkcode Moves.METAL_BURST} + * @returns The {@linkcode Move} that called this function + */ + redirectCounter(redirectCounter?: boolean): this { + this.setFlag(MoveFlags.REDIRECT_COUNTER, redirectCounter); + 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 @@ -655,6 +670,108 @@ export default class Move implements Localizable { return score; } + + /** + * Calculates the accuracy of a move in battle based on various conditions and attributes. + * + * @param user {@linkcode Pokemon} The Pokémon using the move. + * @param target {@linkcode Pokemon} The Pokémon being targeted by the move. + * @returns The calculated accuracy of the move. + */ + calculateBattleAccuracy(user: Pokemon, target: Pokemon) { + const moveAccuracy = new Utils.NumberHolder(this.accuracy); + + applyMoveAttrs(VariableAccuracyAttr, user, target, this, moveAccuracy); + applyPreDefendAbAttrs(WonderSkinAbAttr, target, user, this, { value: false }, moveAccuracy); + + if (moveAccuracy.value === -1) { + return moveAccuracy.value; + } + + const isOhko = this.hasAttr(OneHitKOAccuracyAttr); + + if (!isOhko) { + user.scene.applyModifiers(PokemonMoveAccuracyBoosterModifier, user.isPlayer(), user, moveAccuracy); + } + + if (user.scene.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} + */ + moveAccuracy.value = Math.floor(moveAccuracy.value * 0.9); + } + + if (!isOhko && user.scene.arena.getTag(ArenaTagType.GRAVITY)) { + moveAccuracy.value = Math.floor(moveAccuracy.value * 1.67); + } + + return moveAccuracy.value; + } + + /** + * Calculates the power of a move in battle based on various conditions and attributes. + * + * @param source {@linkcode Pokemon} The Pokémon using the move. + * @param target {@linkcode Pokemon} The Pokémon being targeted by the move. + * @returns The calculated power of the move. + */ + calculateBattlePower(source: Pokemon, target: Pokemon): number { + const power = new Utils.NumberHolder(this.power); + + const typeChangeMovePowerMultiplier = new Utils.NumberHolder(1); + applyPreAttackAbAttrs(MoveTypeChangeAttr, source, target, this, 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)) { + power.value = 60; + } + + applyPreAttackAbAttrs(VariableMovePowerAbAttr, source, target, this, power); + + if (source.getAlly()) { + applyPreAttackAbAttrs(AllyMoveCategoryPowerBoostAbAttr, source.getAlly(), target, this, power); + } + + const fieldAuras = new Set( + source.scene.getField(true) + .map((p) => p.getAbilityAttrs(FieldMoveTypePowerBoostAbAttr) as FieldMoveTypePowerBoostAbAttr[]) + .flat(), + ); + for (const aura of fieldAuras) { + // The only relevant values are `move` and the `power` holder + aura.applyPreAttack(null, null, null, this, [power]); + } + + const alliedField: Pokemon[] = source instanceof PlayerPokemon ? source.scene.getPlayerField() : source.scene.getEnemyField(); + alliedField.forEach(p => applyPreAttackAbAttrs(UserFieldMoveTypePowerBoostAbAttr, p, target, this, power)); + + power.value *= typeChangeMovePowerMultiplier.value; + + const typeBoost = source.findTag(t => t instanceof TypeBoostTag && t.boostedType === this.type) as TypeBoostTag; + if (typeBoost) { + power.value *= typeBoost.boostValue; + } + + if (source.scene.arena.getTerrainType() === TerrainType.GRASSY && target.isGrounded() && this.type === Type.GROUND && this.moveTarget === MoveTarget.ALL_NEAR_OTHERS) { + power.value /= 2; + } + + 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, this.type, power); + source.scene.applyModifiers(AttackTypeBoosterModifier, source.isPlayer(), source, this.type, power); + } + + if (source.getTag(HelpingHandTag)) { + power.value *= 1.5; + } + + return power.value; + } } export class AttackMove extends Move { @@ -853,9 +970,9 @@ export class MoveEffectAttr extends MoveAttr { * @param selfEffect {@linkcode Boolean} if move targets user. * @returns Move chance value. */ - getMoveChance(user: Pokemon, target: Pokemon, move: Move, selfEffect?: Boolean): integer { + getMoveChance(user: Pokemon, target: Pokemon, move: Move, selfEffect?: Boolean, showAbility?: Boolean): integer { const moveChance = new Utils.NumberHolder(move.chance); - applyAbAttrs(MoveEffectChanceMultiplierAbAttr, user, null, moveChance, move, target, selfEffect); + applyAbAttrs(MoveEffectChanceMultiplierAbAttr, user, null, moveChance, move, target, selfEffect, showAbility); applyPreDefendAbAttrs(IgnoreMoveEffectsAbAttr,target,user,null,null, moveChance); return moveChance.value; } @@ -1085,6 +1202,7 @@ export class RecoilAttr extends MoveEffectAttr { const cancelled = new Utils.BooleanHolder(false); if (!this.unblockable) { applyAbAttrs(BlockRecoilDamageAttr, user, cancelled); + applyAbAttrs(BlockNonDirectDamageAbAttr, user, cancelled); } if (cancelled.value) { @@ -1097,7 +1215,6 @@ export class RecoilAttr extends MoveEffectAttr { return false; } - applyAbAttrs(BlockNonDirectDamageAbAttr, user, cancelled); if (cancelled.value) { return false; } @@ -1512,11 +1629,11 @@ export class HitHealAttr extends MoveEffectAttr { if (this.healStat) { // Strength Sap formula healAmount = target.getBattleStat(this.healStat); - message = i18next.t("battle:drainMessage", {pokemonName: target.name}); + message = i18next.t("battle:drainMessage", {pokemonName: getPokemonNameWithAffix(target)}); } else { // Default healing formula used by draining moves like Absorb, Draining Kiss, Bitter Blade, etc. healAmount = Math.max(Math.floor(user.turnData.currDamageDealt * this.healRatio), 1); - message = i18next.t("battle:regainHealth", {pokemonName: user.name}); + message = i18next.t("battle:regainHealth", {pokemonName: getPokemonNameWithAffix(user)}); } if (reverseDrain) { user.turnData.damageTaken += healAmount; @@ -1617,6 +1734,7 @@ export class MultiHitAttr extends MoveAttr { } else { const hitType = new Utils.IntegerHolder(this.multiHitType); applyMoveAttrs(ChangeMultiHitTypeAttr, user, target, move, hitType); + this.multiHitType = hitType.value; hitTimes = this.getHitCount(user, target); } @@ -1703,7 +1821,7 @@ export class StatusEffectAttr extends MoveEffectAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - const moveChance = this.getMoveChance(user,target,move,this.selfTarget); + const moveChance = this.getMoveChance(user, target, move, this.selfTarget, true); const statusCheck = moveChance < 0 || moveChance === 100 || user.randSeedInt(100) < moveChance; if (statusCheck) { const pokemon = this.selfTarget ? user : target; @@ -1724,7 +1842,7 @@ export class StatusEffectAttr extends MoveEffectAttr { } getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { - const moveChance = this.getMoveChance(user,target,move,this.selfTarget); + 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; } } @@ -1744,7 +1862,7 @@ export class MultiStatusEffectAttr extends StatusEffectAttr { } getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { - const moveChance = this.getMoveChance(user,target,move,this.selfTarget); + 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; } } @@ -1796,7 +1914,7 @@ export class StealHeldItemChanceAttr extends MoveEffectAttr { if (rand >= this.chance) { return resolve(false); } - const heldItems = this.getTargetHeldItems(target).filter(i => i.getTransferrable(false)); + const heldItems = this.getTargetHeldItems(target).filter(i => i.isTransferrable); 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); @@ -1817,7 +1935,7 @@ export class StealHeldItemChanceAttr extends MoveEffectAttr { getTargetHeldItems(target: Pokemon): PokemonHeldItemModifier[] { return target.scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && (m as PokemonHeldItemModifier).pokemonId === target.id, target.isPlayer()) as PokemonHeldItemModifier[]; + && m.pokemonId === target.id, target.isPlayer()) as PokemonHeldItemModifier[]; } getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { @@ -1857,7 +1975,6 @@ export class RemoveHeldItemAttr extends MoveEffectAttr { * @returns {boolean} True if an item was removed */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!this.berriesOnly && target.isPlayer()) { // "Wild Pokemon cannot knock off Player Pokemon's held items" (See Bulbapedia) return false; } @@ -1870,7 +1987,8 @@ export class RemoveHeldItemAttr extends MoveEffectAttr { } // Considers entire transferrable item pool by default (Knock Off). Otherwise berries only if specified (Incinerate). - let heldItems = this.getTargetHeldItems(target).filter(i => i.getTransferrable(false)); + let heldItems = this.getTargetHeldItems(target).filter(i => i.isTransferrable); + if (this.berriesOnly) { heldItems = heldItems.filter(m => m instanceof BerryModifier && m.pokemonId === target.id, target.isPlayer()); } @@ -1894,7 +2012,7 @@ export class RemoveHeldItemAttr extends MoveEffectAttr { getTargetHeldItems(target: Pokemon): PokemonHeldItemModifier[] { return target.scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && (m as PokemonHeldItemModifier).pokemonId === target.id, target.isPlayer()) as PokemonHeldItemModifier[]; + && m.pokemonId === target.id, target.isPlayer()) as PokemonHeldItemModifier[]; } getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { @@ -1986,7 +2104,8 @@ export class StealEatBerryAttr extends EatBerryAttr { if (cancelled.value === true) { return false; } - const heldBerries = this.getTargetHeldBerries(target).filter(i => i.getTransferrable(false)); + + const heldBerries = this.getTargetHeldBerries(target); if (heldBerries.length <= 0) { return false; } @@ -2215,7 +2334,11 @@ export class ChargeAttr extends OverrideMoveEffectAttr { user.pushMoveHistory({ move: move.id, targets: [ target.getBattlerIndex() ], result: MoveResult.OTHER }); user.getMoveQueue().push({ move: move.id, targets: [ target.getBattlerIndex() ], ignorePP: true }); if (this.sameTurn) { - user.scene.pushMovePhase(new MovePhase(user.scene, user, [ target.getBattlerIndex() ], user.moveset.find(m => m.moveId === move.id), true), this.followUpPriority); + let movesetMove = user.moveset.find(m => m.moveId === move.id); + if (!movesetMove) { // account for any move that calls a ChargeAttr move when the ChargeAttr move does not exist in moveset + movesetMove = new PokemonMove(move.id, 0, 0, true); + } + user.scene.pushMovePhase(new MovePhase(user.scene, user, [ target.getBattlerIndex() ], movesetMove, true), this.followUpPriority); } user.addTag(BattlerTagType.CHARGING, 1, move.id, user.id); resolve(true); @@ -2309,7 +2432,7 @@ export class DelayedAttackAttr extends OverrideMoveEffectAttr { if (args.length < 2 || !args[1]) { new MoveChargeAnim(this.chargeAnim, move.id, user).play(user.scene, () => { (args[0] as Utils.BooleanHolder).value = true; - user.scene.queueMessage(getPokemonMessage(user, ` ${this.chargeText.replace("{TARGET}", target.name)}`)); + user.scene.queueMessage(getPokemonMessage(user, ` ${this.chargeText.replace("{TARGET}", getPokemonNameWithAffix(target))}`)); 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()); @@ -2343,7 +2466,7 @@ export class StatChangeAttr extends MoveEffectAttr { return false; } - const moveChance = this.getMoveChance(user,target,move,this.selfTarget); + const moveChance = this.getMoveChance(user, target, move, this.selfTarget, true); if (moveChance < 0 || moveChance === 100 || user.randSeedInt(100) < moveChance) { const levels = this.getLevels(user); user.scene.unshiftPhase(new StatChangePhase(user.scene, (this.selfTarget ? user : target).getBattlerIndex(), this.selfTarget, this.stats, levels, this.showMessage)); @@ -2463,20 +2586,17 @@ export class HalfHpStatMaxAttr extends StatChangeAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { return new Promise(resolve => { - const damage = user.damageAndUpdate(Math.floor(user.getMaxHp() / 2), HitResult.OTHER, false, true); - if (damage) { - user.scene.damageNumberHandler.add(user, damage); - } + user.damageAndUpdate(Math.floor(user.getMaxHp() / 2), HitResult.OTHER, false, true); user.updateInfo().then(() => { const ret = super.apply(user, target, move, args); - user.scene.queueMessage(getPokemonMessage(user, ` cut its own HP\nand maximized its ${getBattleStatName(this.stats[0])}!`)); + user.scene.queueMessage(getPokemonMessage(user, ` cut its own HP\nand maximized its ${getBattleStatName(this.stats[BattleStat.ATK])}!`)); resolve(ret); }); }); } getCondition(): MoveConditionFunc { - return (user, target, move) => user.getHpRatio() > 0.5 && user.summonData.battleStats[this.stats[0]] < 6; + return (user, target, move) => user.getHpRatio() > 0.5 && user.summonData.battleStats[this.stats[BattleStat.ATK]] < 6; } // TODO: Add benefit score that considers HP cut @@ -2493,10 +2613,7 @@ export class CutHpStatBoostAttr extends StatChangeAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { return new Promise(resolve => { - const damage = user.damageAndUpdate(Math.floor(user.getMaxHp() / this.cutRatio), HitResult.OTHER, false, true); - if (damage) { - user.scene.damageNumberHandler.add(user, damage); - } + user.damageAndUpdate(Math.floor(user.getMaxHp() / this.cutRatio), HitResult.OTHER, false, true); user.updateInfo().then(() => { const ret = super.apply(user, target, move, args); resolve(ret); @@ -3194,6 +3311,62 @@ export class WaterShurikenPowerAttr extends VariablePowerAttr { } } +/** + * Attribute used to calculate the power of attacks that scale with Stockpile stacks (i.e. Spit Up). + */ +export class SpitUpPowerAttr extends VariablePowerAttr { + private multiplier: number = 0; + + constructor(multiplier: number) { + super(); + this.multiplier = multiplier; + } + + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + const stockpilingTag = user.getTag(StockpilingTag); + + if (stockpilingTag?.stockpiledCount > 0) { + const power = args[0] as Utils.IntegerHolder; + power.value = this.multiplier * stockpilingTag.stockpiledCount; + return true; + } + + return false; + } +} + +/** + * Attribute used to apply Swallow's healing, which scales with Stockpile stacks. + * Does NOT remove stockpiled stacks. + */ +export class SwallowHealAttr extends HealAttr { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + const stockpilingTag = user.getTag(StockpilingTag); + + if (stockpilingTag?.stockpiledCount > 0) { + const stockpiled = stockpilingTag.stockpiledCount; + let healRatio: number; + + if (stockpiled === 1) { + healRatio = 0.25; + } else if (stockpiled === 2) { + healRatio = 0.50; + } else { // stockpiled >= 3 + healRatio = 1.00; + } + + if (healRatio) { + this.addHealPhase(user, healRatio); + return true; + } + } + + return false; + } +} + +const hasStockpileStacksCondition: MoveConditionFunc = (user) => user.getTag(StockpilingTag)?.stockpiledCount > 0; + /** * Attribute used for multi-hit moves that increase power in increments of the * move's base power for each hit, namely Triple Kick and Triple Axel. @@ -3617,7 +3790,7 @@ export class TerrainPulseTypeAttr extends VariableMoveTypeAttr { * @returns true if the function succeeds */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!user.isGrounded) { + if (!user.isGrounded()) { return false; } @@ -3902,19 +4075,16 @@ export class FrenzyAttr extends MoveEffectAttr { return false; } - if (!user.getMoveQueue().length) { - if (!user.getTag(BattlerTagType.FRENZY)) { - const turnCount = user.randSeedIntRange(1, 2); - new Array(turnCount).fill(null).map(() => user.getMoveQueue().push({ move: move.id, targets: [ target.getBattlerIndex() ], ignorePP: true })); - user.addTag(BattlerTagType.FRENZY, 1, move.id, user.id); - } else { - applyMoveAttrs(AddBattlerTagAttr, user, target, move, args); - user.lapseTag(BattlerTagType.FRENZY); - } - return true; + if (!user.getTag(BattlerTagType.FRENZY) && !user.getMoveQueue().length) { + const turnCount = user.randSeedIntRange(1, 2); + new Array(turnCount).fill(null).map(() => user.getMoveQueue().push({ move: move.id, targets: [ target.getBattlerIndex() ], ignorePP: true })); + user.addTag(BattlerTagType.FRENZY, turnCount, move.id, user.id); + } else { + applyMoveAttrs(AddBattlerTagAttr, user, target, move, args); + user.lapseTag(BattlerTagType.FRENZY); // if FRENZY is already in effect (moveQueue.length > 0), lapse the tag } - return false; + return true; } } @@ -3922,7 +4092,7 @@ export const frenzyMissFunc: UserMoveConditionFunc = (user: Pokemon, move: Move) while (user.getMoveQueue().length && user.getMoveQueue()[0].move === move.id) { user.getMoveQueue().shift(); } - user.lapseTag(BattlerTagType.FRENZY); + user.removeTag(BattlerTagType.FRENZY); // FRENZY tag should be disrupted on miss/no effect return true; }; @@ -3947,7 +4117,7 @@ export class AddBattlerTagAttr extends MoveEffectAttr { return false; } - const moveChance = this.getMoveChance(user,target,move,this.selfTarget); + const moveChance = this.getMoveChance(user, target, move, this.selfTarget, true); if (moveChance < 0 || moveChance === 100 || user.randSeedInt(100) < moveChance) { return (this.selfTarget ? user : target).addTag(this.tagType, user.randSeedInt(this.turnCountMax - this.turnCountMin, this.turnCountMin), move.id, user.id); } @@ -4006,7 +4176,7 @@ export class AddBattlerTagAttr extends MoveEffectAttr { } getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { - let moveChance = this.getMoveChance(user,target,move,this.selfTarget); + let moveChance = this.getMoveChance(user,target,move,this.selfTarget, false); if (moveChance < 0) { moveChance = 100; } @@ -4027,7 +4197,7 @@ export class CurseAttr extends MoveEffectAttr { user.scene.queueMessage( i18next.t("battle:battlerTagsCursedOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(user), - pokemonName: target.name + pokemonName: getPokemonNameWithAffix(target) }) ); @@ -4157,9 +4327,9 @@ export class IgnoreAccuracyAttr extends AddBattlerTagAttr { } } -export class AlwaysCritsAttr extends AddBattlerTagAttr { +export class AlwaysGetHitAttr extends AddBattlerTagAttr { constructor() { - super(BattlerTagType.ALWAYS_CRIT, true, false, 2); + super(BattlerTagType.ALWAYS_GET_HIT, true, false, 0, 0, true); } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { @@ -4167,7 +4337,19 @@ export class AlwaysCritsAttr extends AddBattlerTagAttr { return false; } - user.scene.queueMessage(getPokemonMessage(user, ` took aim\nat ${target.name}!`)); + return true; + } +} + +export class ReceiveDoubleDamageAttr extends AddBattlerTagAttr { + constructor() { + super(BattlerTagType.RECEIVE_DOUBLE_DAMAGE, true, false, 0, 0, true); + } + + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + if (!super.apply(user, target, move, args)) { + return false; + } return true; } @@ -4303,7 +4485,7 @@ export class AddArenaTrapTagHitAttr extends AddArenaTagAttr { * @param move {@linkcode Move} being used */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - const moveChance = this.getMoveChance(user,target,move,this.selfTarget); + 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; if ((moveChance < 0 || moveChance === 100 || user.randSeedInt(100) < moveChance)) { @@ -4423,7 +4605,7 @@ export class SwapArenaTagsAttr extends MoveEffectAttr { } - user.scene.queueMessage( `${user.name} swapped the battle effects affecting each side of the field!`); + user.scene.queueMessage( `${getPokemonNameWithAffix(user)} swapped the battle effects affecting each side of the field!`); return true; } } @@ -4464,7 +4646,7 @@ export class RevivalBlessingAttr extends MoveEffectAttr { const slotIndex = user.scene.getEnemyParty().findIndex(p => pokemon.id === p.id); pokemon.resetStatus(); pokemon.heal(Math.min(Math.max(Math.ceil(Math.floor(0.5 * pokemon.getMaxHp())), 1), pokemon.getMaxHp())); - user.scene.queueMessage(`${pokemon.name} was revived!`,0,true); + user.scene.queueMessage(`${getPokemonNameWithAffix(pokemon)} was revived!`,0,true); if (user.scene.currentBattle.double && user.scene.getEnemyParty().length > 1) { const allyPokemon = user.getAlly(); @@ -4515,10 +4697,11 @@ export class ForceSwitchOutAttr extends MoveEffectAttr { // This ensures that the switch out only happens when the conditions are met const switchOutTarget = this.user ? user : target; if (switchOutTarget instanceof PlayerPokemon) { - if (switchOutTarget.hp) { - applyPreSwitchOutAbAttrs(PreSwitchOutAbAttr, switchOutTarget); - (switchOutTarget as PlayerPokemon).switchOut(this.batonPass, true).then(() => resolve(true)); - } else { + if (switchOutTarget.hp > 0) { + applyPreSwitchOutAbAttrs(PreSwitchOutAbAttr, switchOutTarget); + // switchOut below sets the UI to select party(this is not a separate Phase), then adds a SwitchSummonPhase with selected 'mon + (switchOutTarget as PlayerPokemon).switchOut(this.batonPass, true).then(() => resolve(true)); + } else { resolve(false); } return; @@ -4531,8 +4714,9 @@ export class ForceSwitchOutAttr extends MoveEffectAttr { switchOutTarget.scene.field.remove(switchOutTarget); user.scene.triggerPokemonFormChange(switchOutTarget, SpeciesFormChangeActiveTrigger, true); - if (switchOutTarget.hp) { - user.scene.unshiftPhase(new SwitchSummonPhase(user.scene, switchOutTarget.getFieldIndex(), user.scene.currentBattle.trainer.getNextSummonIndex((switchOutTarget as EnemyPokemon).trainerSlot), false, this.batonPass, false)); + if (switchOutTarget.hp > 0) { + // for opponent switching out + user.scene.prependToPhase(new SwitchSummonPhase(user.scene, switchOutTarget.getFieldIndex(), user.scene.currentBattle.trainer.getNextSummonIndex((switchOutTarget as EnemyPokemon).trainerSlot), false, this.batonPass, false), MoveEndPhase); } } else { // Switch out logic for everything else @@ -4653,7 +4837,7 @@ export class CopyTypeAttr extends MoveEffectAttr { user.summonData.types = target.getTypes(true); user.updateInfo(); - user.scene.queueMessage(getPokemonMessage(user, `'s type\nchanged to match ${target.name}'s!`)); + user.scene.queueMessage(getPokemonMessage(user, `'s type\nchanged to match ${getPokemonNameWithAffix(target)}'s!`)); return true; } @@ -4718,7 +4902,9 @@ export class AddTypeAttr extends MoveEffectAttr { 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 - types.push(this.type); + if (this.type !== Type.UNKNOWN) { + types.push(this.type); + } target.summonData.types = types; target.updateInfo(); @@ -4743,10 +4929,8 @@ export class FirstMoveTypeAttr extends MoveEffectAttr { } const firstMoveType = target.getMoveset()[0].getMove().type; - user.summonData.types = [ firstMoveType ]; - - user.scene.queueMessage(getPokemonMessage(user, ` transformed\ninto to the ${Utils.toReadableString(Type[firstMoveType])} type!`)); + user.scene.queueMessage(i18next.t("battle:transformedIntoType", {pokemonName: getPokemonNameWithAffix(user), type: Utils.toReadableString(Type[firstMoveType])})); return true; } @@ -5035,7 +5219,7 @@ export class ReducePpMoveAttr extends MoveEffectAttr { const lastPpUsed = movesetMove.ppUsed; movesetMove.ppUsed = Math.min(movesetMove.ppUsed + this.reduction, movesetMove.getMovePp()); - const message = i18next.t("battle:ppReduced", {targetName: target.name, moveName: movesetMove.getName(), reduction: movesetMove.ppUsed - lastPpUsed}); + const message = i18next.t("battle:ppReduced", {targetName: getPokemonNameWithAffix(target), moveName: movesetMove.getName(), reduction: movesetMove.ppUsed - lastPpUsed}); user.scene.queueMessage(message); @@ -5168,15 +5352,13 @@ export class SketchAttr extends MoveEffectAttr { return false; } - const targetMoves = target.getMoveHistory().filter(m => !m.virtual); - if (!targetMoves.length) { + const targetMove = target.getMoveHistory().filter(m => !m.virtual).at(-1); + if (!targetMove) { return false; } - const sketchedMove = allMoves[targetMoves[0].move]; - + const sketchedMove = allMoves[targetMove.move]; const sketchIndex = user.getMoveset().findIndex(m => m.moveId === move.id); - if (sketchIndex === -1) { return false; } @@ -5481,7 +5663,7 @@ export class AttackedByItemAttr extends MoveAttr { */ getCondition(): MoveConditionFunc { return (user: Pokemon, target: Pokemon, move: Move) => { - const heldItems = target.getHeldItems().filter(i => i.getTransferrable(true)); + const heldItems = target.getHeldItems().filter(i => i.isTransferrable); if (heldItems.length === 0) { return false; } @@ -5592,6 +5774,62 @@ export class hitsSameTypeAttr extends VariableMoveTypeMultiplierAttr { } } +/** + * Attribute used for Conversion 2, to convert the user's type to a random type that resists the target's last used move. + * Fails if the user already has ALL types that resist the target's last used move. + * Fails if the opponent has not used a move yet + * Fails if the type is unknown or stellar + * + * TODO: + * If a move has its type changed (e.g. {@linkcode Moves.HIDDEN_POWER}), it will check the new type. + */ +export class ResistLastMoveTypeAttr extends MoveEffectAttr { + constructor() { + super(true); + } + /** + * User changes its type to a random type that resists the target's last used move + * @param {Pokemon} user Pokemon that used the move and will change types + * @param {Pokemon} target Opposing pokemon that recently used a move + * @param {Move} move Move being used + * @param {any[]} args Unused + * @returns {boolean} true if the function succeeds + */ + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + if (!super.apply(user, target, move, args)) { + return false; + } + + const [targetMove] = target.getLastXMoves(1); // target's most recent move + if (!targetMove) { + return false; + } + + const moveData = allMoves[targetMove.move]; + if (moveData.type === Type.STELLAR || moveData.type === Type.UNKNOWN) { + return false; + } + const userTypes = user.getTypes(); + const validTypes = getTypeResistances(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])})); + user.updateInfo(); + + return true; + } + + getCondition(): MoveConditionFunc { + return (user, target, move) => { + const moveHistory = target.getLastXMoves(); + return !!moveHistory.length; + }; + } +} + const unknownTypeCondition: MoveConditionFunc = (user, target, move) => !user.getTypes().includes(Type.UNKNOWN); export type MoveTargetSet = { @@ -5660,6 +5898,8 @@ export const allMoves: Move[] = [ new SelfStatusMove(Moves.NONE, Type.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), @@ -5754,6 +5994,7 @@ export function initMoves() { new AttackMove(Moves.THRASH, Type.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) .attr(RecoilAttr, false, 0.33) @@ -5872,6 +6113,7 @@ export function initMoves() { new AttackMove(Moves.PETAL_DANCE, Type.GRASS, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 1) .attr(FrenzyAttr) .attr(MissEffectAttr, frenzyMissFunc) + .attr(NoEffectAttr, frenzyMissFunc) .makesContact() .danceMove() .target(MoveTarget.RANDOM_NEAR_ENEMY), @@ -6080,7 +6322,7 @@ export function initMoves() { new SelfStatusMove(Moves.REST, Type.PSYCHIC, -1, 5, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.SLEEP, true, 3, true) .attr(HealAttr, 1, true) - .condition((user, target, move) => user.getHpRatio() < 1 && user.canSetStatus(StatusEffect.SLEEP, true, 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) .attr(FlinchAttr) @@ -6139,8 +6381,10 @@ export function initMoves() { new AttackMove(Moves.FLAIL, Type.NORMAL, MoveCategory.PHYSICAL, -1, 100, 15, -1, 0, 2) .attr(LowHpPowerAttr), new StatusMove(Moves.CONVERSION_2, Type.NORMAL, -1, 30, -1, 0, 2) - .unimplemented(), + .attr(ResistLastMoveTypeAttr) + .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) + .windMove() .attr(HighCritAttr), new StatusMove(Moves.COTTON_SPORE, Type.GRASS, 100, 40, -1, 0, 2) .attr(StatChangeAttr, BattleStat.SPD, -2) @@ -6203,6 +6447,7 @@ export function initMoves() { new AttackMove(Moves.OUTRAGE, Type.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) .attr(WeatherChangeAttr, WeatherType.SANDSTORM) @@ -6365,12 +6610,17 @@ export function initMoves() { .target(MoveTarget.RANDOM_NEAR_ENEMY) .partial(), new SelfStatusMove(Moves.STOCKPILE, Type.NORMAL, -1, 20, -1, 0, 3) - .unimplemented(), - new AttackMove(Moves.SPIT_UP, Type.NORMAL, MoveCategory.SPECIAL, -1, 100, 10, -1, 0, 3) - .unimplemented(), + .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) + .condition(hasStockpileStacksCondition) + .attr(SpitUpPowerAttr, 100) + .attr(RemoveBattlerTagAttr, [BattlerTagType.STOCKPILING], true), new SelfStatusMove(Moves.SWALLOW, Type.NORMAL, -1, 10, -1, 0, 3) - .triageMove() - .unimplemented(), + .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) .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE) .attr(StatusEffectAttr, StatusEffect.BURN) @@ -6439,7 +6689,7 @@ export function initMoves() { .attr(AddBattlerTagAttr, BattlerTagType.DROWSY, false, true) .condition((user, target, move) => !target.status), new AttackMove(Moves.KNOCK_OFF, Type.DARK, MoveCategory.PHYSICAL, 65, 100, 20, -1, 0, 3) - .attr(MovePowerMultiplierAttr, (user, target, move) => target.getHeldItems().filter(i => i.getTransferrable(false)).length > 0 ? 1.5 : 1) + .attr(MovePowerMultiplierAttr, (user, target, move) => target.getHeldItems().filter(i => i.isTransferrable).length > 0 ? 1.5 : 1) .attr(RemoveHeldItemAttr, false), new AttackMove(Moves.ENDEAVOR, Type.NORMAL, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 3) .attr(MatchHpAttr) @@ -6674,6 +6924,7 @@ export function initMoves() { .target(MoveTarget.USER_OR_NEAR_ALLY), new AttackMove(Moves.METAL_BURST, Type.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) @@ -7070,7 +7321,7 @@ export function initMoves() { 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) - .attr(MovePowerMultiplierAttr, (user, target, move) => Math.max(1, 2 - 0.2 * user.getHeldItems().filter(i => i.getTransferrable(true)).reduce((v, m) => v + m.stackCount, 0))), + .attr(MovePowerMultiplierAttr, (user, target, move) => Math.max(1, 2 - 0.2 * user.getHeldItems().filter(i => i.isTransferrable).reduce((v, m) => v + m.stackCount, 0))), new StatusMove(Moves.REFLECT_TYPE, Type.NORMAL, -1, 15, -1, 0, 5) .attr(CopyTypeAttr), new AttackMove(Moves.RETALIATE, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 5, -1, 0, 5) @@ -7361,6 +7612,7 @@ export function initMoves() { .attr(NeutralDamageAgainstFlyingTypeMultiplierAttr) .attr(AddBattlerTagAttr, BattlerTagType.IGNORE_FLYING, false, false, 1, 1, true) .attr(HitsTagAttr, BattlerTagType.FLYING, false) + .attr(HitsTagAttr, BattlerTagType.MAGNET_RISEN, false) .attr(AddBattlerTagAttr, BattlerTagType.INTERRUPTED) .attr(RemoveBattlerTagAttr, [BattlerTagType.FLYING, BattlerTagType.MAGNET_RISEN]) .makesContact(false) @@ -7751,9 +8003,19 @@ export function initMoves() { .ignoresVirtual(), /* End Unused */ new AttackMove(Moves.DYNAMAX_CANNON, Type.DRAGON, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 8) - .attr(MovePowerMultiplierAttr, (user, target, move) => target.level > 200 ? 2 : 1) + .attr(MovePowerMultiplierAttr, (user, target, move) => { + // Move is only stronger against overleveled foes. + if (target.level > target.scene.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)); + } else { + return 1; + } + }) .attr(DiscourageFrequentUseAttr) .ignoresVirtual(), + new AttackMove(Moves.SNIPE_SHOT, Type.WATER, MoveCategory.SPECIAL, 80, 100, 15, -1, 0, 8) .attr(HighCritAttr) .attr(BypassRedirectAttr), @@ -7765,7 +8027,7 @@ export function initMoves() { .attr(EatBerryAttr) .attr(StatChangeAttr, BattleStat.DEF, 2, true) .condition((user) => { - const userBerries = user.scene.findModifiers(m => m instanceof BerryModifier); + const userBerries = user.scene.findModifiers(m => m instanceof BerryModifier, user.isPlayer()); return userBerries.length > 0; }) .partial(), @@ -7786,8 +8048,7 @@ export function initMoves() { .attr(EatBerryAttr) .target(MoveTarget.ALL), new StatusMove(Moves.OCTOLOCK, Type.FIGHTING, 100, 15, -1, 0, 8) - .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, true, 1) - .partial(), + .attr(AddBattlerTagAttr, BattlerTagType.OCTOLOCK, false, true, 1), new AttackMove(Moves.BOLT_BEAK, Type.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) @@ -7989,8 +8250,9 @@ export function initMoves() { .attr(StatusEffectAttr, StatusEffect.BURN), new StatusMove(Moves.JUNGLE_HEALING, Type.GRASS, -1, 10, -1, 0, 8) .attr(HealAttr, 0.25, true, false) - .target(MoveTarget.USER_AND_ALLIES) - .partial(), + .attr(HealStatusEffectAttr, true, StatusEffect.PARALYSIS, StatusEffect.POISON, StatusEffect.TOXIC, StatusEffect.BURN, StatusEffect.SLEEP) + .attr(HealStatusEffectAttr, false, StatusEffect.PARALYSIS, StatusEffect.POISON, StatusEffect.TOXIC, StatusEffect.BURN, StatusEffect.SLEEP) + .target(MoveTarget.USER_AND_ALLIES), new AttackMove(Moves.WICKED_BLOW, Type.DARK, MoveCategory.PHYSICAL, 75, 100, 5, -1, 0, 8) .attr(CritOnlyAttr) .punchingMove(), @@ -8037,6 +8299,7 @@ export function initMoves() { .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) .attr(RecoilAttr, false, 0.33) @@ -8092,9 +8355,10 @@ export function initMoves() { .target(MoveTarget.ALL_NEAR_ENEMIES), new StatusMove(Moves.LUNAR_BLESSING, Type.PSYCHIC, -1, 5, -1, 0, 8) .attr(HealAttr, 0.25) + .attr(HealStatusEffectAttr, true, StatusEffect.PARALYSIS, StatusEffect.POISON, StatusEffect.TOXIC, StatusEffect.BURN, StatusEffect.SLEEP) + .attr(HealStatusEffectAttr, false, StatusEffect.PARALYSIS, StatusEffect.POISON, StatusEffect.TOXIC, StatusEffect.BURN, StatusEffect.SLEEP) .target(MoveTarget.USER_AND_ALLIES) - .triageMove() - .partial(), + .triageMove(), new SelfStatusMove(Moves.TAKE_HEART, Type.PSYCHIC, -1, 10, -1, 0, 8) .attr(StatChangeAttr, [ BattleStat.SPATK, BattleStat.SPDEF ], 1, true) .attr(HealStatusEffectAttr, true, StatusEffect.PARALYSIS, StatusEffect.POISON, StatusEffect.TOXIC, StatusEffect.BURN, StatusEffect.SLEEP), @@ -8231,7 +8495,8 @@ export function initMoves() { new AttackMove(Moves.ICE_SPINNER, Type.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) - .partial(), + .attr(AlwaysGetHitAttr) + .attr(ReceiveDoubleDamageAttr), new StatusMove(Moves.REVIVAL_BLESSING, Type.NORMAL, -1, 1, -1, 0, 9) .triageMove() .attr(RevivalBlessingAttr) @@ -8340,6 +8605,7 @@ export function initMoves() { }), // TODO Add Instruct/Encore interaction new AttackMove(Moves.COMEUPPANCE, Type.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) .attr(HighCritAttr) @@ -8425,4 +8691,9 @@ export function initMoves() { new AttackMove(Moves.MALIGNANT_CHAIN, Type.POISON, MoveCategory.SPECIAL, 100, 100, 5, 50, 0, 9) .attr(StatusEffectAttr, StatusEffect.TOXIC) ); + allMoves.map(m=>{ + if (m.getAttrs(StatChangeAttr).some(a=> a.selfTarget && a.levels < 0)) { + selfStatLowerMoves.push(m.id); + } + }); } diff --git a/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts b/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts index c764589ac42..2b379bdba86 100644 --- a/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts +++ b/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts @@ -34,7 +34,7 @@ export const AbsoluteAvariceEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.ABSOLUTE_AVARICE) .withEncounterTier(MysteryEncounterTier.GREAT) .withSceneWaveRangeRequirement(10, 180) - .withSceneRequirement(new PersistentModifierRequirement(BerryModifier.name, 4)) // Must have at least 4 berries to spawn + .withSceneRequirement(new PersistentModifierRequirement("BerryModifier", 4)) // Must have at least 4 berries to spawn .withIntroSpriteConfigs([ { spriteKey: Species.GREEDENT.toString(), @@ -301,6 +301,7 @@ export const AbsoluteAvariceEncounter: IMysteryEncounter = } }); + transitionMysteryEncounterIntroVisuals(scene, true, true, 500); leaveEncounterWithoutBattle(scene, true); }) .build() @@ -331,6 +332,7 @@ export const AbsoluteAvariceEncounter: IMysteryEncounter = greedent.moveset = [new PokemonMove(Moves.THRASH), new PokemonMove(Moves.BODY_PRESS), new PokemonMove(Moves.STUFF_CHEEKS), new PokemonMove(Moves.SLACK_OFF)]; greedent.passive = true; + transitionMysteryEncounterIntroVisuals(scene, true, true, 500); await catchPokemon(scene, greedent, null, PokeballType.POKEBALL, false); leaveEncounterWithoutBattle(scene, true); }) diff --git a/src/data/mystery-encounters/encounters/delibirdy-encounter.ts b/src/data/mystery-encounters/encounters/delibirdy-encounter.ts index dcc37cda8fe..c1c3fb8c3c8 100644 --- a/src/data/mystery-encounters/encounters/delibirdy-encounter.ts +++ b/src/data/mystery-encounters/encounters/delibirdy-encounter.ts @@ -10,7 +10,7 @@ import { CombinationPokemonRequirement, HeldItemRequirement, MoneyRequirement } 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, HiddenAbilityRateBoosterModifier, LevelIncrementBoosterModifier, PokemonBaseStatModifier, PokemonBaseStatTotalModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, PreserveBerryModifier, TerastallizeModifier } from "#app/modifier/modifier"; +import { HealingBoosterModifier, HiddenAbilityRateBoosterModifier, LevelIncrementBoosterModifier, PokemonHeldItemModifier, PreserveBerryModifier } from "#app/modifier/modifier"; import { ModifierRewardPhase } from "#app/phases"; import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; import { applyModifierTypeToPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; @@ -20,15 +20,15 @@ import i18next from "#app/plugins/i18n"; const namespace = "mysteryEncounter:delibirdy"; /** Berries only */ -const OPTION_2_ALLOWED_MODIFIERS = [BerryModifier.name, PokemonInstantReviveModifier.name]; +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 = [ - BerryModifier.name, - PokemonInstantReviveModifier.name, - TerastallizeModifier.name, - PokemonBaseStatModifier.name, - PokemonBaseStatTotalModifier.name + "BerryModifier", + "PokemonInstantReviveModifier", + "TerastallizeModifier", + "PokemonBaseStatModifier", + "PokemonBaseStatTotalModifier" ]; /** diff --git a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts index f9d4e487ab3..7ca2e991305 100644 --- a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts +++ b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts @@ -4,7 +4,7 @@ import BattleScene from "#app/battle-scene"; import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; import MysteryEncounterOption, { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { TrainerSlot } from "#app/data/trainer-config"; -import { ScanIvsPhase, SummonPhase, VictoryPhase } from "#app/phases"; +import { ScanIvsPhase, SummonPhase } from "#app/phases"; import { HiddenAbilityRateBoosterModifier, IvScannerModifier } from "#app/modifier/modifier"; import { EnemyPokemon } from "#app/field/pokemon"; import { PokeballType } from "#app/data/pokeball"; @@ -136,7 +136,6 @@ const safariZoneGameOptions: MysteryEncounterOption[] = [ if (catchResult) { // You caught pokemon - scene.unshiftPhase(new VictoryPhase(scene, 0)); // Check how many safari pokemon left if (scene.currentBattle.mysteryEncounter.misc.safariPokemonRemaining > 0) { await summonSafariPokemon(scene); diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index a0fe413339d..9fa24106417 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -6,7 +6,6 @@ import { showEncounterText } from "#app/data/mystery-encounters/utils/encounter- import Pokemon, { FieldPosition, PlayerPokemon, PokemonMove } from "#app/field/pokemon"; import { ExpBalanceModifier, ExpShareModifier, MultipleParticipantExpBonusModifier, PokemonExpBoosterModifier } from "#app/modifier/modifier"; import { CustomModifierSettings, ModifierPoolType, ModifierType, ModifierTypeFunc, ModifierTypeGenerator, ModifierTypeOption, modifierTypes, PokemonHeldItemModifierType, regenerateModifierPoolThresholds } from "#app/modifier/modifier-type"; -import * as Overrides from "#app/overrides"; import { BattleEndPhase, EggLapsePhase, ExpPhase, GameOverPhase, ModifierRewardPhase, MovePhase, SelectModifierPhase, ShowPartyExpBarPhase, TrainerVictoryPhase } from "#app/phases"; import { MysteryEncounterBattlePhase, MysteryEncounterBattleStartCleanupPhase, MysteryEncounterPhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phases"; import PokemonData from "#app/system/pokemon-data"; @@ -29,6 +28,7 @@ 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 Overrides from "#app/overrides"; /** * Animates exclamation sprite over trainer's head at start of encounter @@ -605,7 +605,13 @@ export function leaveEncounterWithoutBattle(scene: BattleScene, addHealPhase: bo handleMysteryEncounterVictory(scene, addHealPhase); } -export function handleMysteryEncounterVictory(scene: BattleScene, addHealPhase: boolean = false) { +/** + * + * @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()); if (allowedPkm.length === 0) { @@ -616,7 +622,7 @@ export function handleMysteryEncounterVictory(scene: BattleScene, addHealPhase: // If in repeated encounter variant, do nothing // Variant must eventually be swapped in order to handle "true" end of the encounter - if (scene.currentBattle.mysteryEncounter.encounterMode === MysteryEncounterMode.CONTINUOUS_ENCOUNTER) { + if (scene.currentBattle.mysteryEncounter.encounterMode === MysteryEncounterMode.CONTINUOUS_ENCOUNTER || doNotContinue) { return; } else if (scene.currentBattle.mysteryEncounter.encounterMode === MysteryEncounterMode.NO_BATTLE) { scene.pushPhase(new EggLapsePhase(scene)); diff --git a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts index a11e65c5c54..edfb72e6611 100644 --- a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts @@ -437,8 +437,17 @@ function failCatch(scene: BattleScene, pokemon: EnemyPokemon, originalY: number, }); } +/** + * + * @param scene + * @param pokemon + * @param pokeball + * @param pokeballType + * @param showCatchObtainMessage + * @param isObtain + */ export async function catchPokemon(scene: BattleScene, pokemon: EnemyPokemon, pokeball: Phaser.GameObjects.Sprite, pokeballType: PokeballType, showCatchObtainMessage: boolean = true, isObtain: boolean = false): Promise { - scene.unshiftPhase(new VictoryPhase(scene, BattlerIndex.ENEMY)); + scene.unshiftPhase(new VictoryPhase(scene, BattlerIndex.ENEMY, true)); const speciesForm = !pokemon.fusionSpecies ? pokemon.getSpeciesForm() : pokemon.getFusionSpeciesForm(); diff --git a/src/data/nature.ts b/src/data/nature.ts index 0d9be0f663d..1ae3b76a6b6 100644 --- a/src/data/nature.ts +++ b/src/data/nature.ts @@ -1,36 +1,11 @@ import { Stat, getStatName } from "./pokemon-stat"; import * as Utils from "../utils"; import { TextStyle, getBBCodeFrag } from "../ui/text"; +import { Nature } from "#enums/nature"; import { UiTheme } from "#enums/ui-theme"; import i18next from "i18next"; -export enum Nature { - HARDY, - LONELY, - BRAVE, - ADAMANT, - NAUGHTY, - BOLD, - DOCILE, - RELAXED, - IMPISH, - LAX, - TIMID, - HASTY, - SERIOUS, - JOLLY, - NAIVE, - MODEST, - MILD, - QUIET, - BASHFUL, - RASH, - CALM, - GENTLE, - SASSY, - CAREFUL, - QUIRKY -} +export { Nature }; export function getNatureName(nature: Nature, includeStatEffects: boolean = false, forStarterSelect: boolean = false, ignoreBBCode: boolean = false, uiTheme: UiTheme = UiTheme.DEFAULT): string { let ret = Utils.toReadableString(Nature[nature]); diff --git a/src/data/pokeball.ts b/src/data/pokeball.ts index 5964884d967..f26451b802b 100644 --- a/src/data/pokeball.ts +++ b/src/data/pokeball.ts @@ -1,14 +1,8 @@ +import { PokeballType } from "#enums/pokeball"; import BattleScene from "../battle-scene"; import i18next from "i18next"; -export enum PokeballType { - POKEBALL, - GREAT_BALL, - ULTRA_BALL, - ROGUE_BALL, - MASTER_BALL, - LUXURY_BALL -} +export { PokeballType }; export const MAX_PER_TYPE_POKEBALLS: integer = 99; diff --git a/src/data/pokemon-forms.ts b/src/data/pokemon-forms.ts index ae1532f0be0..d6fe12a8186 100644 --- a/src/data/pokemon-forms.ts +++ b/src/data/pokemon-forms.ts @@ -8,6 +8,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { TimeOfDay } from "#enums/time-of-day"; +import { getPokemonNameWithAffix } from "#app/messages.js"; export enum FormChangeItem { NONE, @@ -137,7 +138,7 @@ export class SpeciesFormChange { public formKey: string; public trigger: SpeciesFormChangeTrigger; public quiet: boolean; - private conditions: SpeciesFormChangeCondition[]; + public conditions: SpeciesFormChangeCondition[]; constructor(speciesId: Species, preFormKey: string, evoFormKey: string, trigger: SpeciesFormChangeTrigger, quiet: boolean = false, ...conditions: SpeciesFormChangeCondition[]) { this.speciesId = speciesId; @@ -369,11 +370,21 @@ export function getSpeciesFormChangeMessage(pokemon: Pokemon, formChange: Specie return `${prefix}${preName} Eternamaxed\ninto ${pokemon.name}!`; } if (isRevert) { - return `${prefix}${pokemon.name} reverted\nto its original form!`; + return `${prefix}${getPokemonNameWithAffix(pokemon)} reverted\nto its original form!`; } return `${prefix}${preName} changed form!`; } +/** + * Gives a condition for form changing checking if a species is registered as caught in the player's dex data. + * Used for fusion forms such as Kyurem and Necrozma. + * @param species + * @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); +} + interface PokemonFormChanges { [key: string]: SpeciesFormChange[] } @@ -608,8 +619,8 @@ export const pokemonFormChanges: PokemonFormChanges = { new SpeciesFormChange(Species.LANDORUS, SpeciesFormKey.INCARNATE, SpeciesFormKey.THERIAN, new SpeciesFormChangeItemTrigger(FormChangeItem.REVEAL_GLASS)) ], [Species.KYUREM]: [ - new SpeciesFormChange(Species.KYUREM, "", "black", new SpeciesFormChangeItemTrigger(FormChangeItem.DARK_STONE)), - new SpeciesFormChange(Species.KYUREM, "", "white", new SpeciesFormChangeItemTrigger(FormChangeItem.LIGHT_STONE)) + new SpeciesFormChange(Species.KYUREM, "", "black", new SpeciesFormChangeItemTrigger(FormChangeItem.DARK_STONE), false, getSpeciesDependentFormChangeCondition(Species.ZEKROM)), + 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)), @@ -699,8 +710,8 @@ export const pokemonFormChanges: PokemonFormChanges = { new SpeciesFormChange(Species.MIMIKYU, "busted", "disguised", new SpeciesFormChangeManualTrigger(), true) ], [Species.NECROZMA]: [ - new SpeciesFormChange(Species.NECROZMA, "", "dawn-wings", new SpeciesFormChangeItemTrigger(FormChangeItem.N_LUNARIZER)), - new SpeciesFormChange(Species.NECROZMA, "", "dusk-mane", new SpeciesFormChangeItemTrigger(FormChangeItem.N_SOLARIZER)) + new SpeciesFormChange(Species.NECROZMA, "", "dawn-wings", new SpeciesFormChangeItemTrigger(FormChangeItem.N_LUNARIZER), false, getSpeciesDependentFormChangeCondition(Species.LUNALA)), + new SpeciesFormChange(Species.NECROZMA, "", "dusk-mane", new SpeciesFormChangeItemTrigger(FormChangeItem.N_SOLARIZER), false, getSpeciesDependentFormChangeCondition(Species.SOLGALEO)) ], [Species.MELMETAL]: [ new SpeciesFormChange(Species.MELMETAL, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) @@ -786,8 +797,8 @@ export const pokemonFormChanges: PokemonFormChanges = { new SpeciesFormChange(Species.URSHIFU, "rapid-strike", SpeciesFormKey.GIGANTAMAX_RAPID, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS)) ], [Species.CALYREX]: [ - new SpeciesFormChange(Species.CALYREX, "", "ice", new SpeciesFormChangeItemTrigger(FormChangeItem.ICY_REINS_OF_UNITY)), - new SpeciesFormChange(Species.CALYREX, "", "shadow", new SpeciesFormChangeItemTrigger(FormChangeItem.SHADOW_REINS_OF_UNITY)) + new SpeciesFormChange(Species.CALYREX, "", "ice", new SpeciesFormChangeItemTrigger(FormChangeItem.ICY_REINS_OF_UNITY), false, getSpeciesDependentFormChangeCondition(Species.GLASTRIER)), + new SpeciesFormChange(Species.CALYREX, "", "shadow", new SpeciesFormChangeItemTrigger(FormChangeItem.SHADOW_REINS_OF_UNITY), false, getSpeciesDependentFormChangeCondition(Species.SPECTRIER)) ], [Species.ENAMORUS]: [ new SpeciesFormChange(Species.ENAMORUS, SpeciesFormKey.INCARNATE, SpeciesFormKey.THERIAN, new SpeciesFormChangeItemTrigger(FormChangeItem.REVEAL_GLASS)) diff --git a/src/data/pokemon-level-moves.ts b/src/data/pokemon-level-moves.ts index 53272ed5beb..2ba8ccdf463 100644 --- a/src/data/pokemon-level-moves.ts +++ b/src/data/pokemon-level-moves.ts @@ -587,28 +587,28 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 48, Moves.HEALING_WISH ], ], [Species.CLEFABLE]: [ + [ RELEARN_MOVE, Moves.POUND ], + [ RELEARN_MOVE, Moves.GROWL ], + [ RELEARN_MOVE, Moves.SING ], + [ RELEARN_MOVE, Moves.DEFENSE_CURL ], + [ RELEARN_MOVE, Moves.SPLASH ], + [ RELEARN_MOVE, Moves.SWEET_KISS ], + [ RELEARN_MOVE, Moves.CHARM ], + [ RELEARN_MOVE, Moves.ENCORE ], + [ RELEARN_MOVE, Moves.MOONLIGHT ], + [ RELEARN_MOVE, Moves.FOLLOW_ME ], + [ RELEARN_MOVE, Moves.COSMIC_POWER ], + [ RELEARN_MOVE, Moves.GRAVITY ], + [ RELEARN_MOVE, Moves.HEALING_WISH ], + [ RELEARN_MOVE, Moves.COPYCAT ], + [ RELEARN_MOVE, Moves.AFTER_YOU ], + [ RELEARN_MOVE, Moves.STORED_POWER ], + [ RELEARN_MOVE, Moves.DISARMING_VOICE ], [ 1, Moves.METRONOME ], [ 1, Moves.METEOR_MASH ], [ 1, Moves.MOONBLAST ], [ 1, Moves.LIFE_DEW ], - [ 1, Moves.POUND ], - [ 1, Moves.GROWL ], - [ 1, Moves.SING ], - [ 1, Moves.DEFENSE_CURL ], - [ 1, Moves.SPLASH ], - [ 1, Moves.SWEET_KISS ], - [ 1, Moves.CHARM ], - [ 1, Moves.ENCORE ], - [ 1, Moves.MOONLIGHT ], - [ 1, Moves.FOLLOW_ME ], - [ 1, Moves.COSMIC_POWER ], - [ 1, Moves.GRAVITY ], - [ 1, Moves.HEALING_WISH ], - [ 1, Moves.COPYCAT ], - [ 1, Moves.AFTER_YOU ], - [ 1, Moves.STORED_POWER ], [ 1, Moves.SPOTLIGHT ], - [ 1, Moves.DISARMING_VOICE ], ], [Species.VULPIX]: [ [ 1, Moves.TAIL_WHIP ], @@ -628,22 +628,22 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 52, Moves.FIRE_BLAST ], ], [Species.NINETALES]: [ + [ RELEARN_MOVE, Moves.DISABLE ], + [ RELEARN_MOVE, Moves.EMBER ], + [ RELEARN_MOVE, Moves.FIRE_SPIN ], + [ RELEARN_MOVE, Moves.CONFUSE_RAY ], + [ RELEARN_MOVE, Moves.FIRE_BLAST ], + [ RELEARN_MOVE, Moves.SPITE ], + [ RELEARN_MOVE, Moves.SAFEGUARD ], + [ RELEARN_MOVE, Moves.WILL_O_WISP ], + [ RELEARN_MOVE, Moves.IMPRISON ], + [ RELEARN_MOVE, Moves.EXTRASENSORY ], + [ RELEARN_MOVE, Moves.NASTY_PLOT ], + [ RELEARN_MOVE, Moves.INCINERATE ], + [ RELEARN_MOVE, Moves.INFERNO ], [ 1, Moves.FLAMETHROWER ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.QUICK_ATTACK ], - [ 1, Moves.DISABLE ], - [ 1, Moves.EMBER ], - [ 1, Moves.FIRE_SPIN ], - [ 1, Moves.CONFUSE_RAY ], - [ 1, Moves.FIRE_BLAST ], - [ 1, Moves.SPITE ], - [ 1, Moves.SAFEGUARD ], - [ 1, Moves.WILL_O_WISP ], - [ 1, Moves.IMPRISON ], - [ 1, Moves.EXTRASENSORY ], - [ 1, Moves.NASTY_PLOT ], - [ 1, Moves.INCINERATE ], - [ 1, Moves.INFERNO ], ], [Species.JIGGLYPUFF]: [ [ 1, Moves.POUND ], @@ -1047,16 +1047,16 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.BUBBLE_BEAM ], [ 1, Moves.BODY_SLAM ], [ 1, Moves.HYPNOSIS ], - [ 1, Moves.POUND ], - [ 1, Moves.DOUBLE_EDGE ], - [ 1, Moves.WATER_GUN ], [ 1, Moves.WATER_SPORT ], - [ 1, Moves.HYDRO_PUMP ], - [ 1, Moves.BELLY_DRUM ], - [ 1, Moves.RAIN_DANCE ], - [ 1, Moves.MUD_SHOT ], - [ 1, Moves.EARTH_POWER ], - [ 1, Moves.CIRCLE_THROW ], + [ RELEARN_MOVE, Moves.POUND ], + [ RELEARN_MOVE, Moves.DOUBLE_EDGE ], + [ RELEARN_MOVE, Moves.WATER_GUN ], + [ RELEARN_MOVE, Moves.HYDRO_PUMP ], + [ RELEARN_MOVE, Moves.BELLY_DRUM ], + [ RELEARN_MOVE, Moves.RAIN_DANCE ], + [ RELEARN_MOVE, Moves.MUD_SHOT ], + [ RELEARN_MOVE, Moves.EARTH_POWER ], + [ RELEARN_MOVE, Moves.CIRCLE_THROW ], ], [Species.ABRA]: [ [ 1, Moves.TELEPORT ], @@ -1181,15 +1181,15 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.VICTREEBEL]: [ [ EVOLVE_MOVE, Moves.LEAF_STORM ], + [ RELEARN_MOVE, Moves.STOCKPILE ], + [ RELEARN_MOVE, Moves.SWALLOW ], + [ RELEARN_MOVE, Moves.SPIT_UP ], + [ RELEARN_MOVE, Moves.GASTRO_ACID ], + [ RELEARN_MOVE, Moves.POWER_WHIP ], [ 1, Moves.VINE_WHIP ], [ 1, Moves.SLEEP_POWDER ], [ 1, Moves.SWEET_SCENT ], [ 1, Moves.RAZOR_LEAF ], - [ 1, Moves.STOCKPILE ], - [ 1, Moves.SWALLOW ], - [ 1, Moves.SPIT_UP ], - [ 1, Moves.GASTRO_ACID ], - [ 1, Moves.POWER_WHIP ], [ 44, Moves.LEAF_BLADE ], ], [Species.TENTACOOL]: [ @@ -1328,6 +1328,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 45, Moves.HEAL_PULSE ], ], [Species.SLOWBRO]: [ + [ RELEARN_MOVE, Moves.FUTURE_SIGHT ], [ 1, Moves.TACKLE ], [ 1, Moves.GROWL ], [ 1, Moves.WATER_GUN ], @@ -1745,6 +1746,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.EXEGGUTOR]: [ [ EVOLVE_MOVE, Moves.STOMP ], + [ RELEARN_MOVE, Moves.GROWTH ], [ 1, Moves.BARRAGE ], [ 1, Moves.SEED_BOMB ], [ 1, Moves.PSYSHOCK ], @@ -1763,7 +1765,6 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.HYPNOSIS ], [ 1, Moves.REFLECT ], [ 1, Moves.LEECH_SEED ], - [ 1, Moves.GROWTH ], ], [Species.CUBONE]: [ [ 1, Moves.GROWL ], @@ -3206,20 +3207,20 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.POLITOED]: [ [ EVOLVE_MOVE, Moves.BOUNCE ], + [ RELEARN_MOVE, Moves.BODY_SLAM ], + [ RELEARN_MOVE, Moves.DOUBLE_EDGE ], + [ RELEARN_MOVE, Moves.WATER_GUN ], + [ RELEARN_MOVE, Moves.BUBBLE_BEAM ], + [ RELEARN_MOVE, Moves.HYPNOSIS ], + [ RELEARN_MOVE, Moves.PERISH_SONG ], + [ RELEARN_MOVE, Moves.SWAGGER ], + [ RELEARN_MOVE, Moves.HYPER_VOICE ], + [ RELEARN_MOVE, Moves.MUD_SHOT ], + [ RELEARN_MOVE, Moves.EARTH_POWER ], [ 1, Moves.RAIN_DANCE ], [ 1, Moves.HYDRO_PUMP ], [ 1, Moves.BELLY_DRUM ], [ 1, Moves.POUND ], - [ 1, Moves.BODY_SLAM ], - [ 1, Moves.DOUBLE_EDGE ], - [ 1, Moves.WATER_GUN ], - [ 1, Moves.BUBBLE_BEAM ], - [ 1, Moves.HYPNOSIS ], - [ 1, Moves.PERISH_SONG ], - [ 1, Moves.SWAGGER ], - [ 1, Moves.HYPER_VOICE ], - [ 1, Moves.MUD_SHOT ], - [ 1, Moves.EARTH_POWER ], ], [Species.HOPPIP]: [ [ 1, Moves.TACKLE ], @@ -3448,6 +3449,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 60, Moves.QUASH ], ], [Species.SLOWKING]: [ + [ RELEARN_MOVE, Moves.FUTURE_SIGHT ], + [ RELEARN_MOVE, Moves.CHILLY_RECEPTION ], [ 1, Moves.POWER_GEM ], [ 1, Moves.NASTY_PLOT ], [ 1, Moves.SWAGGER ], @@ -3455,8 +3458,6 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.CURSE ], [ 1, Moves.GROWL ], [ 1, Moves.WATER_GUN ], - [ 1, Moves.FUTURE_SIGHT ], - [ 1, Moves.CHILLY_RECEPTION ], [ 9, Moves.YAWN ], [ 12, Moves.CONFUSION ], [ 15, Moves.DISABLE ], @@ -4214,12 +4215,12 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 78, Moves.ZAP_CANNON ], ], [Species.ENTEI]: [ + [ RELEARN_MOVE, Moves.SACRED_FIRE ], + [ RELEARN_MOVE, Moves.EXTREME_SPEED ], [ 1, Moves.STOMP ], [ 1, Moves.LEER ], [ 1, Moves.EMBER ], [ 1, Moves.SMOKESCREEN ], - [ 1, Moves.SACRED_FIRE ], - [ 1, Moves.EXTREME_SPEED ], [ 6, Moves.FLAME_WHEEL ], [ 12, Moves.BITE ], [ 18, Moves.CALM_MIND ], @@ -4235,12 +4236,12 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 78, Moves.ERUPTION ], ], [Species.SUICUNE]: [ + [ RELEARN_MOVE, Moves.EXTREME_SPEED ], + [ RELEARN_MOVE, Moves.SHEER_COLD ], [ 1, Moves.GUST ], [ 1, Moves.LEER ], [ 1, Moves.MIST ], [ 1, Moves.WATER_GUN ], - [ 1, Moves.EXTREME_SPEED ], - [ 1, Moves.SHEER_COLD ], [ 6, Moves.WATER_PULSE ], [ 12, Moves.BITE ], [ 18, Moves.CALM_MIND ], @@ -4317,11 +4318,11 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 59, Moves.GIGA_IMPACT ], ], [Species.LUGIA]: [ + [ RELEARN_MOVE, Moves.DRAGON_RUSH ], [ 1, Moves.GUST ], [ 1, Moves.WHIRLWIND ], [ 1, Moves.ANCIENT_POWER ], [ 1, Moves.WEATHER_BALL ], - [ 1, Moves.DRAGON_RUSH ], [ 9, Moves.MIST ], [ 18, Moves.SAFEGUARD ], [ 27, Moves.CALM_MIND ], @@ -4383,14 +4384,14 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 39, Moves.LEAF_STORM ], ], [Species.GROVYLE]: [ + [ RELEARN_MOVE, Moves.FALSE_SWIPE ], + [ RELEARN_MOVE, Moves.FURY_CUTTER ], + [ RELEARN_MOVE, Moves.X_SCISSOR ], + [ RELEARN_MOVE, Moves.ENERGY_BALL ], [ 1, Moves.POUND ], [ 1, Moves.LEER ], [ 1, Moves.LEAFAGE ], [ 1, Moves.QUICK_ATTACK ], - [ 1, Moves.FALSE_SWIPE ], - [ 1, Moves.FURY_CUTTER ], - [ 1, Moves.X_SCISSOR ], - [ 1, Moves.ENERGY_BALL ], [ 9, Moves.MEGA_DRAIN ], [ 12, Moves.DETECT ], [ 15, Moves.QUICK_GUARD ], @@ -4405,15 +4406,15 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.SCEPTILE]: [ [ EVOLVE_MOVE, Moves.LEAF_BLADE ], + [ RELEARN_MOVE, Moves.FALSE_SWIPE ], + [ RELEARN_MOVE, Moves.FURY_CUTTER ], + [ RELEARN_MOVE, Moves.X_SCISSOR ], + [ RELEARN_MOVE, Moves.ENERGY_BALL ], + [ RELEARN_MOVE, Moves.SHED_TAIL ], [ 1, Moves.POUND ], [ 1, Moves.LEER ], [ 1, Moves.LEAFAGE ], [ 1, Moves.QUICK_ATTACK ], - [ 1, Moves.FALSE_SWIPE ], - [ 1, Moves.FURY_CUTTER ], - [ 1, Moves.X_SCISSOR ], - [ 1, Moves.ENERGY_BALL ], - [ 1, Moves.SHED_TAIL ], [ 1, Moves.DUAL_CHOP ], [ 5, Moves.MEGA_DRAIN ], [ 12, Moves.DETECT ], @@ -4445,12 +4446,12 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.COMBUSKEN]: [ [ EVOLVE_MOVE, Moves.DOUBLE_KICK ], + [ RELEARN_MOVE, Moves.FLAMETHROWER ], + [ RELEARN_MOVE, Moves.FEATHER_DANCE ], [ 1, Moves.SCRATCH ], [ 1, Moves.GROWL ], [ 1, Moves.EMBER ], [ 1, Moves.QUICK_ATTACK ], - [ 1, Moves.FLAMETHROWER ], - [ 1, Moves.FEATHER_DANCE ], [ 9, Moves.FLAME_CHARGE ], [ 12, Moves.DETECT ], [ 15, Moves.SAND_ATTACK ], @@ -4465,14 +4466,14 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.BLAZIKEN]: [ [ EVOLVE_MOVE, Moves.BLAZE_KICK ], + [ RELEARN_MOVE, Moves.FIRE_PUNCH ], + [ RELEARN_MOVE, Moves.EMBER ], + [ RELEARN_MOVE, Moves.FLAMETHROWER ], + [ RELEARN_MOVE, Moves.FEATHER_DANCE ], [ 1, Moves.DOUBLE_KICK ], [ 1, Moves.SCRATCH ], [ 1, Moves.GROWL ], [ 1, Moves.QUICK_ATTACK ], - [ 1, Moves.FIRE_PUNCH ], - [ 1, Moves.EMBER ], - [ 1, Moves.FLAMETHROWER ], - [ 1, Moves.FEATHER_DANCE ], [ 9, Moves.FLAME_CHARGE ], [ 12, Moves.DETECT ], [ 15, Moves.SAND_ATTACK ], @@ -4504,10 +4505,10 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.MARSHTOMP]: [ [ EVOLVE_MOVE, Moves.MUD_SHOT ], + [ RELEARN_MOVE, Moves.ROCK_SMASH ], [ 1, Moves.TACKLE ], [ 1, Moves.GROWL ], [ 1, Moves.WATER_GUN ], - [ 1, Moves.ROCK_SMASH ], [ 9, Moves.ROCK_THROW ], [ 12, Moves.PROTECT ], [ 15, Moves.SUPERSONIC ], @@ -4521,14 +4522,14 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 55, Moves.HYDRO_PUMP ], ], [Species.SWAMPERT]: [ + [ RELEARN_MOVE, Moves.SURF ], + [ RELEARN_MOVE, Moves.EARTHQUAKE ], + [ RELEARN_MOVE, Moves.ROCK_SMASH ], + [ RELEARN_MOVE, Moves.HAMMER_ARM ], [ 1, Moves.MUD_SHOT ], [ 1, Moves.TACKLE ], [ 1, Moves.GROWL ], [ 1, Moves.WATER_GUN ], - [ 1, Moves.SURF ], - [ 1, Moves.EARTHQUAKE ], - [ 1, Moves.ROCK_SMASH ], - [ 1, Moves.HAMMER_ARM ], [ 9, Moves.ROCK_THROW ], [ 12, Moves.PROTECT ], [ 15, Moves.SUPERSONIC ], @@ -4706,22 +4707,22 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 64, Moves.HYDRO_PUMP ], ], [Species.LUDICOLO]: [ + [ RELEARN_MOVE, Moves.GROWL ], + [ RELEARN_MOVE, Moves.MIST ], + [ RELEARN_MOVE, Moves.WATER_GUN ], + [ RELEARN_MOVE, Moves.HYDRO_PUMP ], + [ RELEARN_MOVE, Moves.ABSORB ], + [ RELEARN_MOVE, Moves.MEGA_DRAIN ], + [ RELEARN_MOVE, Moves.FURY_SWIPES ], + [ RELEARN_MOVE, Moves.FLAIL ], + [ RELEARN_MOVE, Moves.KNOCK_OFF ], + [ RELEARN_MOVE, Moves.TEETER_DANCE ], + [ RELEARN_MOVE, Moves.ASTONISH ], + [ RELEARN_MOVE, Moves.ENERGY_BALL ], + [ RELEARN_MOVE, Moves.ZEN_HEADBUTT ], [ 1, Moves.FAKE_OUT ], [ 1, Moves.BUBBLE_BEAM ], [ 1, Moves.RAIN_DANCE ], - [ 1, Moves.GROWL ], - [ 1, Moves.MIST ], - [ 1, Moves.WATER_GUN ], - [ 1, Moves.HYDRO_PUMP ], - [ 1, Moves.ABSORB ], - [ 1, Moves.MEGA_DRAIN ], - [ 1, Moves.FURY_SWIPES ], - [ 1, Moves.FLAIL ], - [ 1, Moves.KNOCK_OFF ], - [ 1, Moves.TEETER_DANCE ], - [ 1, Moves.ASTONISH ], - [ 1, Moves.ENERGY_BALL ], - [ 1, Moves.ZEN_HEADBUTT ], ], [Species.SEEDOT]: [ [ 1, Moves.TACKLE ], @@ -4762,27 +4763,27 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.SHIFTRY]: [ [ EVOLVE_MOVE, Moves.LEAF_BLADE ], + [ RELEARN_MOVE, Moves.WHIRLWIND ], + [ RELEARN_MOVE, Moves.TACKLE ], + [ RELEARN_MOVE, Moves.ABSORB ], + [ RELEARN_MOVE, Moves.MEGA_DRAIN ], + [ RELEARN_MOVE, Moves.GROWTH ], + [ RELEARN_MOVE, Moves.RAZOR_LEAF ], + [ RELEARN_MOVE, Moves.HARDEN ], + [ RELEARN_MOVE, Moves.EXPLOSION ], + [ RELEARN_MOVE, Moves.ROLLOUT ], + [ RELEARN_MOVE, Moves.SWAGGER ], + [ RELEARN_MOVE, Moves.SYNTHESIS ], + [ RELEARN_MOVE, Moves.BEAT_UP ], + [ RELEARN_MOVE, Moves.FAKE_OUT ], + [ RELEARN_MOVE, Moves.TORMENT ], + [ RELEARN_MOVE, Moves.ASTONISH ], + [ RELEARN_MOVE, Moves.EXTRASENSORY ], + [ RELEARN_MOVE, Moves.SUCKER_PUNCH ], [ 1, Moves.AIR_CUTTER ], [ 1, Moves.HURRICANE ], [ 1, Moves.PAYBACK ], [ 1, Moves.SUNNY_DAY ], - [ 1, Moves.WHIRLWIND ], - [ 1, Moves.TACKLE ], - [ 1, Moves.ABSORB ], - [ 1, Moves.MEGA_DRAIN ], - [ 1, Moves.GROWTH ], - [ 1, Moves.RAZOR_LEAF ], - [ 1, Moves.HARDEN ], - [ 1, Moves.EXPLOSION ], - [ 1, Moves.ROLLOUT ], - [ 1, Moves.SWAGGER ], - [ 1, Moves.SYNTHESIS ], - [ 1, Moves.BEAT_UP ], - [ 1, Moves.FAKE_OUT ], - [ 1, Moves.TORMENT ], - [ 1, Moves.ASTONISH ], - [ 1, Moves.EXTRASENSORY ], - [ 1, Moves.SUCKER_PUNCH ], ], [Species.TAILLOW]: [ [ 1, Moves.PECK ], @@ -4952,6 +4953,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.BRELOOM]: [ [ EVOLVE_MOVE, Moves.MACH_PUNCH ], + [ RELEARN_MOVE, Moves.SPORE ], [ 1, Moves.POISON_POWDER ], [ 1, Moves.GROWTH ], [ 1, Moves.TOXIC ], @@ -5388,11 +5390,11 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 60, Moves.ELECTRIC_TERRAIN ], ], [Species.PLUSLE]: [ + [ RELEARN_MOVE, Moves.NUZZLE ], [ 1, Moves.PLAY_NICE ], [ 1, Moves.GROWL ], [ 1, Moves.THUNDER_WAVE ], [ 1, Moves.QUICK_ATTACK ], - [ 1, Moves.NUZZLE ], [ 4, Moves.HELPING_HAND ], [ 7, Moves.SPARK ], [ 10, Moves.ENCORE ], @@ -5410,11 +5412,11 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 49, Moves.ENTRAINMENT ], ], [Species.MINUN]: [ + [ RELEARN_MOVE, Moves.NUZZLE ], [ 1, Moves.PLAY_NICE ], [ 1, Moves.GROWL ], [ 1, Moves.THUNDER_WAVE ], [ 1, Moves.QUICK_ATTACK ], - [ 1, Moves.NUZZLE ], [ 4, Moves.HELPING_HAND ], [ 7, Moves.SPARK ], [ 10, Moves.ENCORE ], @@ -5712,15 +5714,15 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.VIBRAVA]: [ [ EVOLVE_MOVE, Moves.DRAGON_BREATH ], + [ RELEARN_MOVE, Moves.SUPERSONIC ], + [ RELEARN_MOVE, Moves.FISSURE ], + [ RELEARN_MOVE, Moves.CRUNCH ], + [ RELEARN_MOVE, Moves.SUPERPOWER ], + [ RELEARN_MOVE, Moves.ASTONISH ], + [ RELEARN_MOVE, Moves.BULLDOZE ], [ 1, Moves.DIG ], [ 1, Moves.SAND_ATTACK ], [ 1, Moves.BITE ], - [ 1, Moves.SUPERSONIC ], - [ 1, Moves.FISSURE ], - [ 1, Moves.CRUNCH ], - [ 1, Moves.SUPERPOWER ], - [ 1, Moves.ASTONISH ], - [ 1, Moves.BULLDOZE ], [ 1, Moves.BIDE ], [ 1, Moves.FEINT_ATTACK ], [ 12, Moves.MUD_SLAP ], @@ -5737,18 +5739,18 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.FLYGON]: [ [ EVOLVE_MOVE, Moves.DRAGON_CLAW ], + [ RELEARN_MOVE, Moves.BITE ], + [ RELEARN_MOVE, Moves.FISSURE ], + [ RELEARN_MOVE, Moves.DIG ], + [ RELEARN_MOVE, Moves.CRUNCH ], + [ RELEARN_MOVE, Moves.SUPERPOWER ], + [ RELEARN_MOVE, Moves.ASTONISH ], + [ RELEARN_MOVE, Moves.DRAGON_DANCE ], + [ RELEARN_MOVE, Moves.FEINT ], [ 1, Moves.DRAGON_BREATH ], [ 1, Moves.BULLDOZE ], [ 1, Moves.SAND_ATTACK ], [ 1, Moves.SUPERSONIC ], - [ 1, Moves.BITE ], - [ 1, Moves.FISSURE ], - [ 1, Moves.DIG ], - [ 1, Moves.CRUNCH ], - [ 1, Moves.SUPERPOWER ], - [ 1, Moves.ASTONISH ], - [ 1, Moves.DRAGON_DANCE ], - [ 1, Moves.FEINT ], [ 1, Moves.BIDE ], [ 1, Moves.FEINT_ATTACK ], [ 12, Moves.MUD_SLAP ], @@ -6526,12 +6528,12 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.METAGROSS]: [ [ EVOLVE_MOVE, Moves.HAMMER_ARM ], + [ RELEARN_MOVE, Moves.EXPLOSION ], + [ RELEARN_MOVE, Moves.HONE_CLAWS ], [ 1, Moves.CONFUSION ], [ 1, Moves.METAL_CLAW ], [ 1, Moves.BULLET_PUNCH ], [ 1, Moves.TACKLE ], - [ 1, Moves.EXPLOSION ], - [ 1, Moves.HONE_CLAWS ], [ 6, Moves.ZEN_HEADBUTT ], [ 12, Moves.MAGNET_RISE ], [ 16, Moves.FLASH_CANNON ], @@ -6796,6 +6798,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.INFERNAPE]: [ [ EVOLVE_MOVE, Moves.CLOSE_COMBAT ], + [ RELEARN_MOVE, Moves.TAUNT ], + [ RELEARN_MOVE, Moves.SLACK_OFF ], [ 1, Moves.SCRATCH ], [ 1, Moves.LEER ], [ 1, Moves.EMBER ], @@ -7082,6 +7086,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.BASTIODON]: [ [ EVOLVE_MOVE, Moves.BLOCK ], + [ RELEARN_MOVE, Moves.WIDE_GUARD ], [ 1, Moves.TACKLE ], [ 1, Moves.PROTECT ], [ 1, Moves.TAUNT ], @@ -8066,6 +8071,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.LIFE_DEW ], ], [Species.YANMEGA]: [ + [ RELEARN_MOVE, Moves.HYPNOSIS ], [ 1, Moves.TACKLE ], [ 1, Moves.DOUBLE_TEAM ], [ 1, Moves.NIGHT_SLASH ], @@ -8311,6 +8317,16 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 55, Moves.UPROAR ], ], [Species.UXIE]: [ + [ RELEARN_MOVE, Moves.TRI_ATTACK ], + [ RELEARN_MOVE, Moves.SNORE ], + [ RELEARN_MOVE, Moves.SAFEGUARD ], + [ RELEARN_MOVE, Moves.IRON_TAIL ], + [ RELEARN_MOVE, Moves.PSYCHO_CUT ], + [ RELEARN_MOVE, Moves.WONDER_ROOM ], + [ RELEARN_MOVE, Moves.MAGIC_ROOM ], + [ RELEARN_MOVE, Moves.ROUND ], + [ RELEARN_MOVE, Moves.ALLY_SWITCH ], + [ RELEARN_MOVE, Moves.EXPANDING_FORCE ], [ 1, Moves.CONFUSION ], [ 1, Moves.REST ], [ 7, Moves.SWIFT ], @@ -8327,6 +8343,16 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 84, Moves.MYSTICAL_POWER ], ], [Species.MESPRIT]: [ + [ RELEARN_MOVE, Moves.TRI_ATTACK ], + [ RELEARN_MOVE, Moves.SNORE ], + [ RELEARN_MOVE, Moves.SAFEGUARD ], + [ RELEARN_MOVE, Moves.IRON_TAIL ], + [ RELEARN_MOVE, Moves.PSYCHO_CUT ], + [ RELEARN_MOVE, Moves.WONDER_ROOM ], + [ RELEARN_MOVE, Moves.MAGIC_ROOM ], + [ RELEARN_MOVE, Moves.ROUND ], + [ RELEARN_MOVE, Moves.ALLY_SWITCH ], + [ RELEARN_MOVE, Moves.EXPANDING_FORCE ], [ 1, Moves.CONFUSION ], [ 1, Moves.REST ], [ 7, Moves.SWIFT ], @@ -8343,6 +8369,19 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 84, Moves.MYSTICAL_POWER ], ], [Species.AZELF]: [ + [ RELEARN_MOVE, Moves.SELF_DESTRUCT ], + [ RELEARN_MOVE, Moves.TRI_ATTACK ], + [ RELEARN_MOVE, Moves.SNORE ], + [ RELEARN_MOVE, Moves.SAFEGUARD ], + [ RELEARN_MOVE, Moves.IRON_TAIL ], + [ RELEARN_MOVE, Moves.PAYBACK ], + [ RELEARN_MOVE, Moves.ASSURANCE ], + [ RELEARN_MOVE, Moves.PSYCHO_CUT ], + [ RELEARN_MOVE, Moves.WONDER_ROOM ], + [ RELEARN_MOVE, Moves.MAGIC_ROOM ], + [ RELEARN_MOVE, Moves.ROUND ], + [ RELEARN_MOVE, Moves.ALLY_SWITCH ], + [ RELEARN_MOVE, Moves.EXPANDING_FORCE ], [ 1, Moves.CONFUSION ], [ 1, Moves.REST ], [ 7, Moves.SWIFT ], @@ -8633,12 +8672,12 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 52, Moves.FLARE_BLITZ ], ], [Species.EMBOAR]: [ + [ RELEARN_MOVE, Moves.ENDURE ], + [ RELEARN_MOVE, Moves.HAMMER_ARM ], [ 1, Moves.TACKLE ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.EMBER ], [ 1, Moves.ARM_THRUST ], - [ 1, Moves.ENDURE ], - [ 1, Moves.HAMMER_ARM ], [ 13, Moves.DEFENSE_CURL ], [ 15, Moves.FLAME_CHARGE ], [ 20, Moves.SMOG ], @@ -9300,6 +9339,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.LEAVANNY]: [ [ EVOLVE_MOVE, Moves.SLASH ], + [ RELEARN_MOVE, Moves.BUG_BITE ], [ 1, Moves.TACKLE ], [ 1, Moves.RAZOR_LEAF ], [ 1, Moves.STRING_SHOT ], @@ -9864,21 +9904,21 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.CINCCINO]: [ [ EVOLVE_MOVE, Moves.TAIL_SLAP ], + [ RELEARN_MOVE, Moves.SLAM ], + [ RELEARN_MOVE, Moves.SWIFT ], + [ RELEARN_MOVE, Moves.ENCORE ], + [ RELEARN_MOVE, Moves.HELPING_HAND ], + [ RELEARN_MOVE, Moves.HYPER_VOICE ], + [ RELEARN_MOVE, Moves.TICKLE ], + [ RELEARN_MOVE, Moves.ROCK_BLAST ], + [ RELEARN_MOVE, Moves.LAST_RESORT ], + [ RELEARN_MOVE, Moves.AFTER_YOU ], + [ RELEARN_MOVE, Moves.ECHOED_VOICE ], + [ RELEARN_MOVE, Moves.BABY_DOLL_EYES ], [ 1, Moves.BULLET_SEED ], [ 1, Moves.SING ], [ 1, Moves.CHARM ], [ 1, Moves.POUND ], - [ 1, Moves.SLAM ], - [ 1, Moves.SWIFT ], - [ 1, Moves.ENCORE ], - [ 1, Moves.HELPING_HAND ], - [ 1, Moves.HYPER_VOICE ], - [ 1, Moves.TICKLE ], - [ 1, Moves.ROCK_BLAST ], - [ 1, Moves.LAST_RESORT ], - [ 1, Moves.AFTER_YOU ], - [ 1, Moves.ECHOED_VOICE ], - [ 1, Moves.BABY_DOLL_EYES ], ], [Species.GOTHITA]: [ [ 1, Moves.POUND ], @@ -10738,10 +10778,10 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 56, Moves.DYNAMIC_PUNCH ], ], [Species.GOLURK]: [ + [ RELEARN_MOVE, Moves.MUD_SLAP ], + [ RELEARN_MOVE, Moves.FOCUS_PUNCH ], [ 1, Moves.POUND ], [ 1, Moves.DEFENSE_CURL ], - [ 1, Moves.MUD_SLAP ], - [ 1, Moves.FOCUS_PUNCH ], [ 1, Moves.ASTONISH ], [ 1, Moves.HIGH_HORSEPOWER ], [ 12, Moves.SHADOW_PUNCH ], @@ -11045,6 +11085,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 70, Moves.CLOSE_COMBAT ], ], [Species.VIRIZION]: [ + [ RELEARN_MOVE, Moves.TAKE_DOWN ], [ 1, Moves.LEER ], [ 1, Moves.QUICK_ATTACK ], [ 1, Moves.HELPING_HAND ], @@ -12543,13 +12584,13 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.INCINEROAR]: [ [ EVOLVE_MOVE, Moves.DARKEST_LARIAT ], - [ 1, Moves.SCRATCH ], - [ 1, Moves.GROWL ], + [ RELEARN_MOVE, Moves.SCRATCH ], + [ RELEARN_MOVE, Moves.GROWL ], + [ RELEARN_MOVE, Moves.THROAT_CHOP ], [ 1, Moves.EMBER ], [ 1, Moves.LICK ], [ 1, Moves.CROSS_CHOP ], [ 1, Moves.BULK_UP ], - [ 1, Moves.THROAT_CHOP ], [ 9, Moves.ROAR ], [ 12, Moves.FURY_SWIPES ], [ 15, Moves.BITE ], @@ -12626,11 +12667,11 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 37, Moves.HYPER_VOICE ], ], [Species.TRUMBEAK]: [ + [ RELEARN_MOVE, Moves.ECHOED_VOICE ], [ 1, Moves.GROWL ], [ 1, Moves.PECK ], [ 1, Moves.ROCK_SMASH ], [ 1, Moves.ROCK_BLAST ], - [ 1, Moves.ECHOED_VOICE ], [ 13, Moves.SUPERSONIC ], [ 16, Moves.PLUCK ], [ 21, Moves.ROOST ], @@ -12720,16 +12761,16 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.VIKAVOLT]: [ [ EVOLVE_MOVE, Moves.THUNDERBOLT ], + [ RELEARN_MOVE, Moves.VISE_GRIP ], + [ RELEARN_MOVE, Moves.DIG ], + [ RELEARN_MOVE, Moves.MUD_SLAP ], + [ RELEARN_MOVE, Moves.IRON_DEFENSE ], + [ RELEARN_MOVE, Moves.X_SCISSOR ], + [ RELEARN_MOVE, Moves.BUG_BITE ], [ 1, Moves.CHARGE ], [ 1, Moves.CRUNCH ], [ 1, Moves.DISCHARGE ], [ 1, Moves.STRING_SHOT ], - [ 1, Moves.VISE_GRIP ], - [ 1, Moves.DIG ], - [ 1, Moves.MUD_SLAP ], - [ 1, Moves.IRON_DEFENSE ], - [ 1, Moves.X_SCISSOR ], - [ 1, Moves.BUG_BITE ], [ 15, Moves.BITE ], [ 23, Moves.SPARK ], [ 29, Moves.STICKY_WEB ], @@ -13473,6 +13514,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.KOMMO_O]: [ [ EVOLVE_MOVE, Moves.CLANGING_SCALES ], + [ RELEARN_MOVE, Moves.BELLY_DRUM ], [ 1, Moves.TACKLE ], [ 1, Moves.LEER ], [ 1, Moves.PROTECT ], @@ -14411,6 +14453,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 51, Moves.SAND_TOMB ], ], [Species.CRAMORANT]: [ + [ RELEARN_MOVE, Moves.BELCH ], [ 1, Moves.PECK ], [ 1, Moves.STOCKPILE ], [ 1, Moves.SPIT_UP ], @@ -15437,6 +15480,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.MEOWSCARADA]: [ [ EVOLVE_MOVE, Moves.FLOWER_TRICK ], + [ RELEARN_MOVE, Moves.DOUBLE_TEAM ], + [ RELEARN_MOVE, Moves.TRICK ], [ 1, Moves.SCRATCH ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.LEAFAGE ], @@ -15487,6 +15532,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.SKELEDIRGE]: [ [ EVOLVE_MOVE, Moves.TORCH_SONG ], + [ RELEARN_MOVE, Moves.SING ], + [ RELEARN_MOVE, Moves.YAWN ], [ 1, Moves.TACKLE ], [ 1, Moves.LEER ], [ 1, Moves.EMBER ], @@ -15538,6 +15585,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.QUAQUAVAL]: [ [ EVOLVE_MOVE, Moves.AQUA_STEP ], + [ RELEARN_MOVE, Moves.COUNTER ], [ 1, Moves.POUND ], [ 1, Moves.GROWL ], [ 1, Moves.WATER_GUN ], @@ -15937,13 +15985,13 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.CERULEDGE]: [ [ EVOLVE_MOVE, Moves.SHADOW_CLAW ], + [ RELEARN_MOVE, Moves.NIGHT_SLASH ], + [ RELEARN_MOVE, Moves.SHADOW_SNEAK ], + [ RELEARN_MOVE, Moves.QUICK_GUARD ], + [ RELEARN_MOVE, Moves.SOLAR_BLADE ], [ 1, Moves.EMBER ], [ 1, Moves.LEER ], [ 1, Moves.ASTONISH ], - [ 1, Moves.NIGHT_SLASH ], - [ 1, Moves.SHADOW_SNEAK ], - [ 1, Moves.QUICK_GUARD ], - [ 1, Moves.SOLAR_BLADE ], [ 8, Moves.CLEAR_SMOG ], [ 12, Moves.FIRE_SPIN ], [ 16, Moves.WILL_O_WISP ], @@ -16224,6 +16272,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.RABSCA]: [ [ EVOLVE_MOVE, Moves.REVIVAL_BLESSING ], + [ RELEARN_MOVE, Moves.SAFEGUARD ], + [ RELEARN_MOVE, Moves.PSYCH_UP ], [ 1, Moves.TACKLE ], [ 1, Moves.CONFUSION ], [ 1, Moves.DEFENSE_CURL ], @@ -16756,6 +16806,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 91, Moves.HEADLONG_RUSH ], ], [Species.SCREAM_TAIL]: [ + [ RELEARN_MOVE, Moves.SUNNY_DAY ], [ 1, Moves.POUND ], [ 1, Moves.SING ], [ 1, Moves.DISABLE ], @@ -16774,6 +16825,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 91, Moves.BOOMBURST ], ], [Species.BRUTE_BONNET]: [ + [ RELEARN_MOVE, Moves.SUNNY_DAY ], [ 1, Moves.ABSORB ], [ 1, Moves.GROWTH ], [ 1, Moves.ASTONISH ], @@ -16791,6 +16843,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 91, Moves.SOLAR_BEAM ], ], [Species.FLUTTER_MANE]: [ + [ RELEARN_MOVE, Moves.SUNNY_DAY ], [ 1, Moves.CONFUSE_RAY ], [ 1, Moves.SPITE ], [ 1, Moves.ASTONISH ], @@ -16809,6 +16862,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 91, Moves.PERISH_SONG ], ], [Species.SLITHER_WING]: [ + [ RELEARN_MOVE, Moves.SUNNY_DAY ], [ 1, Moves.GUST ], [ 1, Moves.EMBER ], [ 1, Moves.BUG_BITE ], @@ -16828,6 +16882,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 91, Moves.THRASH ], ], [Species.SANDY_SHOCKS]: [ + [ RELEARN_MOVE, Moves.SUNNY_DAY ], [ 1, Moves.SUPERSONIC ], [ 1, Moves.THUNDER_SHOCK ], [ 1, Moves.THUNDER_WAVE ], @@ -16865,6 +16920,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 91, Moves.STEEL_ROLLER ], ], [Species.IRON_BUNDLE]: [ + [ RELEARN_MOVE, Moves.ELECTRIC_TERRAIN ], [ 1, Moves.PRESENT ], [ 1, Moves.WATER_GUN ], //Custom [ 7, Moves.POWDER_SNOW ], @@ -16882,6 +16938,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 91, Moves.BLIZZARD ], ], [Species.IRON_HANDS]: [ + [ RELEARN_MOVE, Moves.ELECTRIC_TERRAIN ], [ 1, Moves.SAND_ATTACK ], [ 1, Moves.TACKLE ], [ 1, Moves.FOCUS_ENERGY ], @@ -16901,6 +16958,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 91, Moves.FOCUS_PUNCH ], ], [Species.IRON_JUGULIS]: [ + [ RELEARN_MOVE, Moves.ELECTRIC_TERRAIN ], [ 1, Moves.FOCUS_ENERGY ], [ 1, Moves.TRI_ATTACK ], [ 1, Moves.AIR_CUTTER ], @@ -16920,6 +16978,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 91, Moves.HYPER_BEAM ], ], [Species.IRON_MOTH]: [ + [ RELEARN_MOVE, Moves.ELECTRIC_TERRAIN ], [ 1, Moves.GUST ], [ 1, Moves.WHIRLWIND ], [ 1, Moves.EMBER ], @@ -16939,6 +16998,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 91, Moves.OVERHEAT ], ], [Species.IRON_THORNS]: [ + [ RELEARN_MOVE, Moves.ELECTRIC_TERRAIN ], [ 1, Moves.ROCK_THROW ], [ 1, Moves.IRON_DEFENSE ], [ 1, Moves.THUNDER_FANG ], @@ -17106,6 +17166,10 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 75, Moves.OVERHEAT ], ], [Species.ROARING_MOON]: [ + [ RELEARN_MOVE, Moves.SUNNY_DAY ], + [ RELEARN_MOVE, Moves.JAW_LOCK ], + [ RELEARN_MOVE, Moves.BREAKING_SWIPE ], + [ RELEARN_MOVE, Moves.SCALE_SHOT ], [ 1, Moves.LEER ], [ 1, Moves.BITE ], [ 1, Moves.FOCUS_ENERGY ], @@ -17125,6 +17189,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 91, Moves.DOUBLE_EDGE ], ], [Species.IRON_VALIANT]: [ + [ RELEARN_MOVE, Moves.ELECTRIC_TERRAIN ], [ 1, Moves.DISABLE ], [ 1, Moves.DOUBLE_TEAM ], [ 1, Moves.FURY_CUTTER ], @@ -17222,11 +17287,11 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.DIPPLIN]: [ [ EVOLVE_MOVE, Moves.DOUBLE_HIT ], + [ RELEARN_MOVE, Moves.INFESTATION ], [ 1, Moves.WITHDRAW ], [ 1, Moves.SWEET_SCENT ], [ 1, Moves.RECYCLE ], [ 1, Moves.ASTONISH ], - [ 1, Moves.INFESTATION ], [ 4, Moves.DRAGON_TAIL ], [ 8, Moves.GROWTH ], [ 12, Moves.DRAGON_BREATH ], @@ -17315,6 +17380,10 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 72, Moves.MOONBLAST ], ], [Species.OGERPON]: [ + [ RELEARN_MOVE, Moves.DOUBLE_KICK ], + [ RELEARN_MOVE, Moves.COUNTER ], + [ RELEARN_MOVE, Moves.RETALIATE ], + [ RELEARN_MOVE, Moves.HORN_LEECH ], [ 1, Moves.VINE_WHIP ], [ 1, Moves.LEECH_SEED ], [ 1, Moves.QUICK_ATTACK ], @@ -17349,13 +17418,13 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.HYDRAPPLE]: [ [ EVOLVE_MOVE, Moves.FICKLE_BEAM ], + [ RELEARN_MOVE, Moves.YAWN ], + [ RELEARN_MOVE, Moves.DOUBLE_HIT ], + [ RELEARN_MOVE, Moves.INFESTATION ], [ 1, Moves.WITHDRAW ], [ 1, Moves.SWEET_SCENT ], [ 1, Moves.RECYCLE ], [ 1, Moves.ASTONISH ], - [ 1, Moves.YAWN ], - [ 1, Moves.DOUBLE_HIT ], - [ 1, Moves.INFESTATION ], [ 4, Moves.DRAGON_TAIL ], [ 8, Moves.GROWTH ], [ 12, Moves.DRAGON_BREATH ], @@ -17463,6 +17532,9 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 90, Moves.GYRO_BALL ], ], [Species.PECHARUNT]: [ + [ RELEARN_MOVE, Moves.DEFENSE_CURL ], + [ RELEARN_MOVE, Moves.ROLLOUT ], + [ RELEARN_MOVE, Moves.MEAN_LOOK ], [ 1, Moves.SMOG ], [ 1, Moves.POISON_GAS ], [ 1, Moves.MEMENTO ], @@ -17555,25 +17627,25 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.ALOLA_SANDSLASH]: [ [ EVOLVE_MOVE, Moves.ICICLE_SPEAR ], + [ RELEARN_MOVE, Moves.SCRATCH ], + [ RELEARN_MOVE, Moves.MIST ], + [ RELEARN_MOVE, Moves.BLIZZARD ], + [ RELEARN_MOVE, Moves.DEFENSE_CURL ], + [ RELEARN_MOVE, Moves.SWIFT ], + [ RELEARN_MOVE, Moves.FURY_SWIPES ], + [ RELEARN_MOVE, Moves.POWDER_SNOW ], + [ RELEARN_MOVE, Moves.ROLLOUT ], + [ RELEARN_MOVE, Moves.FURY_CUTTER ], + [ RELEARN_MOVE, Moves.RAPID_SPIN ], + [ RELEARN_MOVE, Moves.IRON_DEFENSE ], + [ RELEARN_MOVE, Moves.GYRO_BALL ], + [ RELEARN_MOVE, Moves.METAL_BURST ], + [ RELEARN_MOVE, Moves.IRON_HEAD ], + [ RELEARN_MOVE, Moves.SNOWSCAPE ], [ 1, Moves.ICICLE_CRASH ], [ 1, Moves.METAL_CLAW ], [ 1, Moves.SLASH ], [ 1, Moves.SWORDS_DANCE ], - [ 1, Moves.SCRATCH ], - [ 1, Moves.MIST ], - [ 1, Moves.BLIZZARD ], - [ 1, Moves.DEFENSE_CURL ], - [ 1, Moves.SWIFT ], - [ 1, Moves.FURY_SWIPES ], - [ 1, Moves.POWDER_SNOW ], - [ 1, Moves.ROLLOUT ], - [ 1, Moves.FURY_CUTTER ], - [ 1, Moves.RAPID_SPIN ], - [ 1, Moves.IRON_DEFENSE ], - [ 1, Moves.GYRO_BALL ], - [ 1, Moves.METAL_BURST ], - [ 1, Moves.IRON_HEAD ], - [ 1, Moves.SNOWSCAPE ], [ 1, Moves.ICE_BALL ], ], [Species.ALOLA_VULPIX]: [ @@ -17595,22 +17667,22 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.ALOLA_NINETALES]: [ [ EVOLVE_MOVE, Moves.DAZZLING_GLEAM ], + [ RELEARN_MOVE, Moves.DISABLE ], + [ RELEARN_MOVE, Moves.MIST ], + [ RELEARN_MOVE, Moves.ICE_BEAM ], + [ RELEARN_MOVE, Moves.AURORA_BEAM ], + [ RELEARN_MOVE, Moves.CONFUSE_RAY ], + [ RELEARN_MOVE, Moves.SPITE ], + [ RELEARN_MOVE, Moves.POWDER_SNOW ], + [ RELEARN_MOVE, Moves.EXTRASENSORY ], + [ RELEARN_MOVE, Moves.NASTY_PLOT ], + [ RELEARN_MOVE, Moves.ICE_SHARD ], + [ RELEARN_MOVE, Moves.FREEZE_DRY ], + [ RELEARN_MOVE, Moves.AURORA_VEIL ], [ 1, Moves.ICY_WIND ], [ 1, Moves.IMPRISON ], [ 1, Moves.BLIZZARD ], [ 1, Moves.TAIL_WHIP ], - [ 1, Moves.DISABLE ], - [ 1, Moves.MIST ], - [ 1, Moves.ICE_BEAM ], - [ 1, Moves.AURORA_BEAM ], - [ 1, Moves.CONFUSE_RAY ], - [ 1, Moves.SPITE ], - [ 1, Moves.POWDER_SNOW ], - [ 1, Moves.EXTRASENSORY ], - [ 1, Moves.NASTY_PLOT ], - [ 1, Moves.ICE_SHARD ], - [ 1, Moves.FREEZE_DRY ], - [ 1, Moves.AURORA_VEIL ], ], [Species.ALOLA_DIGLETT]: [ [ 1, Moves.SAND_ATTACK ], @@ -17771,6 +17843,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.ALOLA_EXEGGUTOR]: [ [ EVOLVE_MOVE, Moves.DRAGON_HAMMER ], + [ RELEARN_MOVE, Moves.GROWTH ], [ 1, Moves.BARRAGE ], [ 1, Moves.SEED_BOMB ], [ 1, Moves.PSYSHOCK ], @@ -17789,7 +17862,6 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.HYPNOSIS ], [ 1, Moves.REFLECT ], [ 1, Moves.LEECH_SEED ], - [ 1, Moves.GROWTH ], ], [Species.ALOLA_MAROWAK]: [ [ EVOLVE_MOVE, Moves.SHADOW_BONE ], @@ -18043,6 +18115,9 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.GALAR_SLOWKING]: [ [ EVOLVE_MOVE, Moves.EERIE_SPELL ], + [ RELEARN_MOVE, Moves.FUTURE_SIGHT ], + [ RELEARN_MOVE, Moves.CHILLY_RECEPTION ], + [ RELEARN_MOVE, Moves.TOXIC ], [ 1, Moves.POWER_GEM ], [ 1, Moves.NASTY_PLOT ], [ 1, Moves.SWAGGER ], @@ -18050,9 +18125,6 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.CURSE ], [ 1, Moves.GROWL ], [ 1, Moves.ACID ], - [ 1, Moves.TOXIC ], - [ 1, Moves.FUTURE_SIGHT ], - [ 1, Moves.CHILLY_RECEPTION ], [ 9, Moves.YAWN ], [ 12, Moves.CONFUSION ], [ 15, Moves.DISABLE ], @@ -18523,11 +18595,11 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 40, Moves.EARTHQUAKE ], ], [Species.BLOODMOON_URSALUNA]: [ + [ RELEARN_MOVE, Moves.MOONLIGHT ], [ 1, Moves.HEADLONG_RUSH ], [ 1, Moves.SCRATCH ], [ 1, Moves.LEER ], [ 1, Moves.LICK ], - [ 1, Moves.MOONLIGHT ], [ 8, Moves.FURY_SWIPES ], [ 13, Moves.PAYBACK ], [ 17, Moves.HARDEN ], diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index 26af9155687..661a7017f24 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -147,7 +147,7 @@ export abstract class PokemonSpeciesForm { this.height = height; this.weight = weight; this.ability1 = ability1; - this.ability2 = ability2; + this.ability2 = ability2 === Abilities.NONE ? ability1 : ability2; this.abilityHidden = abilityHidden; this.baseTotal = baseTotal; this.baseStats = [ baseHp, baseAtk, baseDef, baseSpatk, baseSpdef, baseSpd ]; @@ -177,12 +177,29 @@ export abstract class PokemonSpeciesForm { return this.type1 === type || (this.type2 !== null && this.type2 === type); } + /** + * Method to get the total number of abilities a Pokemon species has. + * @returns Number of abilities + */ getAbilityCount(): integer { - return this.ability2 ? this.abilityHidden ? 3 : 2 : this.abilityHidden ? 2 : 1; + return this.abilityHidden !== Abilities.NONE ? 3 : 2; } + /** + * Method to get the ability of a Pokemon species. + * @param abilityIndex Which ability to get (should only be 0-2) + * @returns The id of the Ability + */ getAbility(abilityIndex: integer): Abilities { - return !abilityIndex ? this.ability1 : abilityIndex === 1 && this.ability2 ? this.ability2 : this.abilityHidden; + let ret: Abilities; + if (abilityIndex === 0) { + ret = this.ability1; + } else if (abilityIndex === 1) { + ret = this.ability2; + } else { + ret = this.abilityHidden; + } + return ret; } getLevelMoves(): LevelMoves { @@ -605,20 +622,24 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali getName(formIndex?: integer): string { if (formIndex !== undefined && this.forms.length) { const form = this.forms[formIndex]; + let key: string; switch (form.formKey) { case SpeciesFormKey.MEGA: case SpeciesFormKey.PRIMAL: case SpeciesFormKey.ETERNAMAX: - return `${form.formName} ${this.name}`; case SpeciesFormKey.MEGA_X: - return `Mega ${this.name} X`; case SpeciesFormKey.MEGA_Y: - return `Mega ${this.name} Y`; + key = form.formKey; + break; default: if (form.formKey.indexOf(SpeciesFormKey.GIGANTAMAX) > -1) { - return `G-Max ${this.name}`; + key = "gigantamax"; } } + + if (key) { + return i18next.t(`pokemonForm:${key}`, {pokemonName: this.name}); + } } return this.name; } @@ -829,7 +850,14 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali } hasVariants() { - return variantData.hasOwnProperty(this.speciesId); + let variantDataIndex: string | number = this.speciesId; + if (this.forms.length > 0) { + const formKey = this.forms[this.formIndex]?.formKey; + if (formKey) { + variantDataIndex = `${variantDataIndex}-${formKey}`; + } + } + return variantData.hasOwnProperty(variantDataIndex) || variantData.hasOwnProperty(this.speciesId); } getFormSpriteKey(formIndex?: integer) { diff --git a/src/data/pokemon-stat.ts b/src/data/pokemon-stat.ts index a6bf77b1daa..16570785a62 100644 --- a/src/data/pokemon-stat.ts +++ b/src/data/pokemon-stat.ts @@ -1,16 +1,10 @@ +import { Stat } from "#enums/stat"; import i18next from "i18next"; -export enum Stat { - HP = 0, - ATK, - DEF, - SPATK, - SPDEF, - SPD -} +export { Stat }; export function getStatName(stat: Stat, shorten: boolean = false) { - let ret: string; + let ret: string = ""; switch (stat) { case Stat.HP: ret = !shorten ? i18next.t("pokemonInfo:Stat.HP") : i18next.t("pokemonInfo:Stat.HPshortened"); diff --git a/src/data/splash-messages.ts b/src/data/splash-messages.ts index bd64456c993..8e95bba0591 100644 --- a/src/data/splash-messages.ts +++ b/src/data/splash-messages.ts @@ -6,7 +6,7 @@ export function getBattleCountSplashMessage(): string { export function getSplashMessages(): string[] { const splashMessages = Array(10).fill(getBattleCountSplashMessage()); - splashMessages.push(...[ + splashMessages.push( i18next.t("splashMessages:joinTheDiscord"), i18next.t("splashMessages:infiniteLevels"), i18next.t("splashMessages:everythingStacks"), @@ -39,7 +39,8 @@ export function getSplashMessages(): string[] { i18next.t("splashMessages:alsoTryRadicalRed"), i18next.t("splashMessages:eeveeExpo"), i18next.t("splashMessages:ynoproject"), - ]); + i18next.t("splashMessages:breedersInSpace"), + ); return splashMessages; } diff --git a/src/data/status-effect.ts b/src/data/status-effect.ts index 5949fb2f130..65caf58ccb9 100644 --- a/src/data/status-effect.ts +++ b/src/data/status-effect.ts @@ -1,16 +1,8 @@ import * as Utils from "../utils"; +import { StatusEffect } from "#enums/status-effect"; import i18next, { ParseKeys } from "i18next"; -export enum StatusEffect { - NONE, - POISON, - TOXIC, - PARALYSIS, - SLEEP, - FREEZE, - BURN, - FAINT -} +export { StatusEffect }; export class Status { public effect: StatusEffect; diff --git a/src/data/terrain.ts b/src/data/terrain.ts index f7324c28b93..507557eaf9f 100644 --- a/src/data/terrain.ts +++ b/src/data/terrain.ts @@ -60,7 +60,8 @@ export class Terrain { if (!move.hasAttr(ProtectAttr)) { const priority = new Utils.IntegerHolder(move.priority); applyAbAttrs(IncrementMovePriorityAbAttr, user, null, move, priority); - return priority.value > 0 && user.getOpponents().filter(o => targets.includes(o.getBattlerIndex())).length > 0; + // Cancels move if the move has positive priority and targets a Pokemon grounded on the Psychic Terrain + return priority.value > 0 && user.getOpponents().filter(o => targets.includes(o.getBattlerIndex()) && o.isGrounded()).length > 0; } } diff --git a/src/data/tms.ts b/src/data/tms.ts index 0a13cef4ee8..761dcdf6be4 100644 --- a/src/data/tms.ts +++ b/src/data/tms.ts @@ -282,9 +282,13 @@ export const tmSpecies: TmSpecies = { Species.MEWTWO, Species.MEW, Species.HOPPIP, + Species.SKIPLOOM, + Species.JUMPLUFF, Species.ESPEON, Species.UMBREON, Species.SLOWKING, + Species.SKITTY, + Species.DELCATTY, Species.MUNCHLAX, Species.RHYPERIOR, Species.LEAFEON, @@ -301,6 +305,7 @@ export const tmSpecies: TmSpecies = { Species.PERRSERKER, Species.INDEEDEE, Species.CALYREX, + Species.ANNIHILAPE, Species.ALOLA_RAICHU, Species.ALOLA_MEOWTH, Species.ALOLA_PERSIAN, @@ -400,11 +405,7 @@ export const tmSpecies: TmSpecies = { Species.REGIROCK, Species.GROUDON, Species.JIRACHI, - [ - Species.DEOXYS, - "", - "speed", - ], + Species.DEOXYS, Species.CHIMCHAR, Species.MONFERNO, Species.INFERNAPE, @@ -459,6 +460,10 @@ export const tmSpecies: TmSpecies = { Species.HOOPA, Species.INCINEROAR, Species.GUMSHOOS, + [ + Species.LYCANROC, + "midnight", + ], Species.KOMMO_O, Species.MARSHADOW, Species.BLACEPHALON, @@ -603,11 +608,7 @@ export const tmSpecies: TmSpecies = { Species.REGICE, Species.REGISTEEL, Species.JIRACHI, - [ - Species.DEOXYS, - "", - "speed", - ], + Species.DEOXYS, Species.BUIZEL, Species.FLOATZEL, Species.AMBIPOM, @@ -807,11 +808,7 @@ export const tmSpecies: TmSpecies = { Species.REGISTEEL, Species.GROUDON, Species.JIRACHI, - [ - Species.DEOXYS, - "", - "speed", - ], + Species.DEOXYS, Species.CHIMCHAR, Species.MONFERNO, Species.INFERNAPE, @@ -877,6 +874,10 @@ export const tmSpecies: TmSpecies = { Species.CRABOMINABLE, Species.STUFFUL, Species.BEWEAR, + [ + Species.LYCANROC, + "midnight", + ], Species.KOMMO_O, Species.TAPU_KOKO, Species.BUZZWOLE, @@ -954,6 +955,8 @@ export const tmSpecies: TmSpecies = { Species.EXEGGUTOR, Species.CUBONE, Species.MAROWAK, + Species.HITMONLEE, + Species.HITMONCHAN, Species.LICKITUNG, Species.RHYHORN, Species.RHYDON, @@ -1078,6 +1081,7 @@ export const tmSpecies: TmSpecies = { Species.LILLIGANT, Species.DWEBBLE, Species.CRUSTLE, + Species.SCRAFTY, Species.ZORUA, Species.ZOROARK, Species.SAWSBUCK, @@ -2026,6 +2030,7 @@ export const tmSpecies: TmSpecies = { Species.PUPITAR, Species.TYRANITAR, Species.LUGIA, + Species.HO_OH, Species.TREECKO, Species.GROVYLE, Species.SCEPTILE, @@ -2146,6 +2151,7 @@ export const tmSpecies: TmSpecies = { Species.LUXRAY, Species.ROSERADE, Species.SHIELDON, + Species.BASTIODON, Species.FLOATZEL, Species.SHELLOS, Species.GASTRODON, @@ -2188,8 +2194,15 @@ export const tmSpecies: TmSpecies = { Species.GIRATINA, Species.CRESSELIA, Species.ARCEUS, + Species.SERPERIOR, Species.TEPIG, + Species.PIGNITE, + Species.EMBOAR, Species.SAMUROTT, + Species.BLITZLE, + Species.ZEBSTRIKA, + Species.DRILBUR, + Species.EXCADRILL, Species.AUDINO, Species.CONKELDURR, Species.THROH, @@ -2197,11 +2210,13 @@ export const tmSpecies: TmSpecies = { Species.KROKOROK, Species.KROOKODILE, Species.DARMANITAN, + Species.SCRAFTY, Species.TIRTOUGA, Species.CARRACOSTA, Species.GARBODOR, Species.ZOROARK, Species.GOTHITELLE, + Species.REUNICLUS, Species.DEERLING, Species.SAWSBUCK, Species.FOONGUS, @@ -2216,6 +2231,7 @@ export const tmSpecies: TmSpecies = { Species.SHELMET, Species.ACCELGOR, Species.DRUDDIGON, + Species.GOLETT, Species.GOLURK, Species.BOUFFALANT, Species.RUFFLET, @@ -2226,9 +2242,15 @@ export const tmSpecies: TmSpecies = { 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.CHESPIN, Species.QUILLADIN, Species.CHESNAUGHT, @@ -2261,18 +2283,17 @@ export const tmSpecies: TmSpecies = { Species.LITTEN, Species.TORRACAT, Species.INCINEROAR, + Species.BRIONNE, + Species.PRIMARINA, Species.GUMSHOOS, Species.CRABRAWLER, Species.CRABOMINABLE, Species.ROCKRUFF, - [ - Species.LYCANROC, - "midday", - "midnight", - ], + Species.LYCANROC, Species.TOXAPEX, Species.MUDBRAY, Species.MUDSDALE, + Species.ARAQUANID, Species.SALAZZLE, Species.BEWEAR, Species.ORANGURU, @@ -2283,10 +2304,12 @@ export const tmSpecies: TmSpecies = { Species.JANGMO_O, Species.HAKAMO_O, Species.KOMMO_O, + Species.SOLGALEO, Species.NIHILEGO, Species.BUZZWOLE, Species.CELESTEELA, Species.GUZZLORD, + Species.NECROZMA, Species.MAGEARNA, Species.STAKATAKA, Species.MELMETAL, @@ -3648,6 +3671,7 @@ export const tmSpecies: TmSpecies = { Species.SPINARAK, Species.ARIADOS, Species.PINECO, + Species.FORRETRESS, Species.QWILFISH, Species.HERACROSS, Species.ZIGZAGOON, @@ -4258,6 +4282,7 @@ export const tmSpecies: TmSpecies = { Species.DEWOTT, Species.SAMUROTT, Species.PANPOUR, + Species.SIMIPOUR, Species.DRILBUR, Species.EXCADRILL, Species.TYMPOLE, @@ -4288,6 +4313,7 @@ export const tmSpecies: TmSpecies = { Species.WISHIWASHI, Species.MAREANIE, Species.TOXAPEX, + Species.DEWPIDER, Species.ARAQUANID, Species.BRUXISH, Species.DRAMPA, @@ -4328,7 +4354,10 @@ export const tmSpecies: TmSpecies = { Species.ROARING_MOON, Species.WALKING_WAKE, Species.HYDRAPPLE, - Species.ROTOM, + [ + Species.ROTOM, + "wash", + ], Species.GALAR_SLOWPOKE, Species.GALAR_SLOWBRO, Species.GALAR_SLOWKING, @@ -5148,7 +5177,10 @@ export const tmSpecies: TmSpecies = { Species.ARCTIBAX, Species.BAXCALIBUR, Species.CHIEN_PAO, - Species.ROTOM, + [ + Species.ROTOM, + "frost", + ], Species.ALOLA_RATTATA, Species.ALOLA_RATICATE, Species.ALOLA_SANDSHREW, @@ -5909,6 +5941,8 @@ export const tmSpecies: TmSpecies = { Species.MACHAMP, Species.PONYTA, Species.RAPIDASH, + Species.DODUO, + Species.DODRIO, Species.DROWZEE, Species.HYPNO, Species.EXEGGUTOR, @@ -6119,6 +6153,229 @@ export const tmSpecies: TmSpecies = { Species.PALDEA_WOOPER, Species.BLOODMOON_URSALUNA, ], + [Moves.COUNTER]: [ + Species.CHARMANDER, + Species.CHARMELEON, + Species.CHARIZARD, + Species.SQUIRTLE, + Species.WARTORTLE, + Species.BLASTOISE, + Species.RATTATA, + Species.RATICATE, + 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.JIGGLYPUFF, + Species.WIGGLYTUFF, + Species.PARAS, + Species.PARASECT, + Species.PSYDUCK, + Species.GOLDUCK, + Species.MANKEY, + Species.PRIMEAPE, + Species.POLIWHIRL, + Species.POLIWRATH, + Species.ABRA, + Species.KADABRA, + Species.ALAKAZAM, + Species.MACHOP, + Species.MACHOKE, + Species.MACHAMP, + Species.GEODUDE, + Species.GRAVELER, + Species.GOLEM, + Species.SLOWPOKE, + Species.SLOWBRO, + Species.GENGAR, + Species.DROWZEE, + Species.HYPNO, + Species.CUBONE, + Species.MAROWAK, + Species.HITMONLEE, + Species.HITMONCHAN, + Species.LICKITUNG, + Species.RHYHORN, + Species.RHYDON, + Species.CHANSEY, + Species.KANGASKHAN, + Species.MR_MIME, + Species.SCYTHER, + Species.JYNX, + Species.ELECTABUZZ, + Species.MAGMAR, + Species.SNORLAX, + Species.MEWTWO, + Species.MEW, + Species.CHIKORITA, + Species.BAYLEEF, + Species.MEGANIUM, + Species.TYPHLOSION, + Species.TOTODILE, + Species.CROCONAW, + Species.FERALIGATR, + Species.LEDYBA, + Species.LEDIAN, + Species.TOGEPI, + Species.TOGETIC, + Species.MAREEP, + Species.FLAAFFY, + Species.AMPHAROS, + Species.SUDOWOODO, + Species.WOOPER, + Species.QUAGSIRE, + Species.WOBBUFFET, + Species.PINECO, + Species.FORRETRESS, + Species.DUNSPARCE, + Species.GLIGAR, + Species.SNUBBULL, + Species.GRANBULL, + Species.HERACROSS, + Species.SNEASEL, + Species.TEDDIURSA, + Species.URSARING, + Species.DELIBIRD, + Species.SKARMORY, + Species.HOUNDOUR, + Species.HOUNDOOM, + Species.PHANPY, + Species.DONPHAN, + Species.MILTANK, + Species.TYRANITAR, + 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.LOTAD, + Species.LOMBRE, + Species.LUDICOLO, + Species.TAILLOW, + Species.SWELLOW, + Species.BRELOOM, + Species.SLAKOTH, + Species.VIGOROTH, + Species.SLAKING, + Species.WHISMUR, + Species.LOUDRED, + Species.EXPLOUD, + Species.MAKUHITA, + Species.HARIYAMA, + Species.SABLEYE, + Species.MAWILE, + Species.AGGRON, + Species.MEDITITE, + Species.MEDICHAM, + Species.PLUSLE, + Species.MINUN, + Species.VOLBEAT, + Species.ILLUMISE, + Species.GULPIN, + Species.SWALOT, + Species.GRUMPIG, + Species.SPINDA, + Species.CACNEA, + Species.CACTURNE, + Species.ZANGOOSE, + Species.CORPHISH, + Species.CRAWDAUNT, + Species.KECLEON, + Species.DUSKULL, + Species.DUSCLOPS, + Species.ABSOL, + Species.REGIROCK, + Species.REGICE, + Species.REGISTEEL, + Species.GROUDON, + Species.DEOXYS, + Species.CHIMCHAR, + Species.MONFERNO, + Species.INFERNAPE, + Species.SHIELDON, + Species.BASTIODON, + Species.RIOLU, + Species.LUCARIO, + Species.SHELLOS, + Species.GASTRODON, + Species.CROAGUNK, + Species.TOXICROAK, + Species.TIMBURR, + Species.GURDURR, + Species.CONKELDURR, + Species.SAWK, + Species.SANDILE, + Species.KROKOROK, + Species.KROOKODILE, + Species.DWEBBLE, + Species.CRUSTLE, + Species.SCRAGGY, + Species.SCRAFTY, + Species.ZORUA, + Species.ZOROARK, + Species.KARRABLAST, + Species.ESCAVALIER, + Species.ACCELGOR, + Species.AXEW, + Species.FRAXURE, + Species.HAXORUS, + Species.FROAKIE, + Species.FROGADIER, + Species.GRENINJA, + Species.GOOMY, + Species.SLIGGOO, + Species.GOODRA, + Species.LYCANROC, + Species.MUDBRAY, + Species.MUDSDALE, + Species.PASSIMIAN, + Species.PYUKUMUKU, + Species.JANGMO_O, + Species.HAKAMO_O, + Species.KOMMO_O, + Species.BUZZWOLE, + Species.MARSHADOW, + Species.SCORBUNNY, + Species.RABOOT, + Species.CINDERACE, + Species.SKWOVET, + Species.GREEDENT, + Species.WOOLOO, + Species.DUBWOOL, + Species.CHEWTLE, + Species.DREDNAW, + Species.FALINKS, + Species.KUBFU, + Species.URSHIFU, + Species.QUAQUAVAL, + Species.TAROUNTULA, + Species.SPIDOPS, + Species.NYMBLE, + Species.LOKIX, + Species.FINIZEN, + Species.PALAFIN, + Species.TATSUGIRI, + Species.KORAIDON, + Species.OKIDOGI, + Species.OGERPON, + Species.IRON_BOULDER, + ], [Moves.STRENGTH]: [ Species.BULBASAUR, Species.IVYSAUR, @@ -6885,6 +7142,7 @@ export const tmSpecies: TmSpecies = { Species.HEATRAN, Species.VICTINI, Species.PANSEAR, + Species.SIMISEAR, Species.DARUMAKA, Species.DARMANITAN, Species.LITWICK, @@ -9950,6 +10208,8 @@ export const tmSpecies: TmSpecies = { Species.ZORUA, Species.ZOROARK, Species.SOLOSIS, + Species.DUOSION, + Species.REUNICLUS, Species.FRILLISH, Species.JELLICENT, Species.LITWICK, @@ -9961,6 +10221,7 @@ export const tmSpecies: TmSpecies = { Species.PHANTUMP, Species.TREVENANT, Species.ROWLET, + Species.DARTRIX, Species.DECIDUEYE, Species.SANDYGAST, Species.PALOSSAND, @@ -10003,6 +10264,7 @@ export const tmSpecies: TmSpecies = { Species.HISUI_ZORUA, Species.HISUI_ZOROARK, Species.HISUI_BRAVIARY, + Species.HISUI_DECIDUEYE, ], [Moves.SCREECH]: [ Species.RATTATA, @@ -11309,6 +11571,7 @@ export const tmSpecies: TmSpecies = { Species.PSYDUCK, Species.GOLDUCK, Species.TENTACOOL, + Species.TENTACRUEL, Species.MAGNEMITE, Species.MAGNETON, Species.GRIMER, @@ -11364,6 +11627,9 @@ export const tmSpecies: TmSpecies = { Species.DUSKULL, Species.DUSCLOPS, Species.CLAMPERL, + Species.HUNTAIL, + Species.GOREBYSS, + Species.JIRACHI, Species.SHINX, Species.LUXIO, Species.LUXRAY, @@ -11375,6 +11641,7 @@ export const tmSpecies: TmSpecies = { Species.MIME_JR, Species.SPIRITOMB, Species.SKORUPI, + Species.DRAPION, Species.FINNEON, Species.LUMINEON, Species.MANTYKE, @@ -11389,17 +11656,23 @@ export const tmSpecies: TmSpecies = { Species.REGIGIGAS, Species.GIRATINA, Species.CRESSELIA, + Species.DARKRAI, Species.ARCEUS, Species.WATCHOG, Species.ZORUA, Species.ZOROARK, Species.SOLOSIS, + Species.DUOSION, + Species.REUNICLUS, Species.FRILLISH, + Species.JELLICENT, Species.EELEKTROSS, Species.LITWICK, Species.LAMPENT, Species.CHANDELURE, Species.CRYOGONAL, + Species.GOLETT, + Species.GOLURK, Species.DELPHOX, Species.VIVILLON, Species.PHANTUMP, @@ -11407,6 +11680,7 @@ export const tmSpecies: TmSpecies = { Species.PUMPKABOO, Species.GOURGEIST, Species.ROWLET, + Species.DARTRIX, Species.DECIDUEYE, Species.MORELULL, Species.SHIINOTIC, @@ -11420,7 +11694,11 @@ export const tmSpecies: TmSpecies = { Species.ORBEETLE, Species.SINISTEA, Species.POLTEAGEIST, + Species.CURSOLA, + Species.MR_RIME, Species.DREEPY, + Species.DRAKLOAK, + Species.DRAGAPULT, Species.ETERNATUS, Species.SPECTRIER, Species.WYRDEER, @@ -11465,6 +11743,7 @@ export const tmSpecies: TmSpecies = { Species.HISUI_ZORUA, Species.HISUI_ZOROARK, Species.HISUI_BRAVIARY, + Species.HISUI_DECIDUEYE, ], [Moves.LIGHT_SCREEN]: [ Species.BULBASAUR, @@ -11796,6 +12075,8 @@ export const tmSpecies: TmSpecies = { ], [Moves.HAZE]: [ Species.SQUIRTLE, + Species.WARTORTLE, + Species.BLASTOISE, Species.EKANS, Species.ARBOK, Species.ZUBAT, @@ -11808,6 +12089,9 @@ export const tmSpecies: TmSpecies = { Species.TENTACOOL, Species.TENTACRUEL, Species.DODUO, + Species.DODRIO, + Species.SEEL, + Species.DEWGONG, Species.GRIMER, Species.MUK, Species.GASTLY, @@ -11816,11 +12100,15 @@ export const tmSpecies: TmSpecies = { Species.DROWZEE, Species.HYPNO, Species.KRABBY, + Species.KINGLER, Species.KOFFING, Species.WEEZING, Species.GOLDEEN, + Species.SEAKING, + Species.LAPRAS, Species.VAPOREON, Species.OMANYTE, + Species.OMASTAR, Species.ARTICUNO, Species.DRATINI, Species.DRAGONAIR, @@ -11830,6 +12118,7 @@ export const tmSpecies: TmSpecies = { Species.NOCTOWL, Species.CROBAT, Species.NATU, + Species.XATU, Species.POLITOED, Species.WOOPER, Species.QUAGSIRE, @@ -11838,6 +12127,7 @@ export const tmSpecies: TmSpecies = { Species.SWINUB, Species.PILOSWINE, Species.REMORAID, + Species.OCTILLERY, Species.DELIBIRD, Species.MANTINE, Species.SURSKIT, @@ -11868,20 +12158,24 @@ export const tmSpecies: TmSpecies = { Species.YAMASK, Species.COFAGRIGUS, Species.TRUBBISH, + Species.GARBODOR, Species.LITWICK, Species.LAMPENT, Species.CHANDELURE, Species.CRYOGONAL, + Species.ZEKROM, Species.GRENINJA, Species.SKRELP, Species.DRAGALGE, Species.AMAURA, + Species.AURORUS, Species.TREVENANT, Species.ZYGARDE, Species.VOLCANION, Species.ROWLET, Species.DARTRIX, Species.DECIDUEYE, + Species.PRIMARINA, Species.MAREANIE, Species.TOXAPEX, Species.TAPU_FINI, @@ -13637,6 +13931,7 @@ export const tmSpecies: TmSpecies = { Species.MAMOSWINE, Species.UXIE, Species.PANSEAR, + Species.SIMISEAR, Species.MUNNA, Species.MUSHARNA, Species.WOOBAT, @@ -15924,6 +16219,8 @@ export const tmSpecies: TmSpecies = { Species.ZIGZAGOON, Species.LINOONE, Species.MAWILE, + Species.PLUSLE, + Species.MINUN, Species.CARVANHA, Species.SHARPEDO, Species.GLALIE, @@ -15945,6 +16242,8 @@ export const tmSpecies: TmSpecies = { Species.SWOOBAT, Species.SCRAGGY, Species.SCRAFTY, + Species.MINCCINO, + Species.CINCCINO, Species.EELEKTRIK, Species.EELEKTROSS, Species.CHESPIN, @@ -18900,6 +19199,7 @@ export const tmSpecies: TmSpecies = { ], [Moves.REVERSAL]: [ Species.RATTATA, + Species.RATICATE, Species.PIKACHU, Species.RAICHU, Species.DIGLETT, @@ -18913,6 +19213,7 @@ export const tmSpecies: TmSpecies = { Species.MACHOKE, Species.MACHAMP, Species.HITMONLEE, + Species.HITMONCHAN, Species.RHYHORN, Species.RHYDON, Species.KANGASKHAN, @@ -18930,6 +19231,8 @@ export const tmSpecies: TmSpecies = { Species.YANMA, Species.PINECO, Species.FORRETRESS, + Species.SNUBBULL, + Species.GRANBULL, Species.QWILFISH, Species.SCIZOR, Species.SHUCKLE, @@ -18938,8 +19241,10 @@ export const tmSpecies: TmSpecies = { Species.SWINUB, Species.PILOSWINE, Species.DELIBIRD, + Species.SKARMORY, Species.HOUNDOUR, Species.HOUNDOOM, + Species.HITMONTOP, Species.MILTANK, Species.ENTEI, Species.TORCHIC, @@ -18968,11 +19273,14 @@ export const tmSpecies: TmSpecies = { Species.LUCARIO, Species.CROAGUNK, Species.TOXICROAK, + Species.WEAVILE, Species.RHYPERIOR, Species.YANMEGA, Species.MAMOSWINE, Species.GALLADE, Species.VICTINI, + Species.PIGNITE, + Species.EMBOAR, Species.LILLIPUP, Species.HERDIER, Species.STOUTLAND, @@ -18983,6 +19291,7 @@ export const tmSpecies: TmSpecies = { Species.SAWK, Species.BASCULIN, Species.DARMANITAN, + Species.SCRAFTY, Species.ESCAVALIER, Species.AXEW, Species.FRAXURE, @@ -19014,6 +19323,11 @@ export const tmSpecies: TmSpecies = { Species.CRABRAWLER, Species.CRABOMINABLE, Species.ORICORIO, + [ + Species.LYCANROC, + "midnight", + "dusk", + ], Species.BEWEAR, Species.PASSIMIAN, Species.SILVALLY, @@ -19070,6 +19384,7 @@ export const tmSpecies: TmSpecies = { Species.OGERPON, Species.GOUGING_FIRE, Species.ALOLA_RATTATA, + Species.ALOLA_RATICATE, Species.ALOLA_RAICHU, Species.ALOLA_DIGLETT, Species.ALOLA_DUGTRIO, @@ -25582,7 +25897,100 @@ export const tmSpecies: TmSpecies = { Species.DRAGAPULT, Species.KUBFU, Species.URSHIFU, + 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.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.FRIGIBAX, + Species.ARCTIBAX, + Species.BAXCALIBUR, + Species.DIPPLIN, + Species.OKIDOGI, + Species.MUNKIDORI, Species.FEZANDIPITI, + Species.OGERPON, + Species.ARCHALUDON, + Species.HYDRAPPLE, + Species.TERAPAGOS, Species.ALOLA_RATTATA, Species.ALOLA_RATICATE, Species.ALOLA_RAICHU, @@ -25618,6 +26026,23 @@ export const tmSpecies: TmSpecies = { Species.GALAR_DARMANITAN, Species.GALAR_YAMASK, Species.GALAR_STUNFISK, + Species.HISUI_GROWLITHE, + Species.HISUI_ARCANINE, + 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.SLEEP_TALK]: [ Species.BULBASAUR, @@ -26515,6 +26940,8 @@ export const tmSpecies: TmSpecies = { Species.FUECOCO, Species.CROCALOR, Species.SKELEDIRGE, + Species.QUAXLY, + Species.QUAXWELL, Species.QUAQUAVAL, Species.LECHONK, Species.OINKOLOGNE, @@ -26591,10 +27018,12 @@ export const tmSpecies: TmSpecies = { 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, @@ -26683,6 +27112,89 @@ export const tmSpecies: TmSpecies = { Species.PALDEA_WOOPER, Species.BLOODMOON_URSALUNA, ], + [Moves.HEAL_BELL]: [ + Species.CLEFAIRY, + Species.CLEFABLE, + Species.JIGGLYPUFF, + Species.WIGGLYTUFF, + Species.LICKITUNG, + Species.CHANSEY, + Species.JYNX, + Species.LAPRAS, + Species.EEVEE, + Species.VAPOREON, + Species.JOLTEON, + Species.FLAREON, + Species.ARTICUNO, + Species.DRAGONITE, + Species.MEW, + Species.CHINCHOU, + Species.LANTURN, + Species.IGGLYBUFF, + Species.TOGEPI, + Species.TOGETIC, + Species.MAREEP, + Species.FLAAFFY, + Species.AMPHAROS, + Species.ESPEON, + Species.UMBREON, + Species.MISDREAVUS, + Species.SNUBBULL, + Species.GRANBULL, + Species.SMOOCHUM, + Species.MILTANK, + Species.BLISSEY, + Species.CELEBI, + Species.POOCHYENA, + Species.MIGHTYENA, + Species.GARDEVOIR, + Species.SKITTY, + Species.DELCATTY, + Species.SPOINK, + Species.GRUMPIG, + Species.SWABLU, + Species.ALTARIA, + Species.CHIMECHO, + Species.KRICKETUNE, + Species.BUNEARY, + Species.LOPUNNY, + Species.MISMAGIUS, + Species.CHINGLING, + Species.HAPPINY, + Species.LICKILICKY, + Species.TOGEKISS, + Species.LEAFEON, + Species.GLACEON, + Species.UXIE, + Species.PHIONE, + Species.MANAPHY, + Species.MUNNA, + Species.MUSHARNA, + Species.AUDINO, + Species.PETILIL, + Species.LILLIGANT, + Species.GOTHITA, + Species.GOTHORITA, + Species.GOTHITELLE, + Species.MELOETTA, + Species.FLABEBE, + Species.FLOETTE, + Species.FLORGES, + Species.ESPURR, + Species.MEOWSTIC, + Species.SPRITZEE, + Species.AROMATISSE, + Species.SWIRLIX, + Species.SLURPUFF, + Species.SYLVEON, + Species.DIANCIE, + Species.COMFEY, + Species.MAGEARNA, + Species.ALOLA_VULPIX, + Species.ALOLA_NINETALES, + Species.HISUI_LILLIGANT, + Species.ETERNAL_FLOETTE, + ], [Moves.RETURN]: [ Species.BULBASAUR, Species.IVYSAUR, @@ -29293,6 +29805,7 @@ export const tmSpecies: TmSpecies = { Species.GREAT_TUSK, Species.IRON_TREADS, Species.IRON_LEAVES, + Species.IRON_BOULDER, Species.GALAR_RAPIDASH, [ Species.CALYREX, @@ -29515,17 +30028,20 @@ export const tmSpecies: TmSpecies = { Species.GENGAR, Species.DROWZEE, Species.HYPNO, + Species.HITMONCHAN, Species.MR_MIME, Species.JYNX, Species.SNORLAX, Species.DRAGONITE, Species.MEW, Species.LEDYBA, + Species.LEDIAN, Species.PICHU, Species.CLEFFA, Species.IGGLYBUFF, Species.TOGEPI, Species.TOGETIC, + Species.BELLOSSOM, Species.MARILL, Species.AZUMARILL, Species.POLITOED, @@ -29537,6 +30053,8 @@ export const tmSpecies: TmSpecies = { Species.WOOPER, Species.QUAGSIRE, Species.WOBBUFFET, + Species.SNUBBULL, + Species.GRANBULL, Species.SHUCKLE, Species.PHANPY, Species.DONPHAN, @@ -29600,6 +30118,8 @@ export const tmSpecies: TmSpecies = { Species.LILLIGANT, Species.DARUMAKA, Species.DARMANITAN, + Species.SCRAGGY, + Species.SCRAFTY, Species.ZORUA, Species.ZOROARK, Species.MINCCINO, @@ -29626,6 +30146,7 @@ export const tmSpecies: TmSpecies = { Species.POPPLIO, Species.BRIONNE, Species.PRIMARINA, + Species.TOUCANNON, Species.SALAZZLE, Species.COMFEY, Species.ORANGURU, @@ -29636,10 +30157,14 @@ export const tmSpecies: TmSpecies = { Species.TOXTRICITY, Species.MR_RIME, Species.ALCREMIE, - Species.INDEEDEE, + [ + Species.INDEEDEE, + "male", + ], Species.ZARUDE, Species.CALYREX, Species.FUECOCO, + Species.CROCALOR, Species.SKELEDIRGE, Species.QUAXLY, Species.QUAXWELL, @@ -29982,8 +30507,13 @@ export const tmSpecies: TmSpecies = { Species.ZACIAN, Species.ZAMAZENTA, Species.ZARUDE, + Species.WYRDEER, + Species.SNEASLER, Species.CYCLIZAR, Species.ORTHWORM, + Species.ANNIHILAPE, + Species.FARIGIRAF, + Species.DUDUNSPARCE, Species.ALOLA_RATTATA, Species.ALOLA_RATICATE, Species.ALOLA_RAICHU, @@ -30003,6 +30533,10 @@ export const tmSpecies: TmSpecies = { Species.GALAR_SLOWKING, Species.GALAR_ZIGZAGOON, Species.GALAR_LINOONE, + Species.HISUI_GROWLITHE, + Species.HISUI_ARCANINE, + Species.HISUI_TYPHLOSION, + Species.HISUI_SLIGGOO, Species.HISUI_GOODRA, ], [Moves.METAL_CLAW]: [ @@ -30111,6 +30645,118 @@ export const tmSpecies: TmSpecies = { Species.HISUI_BRAVIARY, Species.BLOODMOON_URSALUNA, ], + [Moves.SYNTHESIS]: [ + Species.BULBASAUR, + Species.IVYSAUR, + Species.VENUSAUR, + Species.ODDISH, + Species.GLOOM, + Species.VILEPLUME, + Species.PARAS, + Species.PARASECT, + Species.BELLSPROUT, + Species.WEEPINBELL, + Species.VICTREEBEL, + Species.EXEGGCUTE, + Species.EXEGGUTOR, + Species.TANGELA, + Species.MEW, + Species.CHIKORITA, + Species.BAYLEEF, + Species.MEGANIUM, + Species.BELLOSSOM, + Species.HOPPIP, + Species.SKIPLOOM, + Species.JUMPLUFF, + Species.SUNKERN, + Species.SUNFLORA, + Species.CELEBI, + Species.TREECKO, + Species.GROVYLE, + Species.SCEPTILE, + Species.LOTAD, + Species.LOMBRE, + Species.LUDICOLO, + Species.SEEDOT, + Species.NUZLEAF, + Species.SHIFTRY, + Species.SHROOMISH, + Species.BRELOOM, + Species.ROSELIA, + Species.CACNEA, + Species.CACTURNE, + Species.LILEEP, + Species.CRADILY, + Species.TROPIUS, + Species.TURTWIG, + Species.GROTLE, + Species.TORTERRA, + Species.BUDEW, + Species.ROSERADE, + [ + Species.WORMADAM, + "plant", + ], + Species.CHERUBI, + Species.CHERRIM, + Species.CARNIVINE, + Species.SNOVER, + Species.ABOMASNOW, + Species.TANGROWTH, + Species.LEAFEON, + Species.SHAYMIN, + Species.SNIVY, + Species.SERVINE, + Species.SERPERIOR, + Species.PANSAGE, + Species.SIMISAGE, + Species.SEWADDLE, + Species.SWADLOON, + Species.LEAVANNY, + Species.PETILIL, + Species.LILLIGANT, + Species.MARACTUS, + Species.DEERLING, + Species.SAWSBUCK, + Species.FOONGUS, + Species.AMOONGUSS, + Species.VIRIZION, + Species.CHESPIN, + Species.QUILLADIN, + Species.CHESNAUGHT, + Species.FLABEBE, + Species.FLOETTE, + Species.FLORGES, + Species.SKIDDO, + Species.GOGOAT, + Species.PUMPKABOO, + Species.GOURGEIST, + Species.ROWLET, + Species.DARTRIX, + Species.DECIDUEYE, + Species.FOMANTIS, + Species.LURANTIS, + Species.MORELULL, + Species.SHIINOTIC, + Species.BOUNSWEET, + Species.STEENEE, + Species.TSAREENA, + Species.COMFEY, + Species.DHELMISE, + Species.TAPU_BULU, + Species.KARTANA, + Species.GOSSIFLEUR, + Species.ELDEGOSS, + Species.ZARUDE, + Species.SMOLIV, + Species.DOLLIV, + Species.ARBOLIVA, + Species.BRUTE_BONNET, + Species.OGERPON, + Species.ALOLA_EXEGGUTOR, + Species.HISUI_LILLIGANT, + Species.HISUI_DECIDUEYE, + ], [Moves.HIDDEN_POWER]: [ Species.BULBASAUR, Species.IVYSAUR, @@ -32748,8 +33394,11 @@ export const tmSpecies: TmSpecies = { Species.HERDIER, Species.STOUTLAND, Species.PANSAGE, + Species.SIMISAGE, Species.PANSEAR, + Species.SIMISAGE, Species.PANPOUR, + Species.SIMIPOUR, Species.BASCULIN, Species.SANDILE, Species.KROKOROK, @@ -34138,6 +34787,7 @@ export const tmSpecies: TmSpecies = { Species.LOTAD, Species.LOMBRE, Species.LUDICOLO, + Species.WINGULL, Species.PELIPPER, Species.EXPLOUD, Species.MAKUHITA, @@ -34187,17 +34837,25 @@ export const tmSpecies: TmSpecies = { Species.PHIONE, Species.MANAPHY, Species.ARCEUS, + Species.OSHAWOTT, + Species.DEWOTT, + Species.SAMUROTT, Species.BASCULIN, Species.TIRTOUGA, Species.CARRACOSTA, + Species.DUCKLETT, + Species.SWANNA, Species.FRILLISH, Species.JELLICENT, Species.ALOMOMOLA, Species.BARBARACLE, + Species.SKRELP, + Species.DRAGALGE, Species.POPPLIO, Species.BRIONNE, Species.PRIMARINA, Species.WISHIWASHI, + Species.BRUXISH, Species.DHELMISE, Species.TAPU_FINI, Species.SOBBLE, @@ -34214,7 +34872,16 @@ export const tmSpecies: TmSpecies = { Species.EISCUE, Species.DRACOVISH, Species.ARCTOVISH, + Species.BASCULEGION, + Species.QUAXLY, + Species.QUAXWELL, + Species.QUAQUAVAL, + Species.WIGLETT, + Species.WUGTRIO, + Species.PALAFIN, + Species.TATSUGIRI, Species.IRON_BUNDLE, + Species.WALKING_WAKE, Species.GALAR_SLOWPOKE, Species.GALAR_SLOWBRO, Species.GALAR_SLOWKING, @@ -34225,12 +34892,18 @@ export const tmSpecies: TmSpecies = { Species.URSHIFU, "rapid-strike", ], + Species.HISUI_SAMUROTT, + [ + Species.PALDEA_TAUROS, + "aqua", + ], ], [Moves.BEAT_UP]: [ Species.CHARMANDER, Species.CHARMELEON, Species.CHARIZARD, Species.EKANS, + Species.ARBOK, Species.NIDORAN_F, Species.NIDORINA, Species.NIDOQUEEN, @@ -34240,6 +34913,7 @@ export const tmSpecies: TmSpecies = { Species.DIGLETT, Species.DUGTRIO, Species.MANKEY, + Species.PRIMEAPE, Species.KANGASKHAN, Species.MEW, Species.AIPOM, @@ -34283,6 +34957,10 @@ export const tmSpecies: TmSpecies = { Species.TANDEMAUS, Species.MAUSHOLD, Species.BRAMBLIN, + Species.BRAMBLEGHAST, + Species.ANNIHILAPE, + Species.FARIGIRAF, + Species.KINGAMBIT, Species.FEZANDIPITI, Species.PIKACHU, Species.ALOLA_DIGLETT, @@ -36457,6 +37135,7 @@ export const tmSpecies: TmSpecies = { Species.SCEPTILE, Species.COMBUSKEN, Species.BLAZIKEN, + Species.MARSHTOMP, Species.SWAMPERT, Species.LUDICOLO, Species.SHROOMISH, @@ -36547,6 +37226,7 @@ export const tmSpecies: TmSpecies = { Species.GOLETT, Species.GOLURK, Species.HEATMOR, + Species.ZEKROM, Species.MELOETTA, Species.CHESPIN, Species.QUILLADIN, @@ -36573,9 +37253,11 @@ export const tmSpecies: TmSpecies = { Species.ZERAORA, Species.RILLABOOM, Species.GRIMMSNARL, + Species.MR_RIME, Species.KUBFU, Species.URSHIFU, Species.ZARUDE, + Species.URSALUNA, Species.SNEASLER, Species.PAWMO, Species.PAWMOT, @@ -36598,7 +37280,9 @@ export const tmSpecies: TmSpecies = { Species.LYCANROC, "midnight", ], + Species.GALAR_MR_MIME, Species.GALAR_DARUMAKA, + Species.GALAR_DARMANITAN, Species.HISUI_TYPHLOSION, Species.HISUI_SNEASEL, Species.HISUI_ZORUA, @@ -36747,12 +37431,18 @@ export const tmSpecies: TmSpecies = { Species.TAPU_FINI, Species.XURKITREE, Species.GROOKEY, + Species.THWACKEY, + Species.RILLABOOM, + Species.CURSOLA, Species.ALOLA_GEODUDE, Species.ALOLA_GRAVELER, Species.ALOLA_GOLEM, Species.ALOLA_EXEGGUTOR, Species.ETERNAL_FLOETTE, Species.GALAR_CORSOLA, + Species.HISUI_TYPHLOSION, + Species.HISUI_LILLIGANT, + Species.HISUI_DECIDUEYE, ], [Moves.CHARGE]: [ Species.PIKACHU, @@ -38153,9 +38843,128 @@ export const tmSpecies: TmSpecies = { ], Species.HISUI_BRAVIARY, ], + [Moves.RECYCLE]: [ + Species.CLEFAIRY, + Species.CLEFABLE, + Species.JIGGLYPUFF, + Species.WIGGLYTUFF, + Species.ABRA, + Species.KADABRA, + Species.ALAKAZAM, + Species.SLOWPOKE, + Species.SLOWBRO, + Species.MAGNEMITE, + Species.MAGNETON, + Species.DROWZEE, + Species.HYPNO, + Species.VOLTORB, + Species.ELECTRODE, + Species.CHANSEY, + Species.STARYU, + Species.STARMIE, + Species.MR_MIME, + Species.JYNX, + Species.PORYGON, + Species.SNORLAX, + Species.MEWTWO, + Species.MEW, + Species.HOOTHOOT, + Species.NOCTOWL, + Species.CLEFFA, + Species.IGGLYBUFF, + Species.SLOWKING, + Species.GIRAFARIG, + Species.DELIBIRD, + Species.PORYGON2, + Species.SMOOCHUM, + Species.BLISSEY, + Species.RALTS, + Species.KIRLIA, + Species.GARDEVOIR, + Species.MEDITITE, + Species.MEDICHAM, + Species.SPOINK, + Species.GRUMPIG, + Species.SPINDA, + Species.LUNATONE, + Species.SOLROCK, + Species.BALTOY, + Species.CLAYDOL, + Species.KECLEON, + Species.CHIMECHO, + Species.JIRACHI, + Species.DEOXYS, + Species.DRIFLOON, + Species.DRIFBLIM, + Species.CHINGLING, + Species.BRONZOR, + Species.BRONZONG, + Species.MIME_JR, + Species.HAPPINY, + Species.MUNCHLAX, + Species.MAGNEZONE, + Species.PORYGON_Z, + Species.GALLADE, + Species.UXIE, + Species.MESPRIT, + Species.AZELF, + Species.CRESSELIA, + Species.ARCEUS, + Species.PANSAGE, + Species.SIMISAGE, + Species.PANSEAR, + Species.SIMISEAR, + Species.PANPOUR, + Species.SIMIPOUR, + Species.TRUBBISH, + Species.GARBODOR, + Species.GOTHITA, + Species.GOTHORITA, + Species.GOTHITELLE, + Species.KLINK, + Species.KLANG, + Species.KLINKLANG, + Species.ELGYEM, + Species.BEHEEYEM, + Species.HEATMOR, + Species.MELOETTA, + Species.GENESECT, + Species.BRAIXEN, + Species.DELPHOX, + Species.BUNNELBY, + Species.DIGGERSBY, + Species.ESPURR, + Species.MEOWSTIC, + Species.DEDENNE, + Species.KLEFKI, + Species.HOOPA, + Species.MORELULL, + Species.SHIINOTIC, + Species.SANDYGAST, + Species.PALOSSAND, + Species.PYUKUMUKU, + Species.NECROZMA, + Species.STAKATAKA, + Species.BLACEPHALON, + Species.APPLIN, + Species.FLAPPLE, + Species.APPLETUN, + Species.MR_RIME, + Species.FARIGIRAF, + Species.DIPPLIN, + Species.HYDRAPPLE, + Species.ALOLA_RAICHU, + Species.ALOLA_GRIMER, + Species.ALOLA_MUK, + Species.GALAR_MR_MIME, + Species.HISUI_VOLTORB, + Species.HISUI_ELECTRODE, + ], [Moves.REVENGE]: [ Species.RATTATA, + Species.RATICATE, Species.MANKEY, + Species.PRIMEAPE, Species.MACHOP, Species.MACHOKE, Species.MACHAMP, @@ -38167,6 +38976,7 @@ export const tmSpecies: TmSpecies = { Species.MEW, Species.AIPOM, Species.PINECO, + Species.FORRETRESS, Species.QWILFISH, Species.HERACROSS, Species.HITMONTOP, @@ -38175,12 +38985,16 @@ export const tmSpecies: TmSpecies = { Species.BLAZIKEN, Species.SHIFTRY, Species.MAKUHITA, + Species.HARIYAMA, Species.CACTURNE, Species.ZANGOOSE, Species.CRAWDAUNT, Species.DUSKULL, Species.DUSCLOPS, Species.STARLY, + Species.STARAVIA, + Species.STARAPTOR, + Species.AMBIPOM, Species.VESPIQUEN, Species.RIOLU, Species.LUCARIO, @@ -38196,6 +39010,7 @@ export const tmSpecies: TmSpecies = { Species.DEWOTT, Species.SAMUROTT, Species.PATRAT, + Species.WATCHOG, Species.TIMBURR, Species.GURDURR, Species.CONKELDURR, @@ -38231,6 +39046,7 @@ export const tmSpecies: TmSpecies = { Species.TORRACAT, Species.INCINEROAR, Species.YUNGOOS, + Species.GUMSHOOS, Species.MUDSDALE, Species.BEWEAR, Species.PASSIMIAN, @@ -38263,13 +39079,18 @@ export const tmSpecies: TmSpecies = { Species.KUBFU, Species.URSHIFU, Species.ZARUDE, + Species.BASCULEGION, + Species.ANNIHILAPE, + Species.KINGAMBIT, Species.ALOLA_RATTATA, + Species.ALOLA_RATICATE, [ Species.LYCANROC, "midnight", ], Species.GALAR_FARFETCHD, Species.GALAR_ZAPDOS, + Species.HISUI_SAMUROTT, Species.GALAR_STUNFISK, ], [Moves.BRICK_BREAK]: [ @@ -39763,6 +40584,7 @@ export const tmSpecies: TmSpecies = { Species.XATU, Species.MURKROW, Species.DELIBIRD, + Species.LUGIA, Species.TORCHIC, Species.COMBUSKEN, Species.BLAZIKEN, @@ -39819,6 +40641,8 @@ export const tmSpecies: TmSpecies = { Species.COMBUSKEN, Species.BLAZIKEN, Species.CHIMCHAR, + Species.MONFERNO, + Species.INFERNAPE, Species.RIOLU, Species.LUCARIO, Species.VICTINI, @@ -40075,15 +40899,21 @@ export const tmSpecies: TmSpecies = { Species.BLASTOISE, Species.VULPIX, Species.NINETALES, + Species.VILEPLUME, Species.POLIWAG, Species.POLIWHIRL, Species.POLIWRATH, Species.BELLSPROUT, Species.WEEPINBELL, Species.VICTREEBEL, + Species.TENTACRUEL, Species.SLOWPOKE, Species.SLOWBRO, + Species.SEEL, + Species.DEWGONG, Species.CLOYSTER, + Species.HORSEA, + Species.SEADRA, Species.LAPRAS, Species.EEVEE, Species.VAPOREON, @@ -40096,6 +40926,8 @@ export const tmSpecies: TmSpecies = { Species.DRAGONITE, Species.MEWTWO, Species.MEW, + Species.MEGANIUM, + Species.BELLOSSOM, Species.POLITOED, Species.SUNKERN, Species.SUNFLORA, @@ -40103,12 +40935,14 @@ export const tmSpecies: TmSpecies = { Species.UMBREON, Species.SLOWKING, Species.DELIBIRD, + Species.KINGDRA, Species.RAIKOU, Species.ENTEI, Species.SUICUNE, Species.LUGIA, Species.HO_OH, Species.CELEBI, + Species.SWAMPERT, Species.LOTAD, Species.LOMBRE, Species.LUDICOLO, @@ -40128,6 +40962,8 @@ export const tmSpecies: TmSpecies = { Species.CASTFORM, Species.SNORUNT, Species.GLALIE, + Species.LATIAS, + Species.LATIOS, Species.PIPLUP, Species.PRINPLUP, Species.EMPOLEON, @@ -40347,6 +41183,7 @@ export const tmSpecies: TmSpecies = { ], [Moves.AIR_CUTTER]: [ Species.CHARMANDER, + Species.CHARMELEON, Species.CHARIZARD, Species.BUTTERFREE, Species.BEEDRILL, @@ -40402,6 +41239,8 @@ export const tmSpecies: TmSpecies = { Species.ALTARIA, Species.TROPIUS, Species.SALAMENCE, + Species.LATIAS, + Species.LATIOS, Species.EMPOLEON, Species.STARLY, Species.STARAVIA, @@ -40442,6 +41281,9 @@ export const tmSpecies: TmSpecies = { Species.ROWLET, Species.DARTRIX, Species.DECIDUEYE, + Species.PIKIPEK, + Species.TRUMBEAK, + Species.TOUCANNON, Species.ORICORIO, Species.KARTANA, Species.NAGANADEL, @@ -40568,7 +41410,10 @@ export const tmSpecies: TmSpecies = { Species.KORAIDON, Species.MIRAIDON, Species.GOUGING_FIRE, - Species.ROTOM, + [ + Species.ROTOM, + "heat", + ], Species.GALAR_WEEZING, Species.GALAR_DARUMAKA, Species.GALAR_DARMANITAN, @@ -41078,6 +41923,7 @@ export const tmSpecies: TmSpecies = { Species.NATU, Species.XATU, Species.SKITTY, + Species.DELCATTY, Species.LUNATONE, Species.SOLROCK, Species.BALTOY, @@ -41108,6 +41954,7 @@ export const tmSpecies: TmSpecies = { Species.NECROZMA, Species.ETERNATUS, Species.RELLOR, + Species.RABSCA, ], [Moves.SIGNAL_BEAM]: [ Species.BLASTOISE, @@ -41428,6 +42275,7 @@ export const tmSpecies: TmSpecies = { Species.SQUIRTLE, Species.WARTORTLE, Species.BLASTOISE, + Species.PSYDUCK, Species.GOLDUCK, Species.POLIWAG, Species.POLIWHIRL, @@ -41435,16 +42283,24 @@ export const tmSpecies: TmSpecies = { Species.TENTACOOL, Species.TENTACRUEL, Species.SLOWBRO, + Species.SEEL, + Species.DEWGONG, Species.LICKITUNG, Species.HORSEA, Species.SEADRA, Species.GOLDEEN, Species.SEAKING, Species.GYARADOS, + Species.LAPRAS, Species.VAPOREON, Species.OMANYTE, Species.OMASTAR, Species.MEW, + Species.TOTODILE, + Species.CROCONAW, + Species.FERALIGATR, + Species.CHINCHOU, + Species.LANTURN, Species.MARILL, Species.AZUMARILL, Species.POLITOED, @@ -41455,10 +42311,14 @@ export const tmSpecies: TmSpecies = { Species.LARVITAR, Species.PUPITAR, Species.TYRANITAR, + Species.MUDKIP, Species.MARSHTOMP, Species.SWAMPERT, + Species.LOTAD, Species.LOMBRE, Species.LUDICOLO, + Species.WINGULL, + Species.PELIPPER, Species.AZURILL, Species.BARBOACH, Species.WHISCASH, @@ -41469,6 +42329,7 @@ export const tmSpecies: TmSpecies = { Species.CLAMPERL, Species.RELICANTH, Species.KYOGRE, + Species.FLOATZEL, Species.SHELLOS, Species.GASTRODON, Species.HIPPOPOTAS, @@ -41484,6 +42345,8 @@ export const tmSpecies: TmSpecies = { Species.STUNFISK, Species.KELDEO, Species.BARBARACLE, + Species.SKRELP, + Species.DRAGALGE, Species.CLAUNCHER, Species.CLAWITZER, Species.GOOMY, @@ -41502,8 +42365,13 @@ export const tmSpecies: TmSpecies = { Species.CLOBBOPUS, Species.GRAPPLOCT, Species.PINCURCHIN, + Species.BASCULEGION, Species.TADBULB, + Species.BELLIBOLT, + Species.WIGLETT, + Species.WUGTRIO, Species.TATSUGIRI, + Species.CLODSIRE, Species.GALAR_SLOWBRO, Species.GALAR_SLOWKING, Species.GALAR_STUNFISK, @@ -41574,7 +42442,9 @@ export const tmSpecies: TmSpecies = { Species.SHAYMIN, Species.ARCEUS, Species.PATRAT, + Species.WATCHOG, Species.PANSAGE, + Species.SIMISAGE, Species.LEAVANNY, Species.PETILIL, Species.LILLIGANT, @@ -42004,9 +42874,11 @@ export const tmSpecies: TmSpecies = { ], [Moves.ICICLE_SPEAR]: [ Species.SEEL, + Species.DEWGONG, Species.SHELLDER, Species.CLOYSTER, Species.JYNX, + Species.LAPRAS, Species.ARTICUNO, Species.MEW, Species.SNEASEL, @@ -42430,6 +43302,7 @@ export const tmSpecies: TmSpecies = { Species.MACHAMP, Species.HITMONLEE, Species.HITMONCHAN, + Species.ELECTABUZZ, Species.PINSIR, Species.MEWTWO, Species.MEW, @@ -42463,10 +43336,12 @@ export const tmSpecies: TmSpecies = { Species.LUCARIO, Species.CROAGUNK, Species.TOXICROAK, + Species.ELECTIVIRE, Species.GALLADE, Species.DIALGA, Species.PALKIA, Species.ARCEUS, + Species.PIGNITE, Species.EMBOAR, Species.TIMBURR, Species.GURDURR, @@ -42980,6 +43855,230 @@ export const tmSpecies: TmSpecies = { Species.HISUI_SNEASEL, Species.PALDEA_WOOPER, ], + [Moves.COVET]: [ + Species.RATTATA, + Species.RATICATE, + Species.PIKACHU, + Species.RAICHU, + Species.SANDSHREW, + Species.SANDSLASH, + Species.CLEFAIRY, + Species.CLEFABLE, + Species.VULPIX, + Species.NINETALES, + Species.JIGGLYPUFF, + Species.WIGGLYTUFF, + Species.MEOWTH, + Species.PERSIAN, + Species.MANKEY, + Species.PRIMEAPE, + Species.GROWLITHE, + Species.ARCANINE, + Species.FARFETCHD, + Species.HITMONLEE, + Species.HITMONCHAN, + Species.CHANSEY, + Species.KANGASKHAN, + Species.MR_MIME, + Species.JYNX, + Species.ELECTABUZZ, + Species.MAGMAR, + Species.EEVEE, + Species.VAPOREON, + Species.JOLTEON, + Species.FLAREON, + Species.SNORLAX, + Species.MEW, + Species.CYNDAQUIL, + Species.QUILAVA, + Species.TYPHLOSION, + Species.SENTRET, + Species.FURRET, + Species.PICHU, + Species.CLEFFA, + Species.IGGLYBUFF, + Species.TOGEPI, + Species.TOGETIC, + Species.MARILL, + Species.AZUMARILL, + Species.SUDOWOODO, + Species.AIPOM, + Species.ESPEON, + Species.UMBREON, + Species.SNUBBULL, + Species.GRANBULL, + Species.SHUCKLE, + Species.TEDDIURSA, + Species.URSARING, + Species.TYROGUE, + Species.HITMONTOP, + Species.SMOOCHUM, + Species.ELEKID, + Species.MAGBY, + Species.BLISSEY, + Species.POOCHYENA, + Species.MIGHTYENA, + Species.ZIGZAGOON, + Species.LINOONE, + Species.SLAKOTH, + Species.VIGOROTH, + Species.SLAKING, + Species.AZURILL, + Species.SKITTY, + Species.DELCATTY, + Species.PLUSLE, + Species.MINUN, + Species.ILLUMISE, + Species.ROSELIA, + Species.SPOINK, + Species.GRUMPIG, + Species.SPINDA, + Species.LATIAS, + Species.CHIMCHAR, + Species.MONFERNO, + Species.INFERNAPE, + Species.PIPLUP, + Species.PRINPLUP, + Species.EMPOLEON, + Species.BIDOOF, + Species.BIBAREL, + Species.BUDEW, + Species.ROSERADE, + Species.PACHIRISU, + Species.AMBIPOM, + Species.BUNEARY, + Species.LOPUNNY, + Species.GLAMEOW, + Species.PURUGLY, + Species.BONSLY, + Species.MIME_JR, + Species.HAPPINY, + Species.MUNCHLAX, + Species.ELECTIVIRE, + Species.MAGMORTAR, + Species.LICKILICKY, + Species.TOGEKISS, + Species.LEAFEON, + Species.GLACEON, + Species.PHIONE, + Species.MANAPHY, + Species.SHAYMIN, + 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.PANPOUR, + Species.SIMIPOUR, + Species.PANSEAR, + Species.SIMISEAR, + Species.AUDINO, + Species.COTTONEE, + Species.WHIMSICOTT, + Species.PETILIL, + Species.LILLIGANT, + Species.ZORUA, + Species.ZOROARK, + Species.MINCCINO, + Species.CINCCINO, + Species.GOTHITA, + Species.GOTHORITA, + Species.GOTHITELLE, + Species.EMOLGA, + Species.CUBCHOO, + Species.BEARTIC, + Species.KELDEO, + Species.MELOETTA, + Species.FENNEKIN, + Species.BRAIXEN, + Species.DELPHOX, + Species.FLABEBE, + Species.FLOETTE, + Species.FLORGES, + Species.PANCHAM, + Species.PANGORO, + Species.ESPURR, + Species.MEOWSTIC, + Species.SPRITZEE, + Species.AROMATISSE, + Species.SWIRLIX, + Species.SLURPUFF, + Species.SYLVEON, + Species.DEDENNE, + Species.CARBINK, + Species.KLEFKI, + Species.DIANCIE, + Species.HOOPA, + Species.ROWLET, + Species.DARTRIX, + Species.DECIDUEYE, + Species.LITTEN, + Species.TORRACAT, + Species.INCINEROAR, + Species.POPPLIO, + Species.BRIONNE, + Species.PRIMARINA, + Species.ORICORIO, + Species.CUTIEFLY, + Species.RIBOMBEE, + Species.ROCKRUFF, + Species.LYCANROC, + Species.WISHIWASHI, + Species.MAREANIE, + Species.TOXAPEX, + Species.SALANDIT, + Species.SALAZZLE, + Species.BOUNSWEET, + Species.STEENEE, + Species.TSAREENA, + Species.COMFEY, + Species.ORANGURU, + Species.TOGEDEMARU, + Species.MIMIKYU, + Species.POIPOLE, + Species.GREEDENT, + Species.PERRSERKER, + Species.SIRFETCHD, + Species.MR_RIME, + Species.URSALUNA, + Species.LECHONK, + Species.OINKOLOGNE, + Species.FIDOUGH, + Species.DACHSBUN, + Species.TINKATINK, + Species.TINKATUFF, + Species.TINKATON, + Species.ANNIHILAPE, + Species.ALOLA_RATTATA, + Species.ALOLA_RATICATE, + Species.ALOLA_RAICHU, + Species.ALOLA_SANDSHREW, + Species.ALOLA_SANDSLASH, + Species.ALOLA_VULPIX, + Species.ALOLA_NINETALES, + Species.ALOLA_MEOWTH, + Species.ALOLA_PERSIAN, + Species.GALAR_MEOWTH, + Species.GALAR_FARFETCHD, + Species.GALAR_MR_MIME, + Species.HISUI_GROWLITHE, + Species.HISUI_ARCANINE, + Species.HISUI_TYPHLOSION, + Species.HISUI_SAMUROTT, + Species.HISUI_LILLIGANT, + Species.HISUI_DECIDUEYE, + Species.ETERNAL_FLOETTE, + ], [Moves.MAGICAL_LEAF]: [ Species.BULBASAUR, Species.IVYSAUR, @@ -43427,6 +44526,8 @@ export const tmSpecies: TmSpecies = { Species.DRAGONITE, Species.MEW, Species.TOTODILE, + Species.CROCONAW, + Species.FERALIGATR, Species.STEELIX, Species.KINGDRA, Species.LARVITAR, @@ -43529,6 +44630,7 @@ export const tmSpecies: TmSpecies = { Species.GROUDON, Species.TORTERRA, Species.SHIELDON, + Species.BASTIODON, Species.GASTRODON, Species.BRONZOR, Species.BRONZONG, @@ -43562,6 +44664,7 @@ export const tmSpecies: TmSpecies = { Species.TRUMBEAK, Species.TOUCANNON, Species.LYCANROC, + Species.MINIOR, Species.NECROZMA, Species.STAKATAKA, Species.BLACEPHALON, @@ -43588,6 +44691,7 @@ export const tmSpecies: TmSpecies = { Species.GLIMMET, Species.GLIMMORA, Species.IRON_THORNS, + Species.IRON_BOULDER, [ Species.WORMADAM, "sandy", @@ -44010,17 +45114,25 @@ export const tmSpecies: TmSpecies = { Species.BUZZWOLE, Species.PHEROMOSA, Species.ROOKIDEE, + Species.CORVISQUIRE, + Species.CORVIKNIGHT, Species.CRAMORANT, + Species.KLEAVOR, Species.QUAXLY, + Species.QUAXWELL, + Species.QUAQUAVAL, Species.SQUAWKABILLY, Species.WATTREL, Species.KILOWATTREL, Species.FLITTLE, + Species.ESPATHRA, Species.BOMBIRDIER, Species.FLAMIGO, Species.DUDUNSPARCE, Species.ROARING_MOON, Species.FEZANDIPITI, + Species.HISUI_BRAVIARY, + Species.HISUI_DECIDUEYE, ], [Moves.GRAVITY]: [ Species.CLEFAIRY, @@ -44393,6 +45505,90 @@ export const tmSpecies: TmSpecies = { ], Species.HISUI_QWILFISH, ], + [Moves.PLUCK]: [ + Species.PIDGEY, + Species.PIDGEOTTO, + Species.PIDGEOT, + Species.RATTATA, + Species.RATICATE, + Species.SPEAROW, + Species.FEAROW, + Species.ZUBAT, + Species.GOLBAT, + Species.FARFETCHD, + Species.DODUO, + Species.DODRIO, + Species.ARTICUNO, + Species.ZAPDOS, + Species.MOLTRES, + Species.MEW, + Species.HOOTHOOT, + Species.NOCTOWL, + Species.CROBAT, + Species.NATU, + Species.XATU, + Species.MURKROW, + Species.DELIBIRD, + Species.SKARMORY, + Species.HO_OH, + Species.TAILLOW, + Species.SWELLOW, + Species.WINGULL, + Species.PELIPPER, + Species.SWABLU, + Species.ALTARIA, + Species.PIPLUP, + Species.PRINPLUP, + Species.EMPOLEON, + Species.STARLY, + Species.STARAVIA, + Species.STARAPTOR, + Species.BIDOOF, + Species.BIBAREL, + Species.HONCHKROW, + Species.CHATOT, + Species.TOGEKISS, + Species.PIDOVE, + Species.TRANQUILL, + Species.UNFEZANT, + Species.WOOBAT, + Species.SWOOBAT, + Species.SIGILYPH, + Species.ARCHEN, + Species.ARCHEOPS, + Species.DUCKLETT, + Species.SWANNA, + Species.RUFFLET, + Species.BRAVIARY, + Species.VULLABY, + Species.MANDIBUZZ, + Species.INKAY, + Species.MALAMAR, + Species.ROWLET, + Species.DARTRIX, + Species.DECIDUEYE, + Species.PIKIPEK, + Species.TRUMBEAK, + Species.TOUCANNON, + Species.ORICORIO, + Species.ROOKIDEE, + Species.CORVISQUIRE, + Species.CORVIKNIGHT, + Species.CRAMORANT, + Species.DRACOZOLT, + Species.ARCTOZOLT, + Species.WATTREL, + Species.KILOWATTREL, + Species.FLITTLE, + Species.ESPATHRA, + Species.BOMBIRDIER, + Species.VELUZA, + Species.ALOLA_RATTATA, + Species.ALOLA_RATICATE, + Species.GALAR_ZAPDOS, + Species.HISUI_BRAVIARY, + Species.HISUI_DECIDUEYE, + ], [Moves.TAILWIND]: [ Species.CHARIZARD, Species.BUTTERFREE, @@ -45929,6 +47125,62 @@ export const tmSpecies: TmSpecies = { Species.HISUI_ZOROARK, Species.BLOODMOON_URSALUNA, ], + [Moves.GASTRO_ACID]: [ + Species.EKANS, + Species.ARBOK, + Species.ODDISH, + Species.GLOOM, + Species.VILEPLUME, + Species.BELLSPROUT, + Species.WEEPINBELL, + Species.VICTREEBEL, + Species.SNORLAX, + Species.MEW, + Species.BELLOSSOM, + Species.SHUCKLE, + Species.GULPIN, + Species.SWALOT, + Species.SEVIPER, + Species.LILEEP, + Species.CRADILY, + Species.MUNCHLAX, + Species.CARNIVINE, + Species.SNIVY, + Species.SERVINE, + Species.SERPERIOR, + Species.PANSAGE, + Species.SIMISAGE, + Species.PANSEAR, + Species.SIMISEAR, + Species.PANPOUR, + Species.SIMIPOUR, + Species.PALPITOAD, + Species.SEISMITOAD, + Species.FOONGUS, + Species.AMOONGUSS, + Species.JOLTIK, + Species.GALVANTULA, + Species.EELEKTRIK, + Species.EELEKTROSS, + Species.SHELMET, + Species.ACCELGOR, + Species.HEATMOR, + Species.DIGGERSBY, + Species.SWIRLIX, + Species.SLURPUFF, + Species.MAREANIE, + Species.TOXAPEX, + Species.PYUKUMUKU, + Species.GUZZLORD, + Species.POIPOLE, + Species.NAGANADEL, + Species.CHEWTLE, + Species.DREDNAW, + Species.TAROUNTULA, + Species.SPIDOPS, + Species.ALOLA_GRIMER, + Species.ALOLA_MUK, + ], [Moves.POWER_SWAP]: [ Species.VULPIX, Species.NINETALES, @@ -46071,6 +47323,124 @@ export const tmSpecies: TmSpecies = { "female", ], ], + [Moves.WORRY_SEED]: [ + Species.BULBASAUR, + Species.IVYSAUR, + Species.VENUSAUR, + Species.ODDISH, + Species.GLOOM, + Species.VILEPLUME, + Species.PARAS, + Species.PARASECT, + Species.PSYDUCK, + Species.GOLDUCK, + Species.BELLSPROUT, + Species.WEEPINBELL, + Species.VICTREEBEL, + Species.EXEGGCUTE, + Species.EXEGGUTOR, + Species.TANGELA, + Species.MEW, + Species.CHIKORITA, + Species.BAYLEEF, + Species.MEGANIUM, + Species.BELLOSSOM, + Species.HOPPIP, + Species.SKIPLOOM, + Species.JUMPLUFF, + Species.SUNKERN, + Species.SUNFLORA, + Species.CELEBI, + Species.TREECKO, + Species.GROVYLE, + Species.SCEPTILE, + Species.SEEDOT, + Species.NUZLEAF, + Species.SHIFTRY, + Species.SHROOMISH, + Species.BRELOOM, + Species.ROSELIA, + Species.CACNEA, + Species.CACTURNE, + Species.LILEEP, + Species.CRADILY, + Species.TROPIUS, + Species.TURTWIG, + Species.GROTLE, + Species.TORTERRA, + Species.BUDEW, + Species.ROSERADE, + Species.WORMADAM, + Species.CHERUBI, + Species.CHERRIM, + Species.CARNIVINE, + Species.SNOVER, + Species.ABOMASNOW, + Species.TANGROWTH, + Species.LEAFEON, + Species.SHAYMIN, + Species.SNIVY, + Species.SERVINE, + Species.SERPERIOR, + Species.PANSAGE, + Species.SIMISAGE, + Species.MUNNA, + Species.MUSHARNA, + Species.SEWADDLE, + Species.SWADLOON, + Species.LEAVANNY, + Species.COTTONEE, + Species.WHIMSICOTT, + Species.PETILIL, + Species.LILLIGANT, + Species.MARACTUS, + Species.DEERLING, + Species.SAWSBUCK, + Species.FOONGUS, + Species.AMOONGUSS, + Species.FERROSEED, + Species.FERROTHORN, + Species.VIRIZION, + Species.CHESPIN, + Species.QUILLADIN, + Species.CHESNAUGHT, + Species.FLABEBE, + Species.FLOETTE, + Species.FLORGES, + Species.SKIDDO, + Species.GOGOAT, + Species.PHANTUMP, + Species.TREVENANT, + Species.PUMPKABOO, + Species.GOURGEIST, + Species.ROWLET, + Species.DARTRIX, + Species.DECIDUEYE, + Species.FOMANTIS, + Species.LURANTIS, + Species.MORELULL, + Species.SHIINOTIC, + Species.BOUNSWEET, + Species.STEENEE, + Species.TSAREENA, + Species.COMFEY, + Species.TAPU_BULU, + Species.NIHILEGO, + Species.GROOKEY, + Species.THWACKEY, + Species.RILLABOOM, + Species.GOSSIFLEUR, + Species.ELDEGOSS, + Species.SPRIGATITO, + Species.FLORAGATO, + Species.MEOWSCARADA, + Species.CAPSAKID, + Species.SCOVILLAIN, + Species.ALOLA_EXEGGUTOR, + Species.HISUI_LILLIGANT, + Species.HISUI_DECIDUEYE, + Species.ETERNAL_FLOETTE, + ], [Moves.TOXIC_SPIKES]: [ Species.BEEDRILL, Species.EKANS, @@ -46811,6 +48181,151 @@ export const tmSpecies: TmSpecies = { Species.HISUI_ZORUA, Species.HISUI_ZOROARK, ], + [Moves.AQUA_TAIL]: [ + Species.SQUIRTLE, + Species.WARTORTLE, + Species.BLASTOISE, + Species.EKANS, + Species.ARBOK, + Species.NIDOQUEEN, + Species.NIDOKING, + Species.PSYDUCK, + Species.GOLDUCK, + Species.SLOWPOKE, + Species.SLOWBRO, + Species.SEEL, + Species.DEWGONG, + Species.LICKITUNG, + Species.RHYHORN, + Species.RHYDON, + Species.KANGASKHAN, + Species.GOLDEEN, + Species.SEAKING, + Species.LAPRAS, + Species.VAPOREON, + Species.KABUTOPS, + Species.AERODACTYL, + Species.DRATINI, + Species.DRAGONAIR, + Species.DRAGONITE, + Species.MEWTWO, + Species.MEW, + Species.TOTODILE, + Species.CROCONAW, + Species.FERALIGATR, + Species.SENTRET, + Species.FURRET, + Species.LANTURN, + Species.MARILL, + Species.AZUMARILL, + Species.WOOPER, + Species.QUAGSIRE, + Species.SLOWKING, + Species.DUNSPARCE, + Species.GLIGAR, + Species.STEELIX, + Species.QWILFISH, + Species.MANTINE, + Species.TYRANITAR, + Species.LUGIA, + Species.MUDKIP, + Species.MARSHTOMP, + Species.SWAMPERT, + Species.AGGRON, + Species.SEVIPER, + Species.BARBOACH, + Species.WHISCASH, + Species.ARMALDO, + Species.MILOTIC, + Species.KECLEON, + Species.SPHEAL, + Species.SEALEO, + Species.WALREIN, + Species.HUNTAIL, + Species.GOREBYSS, + Species.RELICANTH, + Species.SALAMENCE, + Species.KYOGRE, + Species.RAYQUAZA, + Species.BIDOOF, + Species.BIBAREL, + Species.BUIZEL, + Species.FLOATZEL, + Species.GARCHOMP, + Species.SKORUPI, + Species.DRAPION, + Species.FINNEON, + Species.LUMINEON, + Species.LICKILICKY, + Species.RHYPERIOR, + Species.GLACEON, + Species.GLISCOR, + Species.PALKIA, + Species.GIRATINA, + Species.ARCEUS, + Species.SNIVY, + Species.SERVINE, + Species.SERPERIOR, + Species.OSHAWOTT, + Species.DEWOTT, + Species.SAMUROTT, + Species.PATRAT, + Species.WATCHOG, + Species.PANPOUR, + Species.SIMIPOUR, + Species.SCOLIPEDE, + Species.SANDILE, + Species.KROKOROK, + Species.KROOKODILE, + Species.TIRTOUGA, + Species.CARRACOSTA, + Species.ARCHEN, + Species.ARCHEOPS, + Species.MINCCINO, + Species.CINCCINO, + Species.EELEKTRIK, + Species.EELEKTROSS, + Species.AXEW, + Species.FRAXURE, + Species.HAXORUS, + Species.STUNFISK, + Species.DRUDDIGON, + Species.DEINO, + Species.ZWEILOUS, + Species.HYDREIGON, + Species.KELDEO, + Species.SKRELP, + Species.DRAGALGE, + Species.CLAUNCHER, + Species.CLAWITZER, + Species.AMAURA, + Species.AURORUS, + Species.GOODRA, + Species.POPPLIO, + Species.BRIONNE, + Species.PRIMARINA, + Species.WISHIWASHI, + Species.BRUXISH, + Species.JANGMO_O, + Species.HAKAMO_O, + Species.KOMMO_O, + Species.BASCULEGION, + Species.OVERQWIL, + Species.FINIZEN, + Species.PALAFIN, + Species.CYCLIZAR, + Species.DONDOZO, + Species.DUDUNSPARCE, + Species.FRIGIBAX, + Species.ARCTIBAX, + Species.BAXCALIBUR, + Species.ALOLA_SANDSHREW, + Species.ALOLA_SANDSLASH, + Species.ALOLA_VULPIX, + Species.ALOLA_NINETALES, + Species.HISUI_QWILFISH, + Species.HISUI_SAMUROTT, + ], [Moves.SEED_BOMB]: [ Species.BULBASAUR, Species.IVYSAUR, @@ -47159,7 +48674,10 @@ export const tmSpecies: TmSpecies = { Species.IRON_BOULDER, Species.IRON_CROWN, Species.SHAYMIN, - Species.ROTOM, + [ + Species.ROTOM, + "fan", + ], Species.GALAR_ARTICUNO, Species.GALAR_MOLTRES, Species.HISUI_SAMUROTT, @@ -47728,6 +49246,8 @@ export const tmSpecies: TmSpecies = { Species.HERACROSS, Species.TYROGUE, Species.HITMONTOP, + Species.GROVYLE, + Species.SCEPTILE, Species.COMBUSKEN, Species.BLAZIKEN, Species.SHIFTRY, @@ -47737,6 +49257,7 @@ export const tmSpecies: TmSpecies = { Species.HARIYAMA, Species.MEDITITE, Species.MEDICHAM, + Species.FLYGON, Species.CHIMCHAR, Species.MONFERNO, Species.INFERNAPE, @@ -47749,6 +49270,9 @@ export const tmSpecies: TmSpecies = { Species.DEWOTT, Species.SAMUROTT, Species.MIENSHAO, + Species.COBALION, + Species.VIRIZION, + Species.KELDEO, Species.PASSIMIAN, Species.HAKAMO_O, Species.KOMMO_O, @@ -49985,6 +51509,7 @@ export const tmSpecies: TmSpecies = { Species.KADABRA, Species.ALAKAZAM, Species.DROWZEE, + Species.HYPNO, Species.EXEGGUTOR, Species.STARMIE, Species.SCYTHER, @@ -49996,6 +51521,7 @@ export const tmSpecies: TmSpecies = { Species.SNEASEL, Species.CELEBI, Species.MEDITITE, + Species.MEDICHAM, Species.SPINDA, Species.ABSOL, Species.METANG, @@ -50030,15 +51556,20 @@ export const tmSpecies: TmSpecies = { Species.HATTERENE, Species.ZACIAN, Species.SPECTRIER, + Species.KLEAVOR, Species.CERULEDGE, Species.VELUZA, Species.IRON_VALIANT, + Species.IRON_BOULDER, + Species.IRON_CROWN, Species.GALAR_RAPIDASH, Species.GALAR_ARTICUNO, [ Species.CALYREX, "shadow", ], + Species.HISUI_SAMUROTT, + Species.HISUI_DECIDUEYE, ], [Moves.ZEN_HEADBUTT]: [ Species.SQUIRTLE, @@ -51041,6 +52572,9 @@ export const tmSpecies: TmSpecies = { Species.BULBASAUR, Species.IVYSAUR, Species.VENUSAUR, + Species.ODDISH, + Species.GLOOM, + Species.VILEPLUME, Species.BELLSPROUT, Species.WEEPINBELL, Species.VICTREEBEL, @@ -51049,6 +52583,8 @@ export const tmSpecies: TmSpecies = { Species.TANGELA, Species.MEW, Species.CHIKORITA, + Species.BAYLEEF, + Species.MEGANIUM, Species.BELLOSSOM, Species.HOPPIP, Species.SKIPLOOM, @@ -51082,6 +52618,7 @@ export const tmSpecies: TmSpecies = { Species.SERVINE, Species.SERPERIOR, Species.PANSAGE, + Species.SIMISAGE, Species.LEAVANNY, Species.PETILIL, Species.LILLIGANT, @@ -51135,7 +52672,10 @@ export const tmSpecies: TmSpecies = { Species.OGERPON, Species.HYDRAPPLE, Species.SHAYMIN, - Species.ROTOM, + [ + Species.ROTOM, + "mow", + ], Species.ALOLA_EXEGGUTOR, Species.HISUI_VOLTORB, Species.HISUI_ELECTRODE, @@ -51217,7 +52757,9 @@ export const tmSpecies: TmSpecies = { Species.NAGANADEL, Species.OBSTAGOON, Species.ETERNATUS, + Species.KLEAVOR, Species.SHROODLE, + Species.GRAFAIAI, Species.FEZANDIPITI, ], [Moves.GUNK_SHOT]: [ @@ -52878,6 +54420,7 @@ export const tmSpecies: TmSpecies = { Species.OBSTAGOON, Species.PERRSERKER, Species.DURALUDON, + Species.URSALUNA, Species.SNEASLER, Species.SPRIGATITO, Species.FLORAGATO, @@ -52885,10 +54428,13 @@ export const tmSpecies: TmSpecies = { Species.MASCHIFF, Species.MABOSSTIFF, Species.BOMBIRDIER, + Species.KINGAMBIT, Species.WALKING_WAKE, + Species.ARCHALUDON, Species.ALOLA_SANDSHREW, Species.ALOLA_SANDSLASH, Species.ALOLA_DIGLETT, + Species.ALOLA_DUGTRIO, Species.GALAR_MEOWTH, Species.GALAR_LINOONE, Species.HISUI_SNEASEL, @@ -53510,6 +55056,9 @@ export const tmSpecies: TmSpecies = { Species.NIDOKING, Species.VILEPLUME, Species.DUGTRIO, + Species.BELLSPROUT, + Species.WEEPINBELL, + Species.VICTREEBEL, Species.TENTACOOL, Species.TENTACRUEL, Species.GRIMER, @@ -53520,6 +55069,8 @@ export const tmSpecies: TmSpecies = { Species.KOFFING, Species.WEEZING, Species.MEW, + Species.SPINARAK, + Species.ARIADOS, Species.WOOPER, Species.QUAGSIRE, Species.QWILFISH, @@ -53534,6 +55085,8 @@ export const tmSpecies: TmSpecies = { Species.CRAWDAUNT, Species.CRADILY, Species.GASTRODON, + Species.STUNKY, + Species.SKUNTANK, Species.CROAGUNK, Species.TOXICROAK, Species.TYMPOLE, @@ -53547,6 +55100,7 @@ export const tmSpecies: TmSpecies = { Species.TORNADUS, Species.THUNDURUS, Species.LANDORUS, + Species.GRENINJA, Species.BINACLE, Species.BARBARACLE, Species.SKRELP, @@ -53570,10 +55124,17 @@ export const tmSpecies: TmSpecies = { Species.NAGANADEL, Species.TOXTRICITY, Species.ETERNATUS, + Species.SNEASLER, + Species.OVERQWIL, + Species.SHROODLE, + Species.GRAFAIAI, + Species.VAROOM, + Species.REVAVROOM, Species.GLIMMET, Species.GLIMMORA, Species.CLODSIRE, Species.IRON_MOTH, + Species.OKIDOGI, Species.MUNKIDORI, Species.PECHARUNT, Species.ALOLA_RATICATE, @@ -53584,6 +55145,9 @@ export const tmSpecies: TmSpecies = { Species.GALAR_WEEZING, Species.GALAR_SLOWKING, Species.GALAR_STUNFISK, + Species.HISUI_SNEASEL, + Species.HISUI_SLIGGOO, + Species.HISUI_GOODRA, Species.PALDEA_WOOPER, ], [Moves.HEAVY_SLAM]: [ @@ -55475,6 +57039,8 @@ export const tmSpecies: TmSpecies = { Species.SLOWBRO, Species.DROWZEE, Species.HYPNO, + Species.EXEGGCUTE, + Species.EXEGGUTOR, Species.CHANSEY, Species.MR_MIME, Species.JYNX, @@ -55514,6 +57080,7 @@ export const tmSpecies: TmSpecies = { Species.LATIAS, Species.LATIOS, Species.JIRACHI, + Species.DEOXYS, Species.DRIFLOON, Species.DRIFBLIM, Species.MISMAGIUS, @@ -55532,6 +57099,7 @@ export const tmSpecies: TmSpecies = { Species.MESPRIT, Species.AZELF, Species.CRESSELIA, + Species.MANAPHY, Species.ARCEUS, Species.VICTINI, Species.MUNNA, @@ -55553,6 +57121,7 @@ export const tmSpecies: TmSpecies = { Species.FLABEBE, Species.FLOETTE, Species.FLORGES, + Species.MEOWSTIC, Species.INKAY, Species.MALAMAR, Species.SYLVEON, @@ -55597,14 +57166,11 @@ export const tmSpecies: TmSpecies = { Species.MUNKIDORI, Species.IRON_CROWN, Species.TERAPAGOS, - [ - Species.MEOWSTIC, - "female", - ], Species.ALOLA_RAICHU, Species.ALOLA_VULPIX, Species.ETERNAL_FLOETTE, Species.ALOLA_NINETALES, + Species.ALOLA_EXEGGUTOR, Species.GALAR_PONYTA, Species.GALAR_RAPIDASH, Species.GALAR_SLOWPOKE, @@ -56115,6 +57681,208 @@ export const tmSpecies: TmSpecies = { Species.LUNALA, Species.NAGANADEL, ], + [Moves.INCINERATE]: [ + Species.CHARMANDER, + Species.CHARMELEON, + Species.CHARIZARD, + Species.NIDOQUEEN, + Species.NIDOKING, + Species.CLEFAIRY, + Species.CLEFABLE, + Species.VULPIX, + Species.NINETALES, + Species.JIGGLYPUFF, + Species.WIGGLYTUFF, + Species.GROWLITHE, + Species.ARCANINE, + Species.MACHOP, + Species.MACHOKE, + Species.MACHAMP, + Species.GEODUDE, + Species.GRAVELER, + Species.GOLEM, + Species.PONYTA, + Species.RAPIDASH, + Species.SLOWPOKE, + Species.SLOWBRO, + Species.GRIMER, + Species.MUK, + Species.CUBONE, + Species.MAROWAK, + Species.LICKITUNG, + Species.KOFFING, + Species.WEEZING, + Species.RHYHORN, + Species.RHYDON, + Species.CHANSEY, + Species.KANGASKHAN, + Species.MAGMAR, + Species.TAUROS, + Species.GYARADOS, + Species.FLAREON, + Species.AERODACTYL, + Species.SNORLAX, + Species.MOLTRES, + Species.DRATINI, + Species.DRAGONAIR, + Species.DRAGONITE, + Species.MEWTWO, + Species.MEW, + Species.CYNDAQUIL, + Species.QUILAVA, + Species.TYPHLOSION, + Species.CLEFFA, + Species.IGGLYBUFF, + Species.TOGEPI, + Species.TOGETIC, + Species.SLOWKING, + Species.DUNSPARCE, + Species.SNUBBULL, + Species.GRANBULL, + Species.SLUGMA, + Species.MAGCARGO, + Species.REMORAID, + Species.OCTILLERY, + Species.HOUNDOUR, + Species.HOUNDOOM, + Species.MAGBY, + Species.BLISSEY, + Species.ENTEI, + Species.HO_OH, + Species.TORCHIC, + Species.COMBUSKEN, + Species.BLAZIKEN, + Species.POOCHYENA, + Species.MIGHTYENA, + Species.SLAKOTH, + Species.VIGOROTH, + Species.SLAKING, + Species.WHISMUR, + Species.LOUDRED, + Species.EXPLOUD, + Species.SABLEYE, + Species.MAWILE, + Species.AGGRON, + Species.NUMEL, + Species.CAMERUPT, + Species.TORKOAL, + Species.FLYGON, + Species.ALTARIA, + Species.ZANGOOSE, + Species.SOLROCK, + Species.CASTFORM, + Species.KECLEON, + Species.ABSOL, + Species.BAGON, + Species.SHELGON, + Species.SALAMENCE, + Species.GROUDON, + Species.RAYQUAZA, + Species.CHIMCHAR, + Species.MONFERNO, + Species.INFERNAPE, + Species.CRANIDOS, + Species.RAMPARDOS, + Species.SHIELDON, + Species.BASTIODON, + Species.HONCHKROW, + Species.STUNKY, + Species.SKUNTANK, + Species.HAPPINY, + Species.GIBLE, + Species.GABITE, + Species.GARCHOMP, + Species.MUNCHLAX, + Species.LICKILICKY, + Species.RHYPERIOR, + Species.MAGMORTAR, + Species.TOGEKISS, + Species.AZELF, + Species.DIALGA, + Species.PALKIA, + Species.HEATRAN, + Species.DARKRAI, + Species.ARCEUS, + Species.VICTINI, + Species.TEPIG, + Species.PIGNITE, + Species.EMBOAR, + Species.PANSEAR, + Species.SIMISEAR, + Species.AUDINO, + Species.SANDILE, + Species.KROKOROK, + Species.KROOKODILE, + Species.DARUMAKA, + Species.DARMANITAN, + Species.SCRAGGY, + Species.SCRAFTY, + Species.ZORUA, + Species.ZOROARK, + Species.LITWICK, + Species.LAMPENT, + Species.CHANDELURE, + Species.AXEW, + Species.FRAXURE, + Species.HAXORUS, + Species.DRUDDIGON, + Species.VULLABY, + Species.MANDIBUZZ, + Species.HEATMOR, + Species.DEINO, + Species.ZWEILOUS, + Species.HYDREIGON, + Species.LARVESTA, + Species.VOLCARONA, + Species.TORNADUS, + Species.THUNDURUS, + Species.RESHIRAM, + Species.FENNEKIN, + Species.BRAIXEN, + Species.DELPHOX, + Species.FLETCHINDER, + Species.TALONFLAME, + Species.LITLEO, + Species.PYROAR, + Species.GOODRA, + Species.PUMPKABOO, + Species.GOURGEIST, + Species.VOLCANION, + Species.SALANDIT, + Species.SALAZZLE, + Species.TURTONATOR, + Species.BLACEPHALON, + Species.ROLYCOLY, + Species.CARKOL, + Species.COALOSSAL, + Species.FUECOCO, + Species.CROCALOR, + Species.SKELEDIRGE, + Species.CHARCADET, + Species.ARMAROUGE, + Species.CERULEDGE, + Species.DUDUNSPARCE, + Species.CHI_YU, + Species.ROARING_MOON, + Species.GOUGING_FIRE, + Species.ALOLA_GEODUDE, + Species.ALOLA_GRAVELER, + Species.ALOLA_GOLEM, + Species.ALOLA_GRIMER, + Species.ALOLA_MUK, + Species.ALOLA_MAROWAK, + Species.GALAR_SLOWPOKE, + Species.GALAR_SLOWBRO, + Species.GALAR_WEEZING, + Species.GALAR_SLOWKING, + Species.GALAR_DARUMAKA, + Species.GALAR_DARMANITAN, + Species.HISUI_GROWLITHE, + Species.HISUI_ARCANINE, + Species.HISUI_TYPHLOSION, + Species.HISUI_GOODRA, + Species.PALDEA_TAUROS, + ], [Moves.QUASH]: [ Species.NIDOQUEEN, Species.NIDOKING, @@ -57998,6 +59766,7 @@ export const tmSpecies: TmSpecies = { Species.TORKOAL, Species.GROUDON, Species.RHYPERIOR, + Species.MAGMORTAR, Species.HEATRAN, Species.REGIGIGAS, Species.TEPIG, @@ -58033,6 +59802,8 @@ export const tmSpecies: TmSpecies = { Species.ZIGZAGOON, Species.LINOONE, Species.BUIZEL, + Species.FLOATZEL, + Species.AMBIPOM, Species.STUNKY, Species.SKUNTANK, Species.MINCCINO, @@ -58134,12 +59905,6 @@ export const tmSpecies: TmSpecies = { Species.HISUI_LILLIGANT, Species.HISUI_BRAVIARY, ], - [Moves.RELIC_SONG]: [ - Species.MELOETTA, - ], - [Moves.SECRET_SWORD]: [ - Species.KELDEO, - ], [Moves.SNARL]: [ Species.EKANS, Species.ARBOK, @@ -60268,8 +62033,226 @@ export const tmSpecies: TmSpecies = { Species.ALOLA_MUK, Species.ALOLA_EXEGGUTOR, ], - [Moves.DRAGON_ASCENT]: [ - Species.RAYQUAZA, + [Moves.POWER_UP_PUNCH]: [ + Species.CHARMANDER, + Species.CHARMELEON, + Species.CHARIZARD, + Species.SQUIRTLE, + Species.WARTORTLE, + Species.BLASTOISE, + Species.NIDOQUEEN, + Species.NIDOKING, + Species.CLEFAIRY, + Species.CLEFABLE, + Species.JIGGLYPUFF, + Species.WIGGLYTUFF, + Species.PSYDUCK, + Species.GOLDUCK, + Species.MANKEY, + Species.PRIMEAPE, + Species.POLIWHIRL, + Species.POLIWRATH, + Species.MACHOP, + Species.MACHOKE, + Species.MACHAMP, + Species.GEODUDE, + Species.GRAVELER, + Species.GOLEM, + Species.GRIMER, + Species.MUK, + Species.GENGAR, + Species.DROWZEE, + Species.HYPNO, + Species.CUBONE, + Species.MAROWAK, + Species.HITMONLEE, + Species.HITMONCHAN, + Species.LICKITUNG, + Species.RHYDON, + Species.CHANSEY, + Species.KANGASKHAN, + Species.MR_MIME, + Species.JYNX, + Species.ELECTABUZZ, + Species.MAGMAR, + Species.SNORLAX, + Species.DRAGONITE, + Species.MEWTWO, + Species.MEW, + Species.TYPHLOSION, + Species.TOTODILE, + Species.CROCONAW, + Species.FERALIGATR, + Species.SENTRET, + Species.FURRET, + Species.LEDYBA, + Species.LEDIAN, + Species.FLAAFFY, + Species.AMPHAROS, + Species.MARILL, + Species.AZUMARILL, + Species.SUDOWOODO, + Species.POLITOED, + Species.AIPOM, + Species.WOOPER, + Species.QUAGSIRE, + Species.SLOWKING, + Species.SNUBBULL, + Species.GRANBULL, + Species.SNEASEL, + Species.TEDDIURSA, + Species.URSARING, + Species.DELIBIRD, + Species.ELEKID, + Species.MAGBY, + Species.MILTANK, + Species.BLISSEY, + Species.LARVITAR, + Species.PUPITAR, + Species.TYRANITAR, + Species.TREECKO, + Species.GROVYLE, + Species.SCEPTILE, + Species.COMBUSKEN, + Species.BLAZIKEN, + Species.MARSHTOMP, + Species.SWAMPERT, + Species.LOMBRE, + Species.LUDICOLO, + Species.NUZLEAF, + Species.SHIFTRY, + Species.BRELOOM, + Species.SLAKOTH, + Species.VIGOROTH, + Species.SLAKING, + Species.LOUDRED, + Species.EXPLOUD, + Species.MAKUHITA, + Species.HARIYAMA, + Species.SABLEYE, + Species.MAWILE, + Species.AGGRON, + Species.MEDITITE, + Species.MEDICHAM, + Species.VOLBEAT, + Species.ILLUMISE, + Species.GULPIN, + Species.SWALOT, + Species.GRUMPIG, + Species.SPINDA, + Species.FLYGON, + Species.CACNEA, + Species.CACTURNE, + Species.ZANGOOSE, + Species.KECLEON, + Species.DUSCLOPS, + Species.METANG, + Species.METAGROSS, + Species.REGIROCK, + Species.REGICE, + Species.REGISTEEL, + Species.GROUDON, + Species.JIRACHI, + Species.DEOXYS, + Species.CHIMCHAR, + Species.MONFERNO, + Species.INFERNAPE, + Species.KRICKETUNE, + Species.CRANIDOS, + Species.RAMPARDOS, + Species.BUIZEL, + Species.FLOATZEL, + Species.AMBIPOM, + Species.BUNEARY, + Species.LOPUNNY, + Species.MUNCHLAX, + Species.RIOLU, + Species.LUCARIO, + Species.CROAGUNK, + Species.TOXICROAK, + Species.WEAVILE, + Species.LICKILICKY, + Species.RHYPERIOR, + Species.ELECTIVIRE, + Species.MAGMORTAR, + Species.GALLADE, + Species.DUSKNOIR, + Species.UXIE, + Species.MESPRIT, + Species.AZELF, + Species.REGIGIGAS, + Species.DARKRAI, + Species.VICTINI, + Species.PIGNITE, + Species.EMBOAR, + Species.WATCHOG, + Species.SIMISAGE, + Species.SIMISEAR, + Species.SIMIPOUR, + Species.AUDINO, + Species.TIMBURR, + Species.GURDURR, + Species.CONKELDURR, + Species.SEISMITOAD, + Species.THROH, + Species.SAWK, + Species.KROKOROK, + Species.KROOKODILE, + Species.DARUMAKA, + Species.DARMANITAN, + Species.SCRAGGY, + Species.SCRAFTY, + Species.GOTHITELLE, + Species.REUNICLUS, + Species.EELEKTROSS, + Species.CUBCHOO, + Species.BEARTIC, + Species.MIENFOO, + Species.MIENSHAO, + Species.DRUDDIGON, + Species.GOLETT, + Species.GOLURK, + Species.PAWNIARD, + Species.BISHARP, + Species.HEATMOR, + Species.MELOETTA, + Species.CHESPIN, + Species.QUILLADIN, + Species.CHESNAUGHT, + Species.FENNEKIN, + Species.BRAIXEN, + Species.DELPHOX, + Species.FROAKIE, + Species.FROGADIER, + Species.GRENINJA, + Species.BUNNELBY, + Species.DIGGERSBY, + Species.PANCHAM, + Species.PANGORO, + Species.MEOWSTIC, + Species.BINACLE, + Species.BARBARACLE, + Species.HAWLUCHA, + Species.PHANTUMP, + Species.TREVENANT, + Species.HOOPA, + Species.CRABRAWLER, + Species.CRABOMINABLE, + Species.BUZZWOLE, + Species.ZERAORA, + Species.TOXEL, + Species.TOXTRICITY, + Species.CLOBBOPUS, + Species.GRAPPLOCT, + Species.GRIMMSNARL, + Species.URSALUNA, + Species.ANNIHILAPE, + Species.KINGAMBIT, + Species.ALOLA_GRIMER, + Species.ALOLA_MUK, + Species.ALOLA_MAROWAK, + Species.GALAR_DARUMAKA, + Species.GALAR_DARMANITAN, ], [Moves.DARKEST_LARIAT]: [ Species.POLIWRATH, @@ -60346,6 +62329,9 @@ export const tmSpecies: TmSpecies = { Species.MAMOSWINE, Species.PROBOPASS, Species.REGIGIGAS, + Species.PIGNITE, + Species.EMBOAR, + Species.ZEBSTRIKA, Species.DRILBUR, Species.EXCADRILL, Species.GURDURR, @@ -60354,6 +62340,7 @@ export const tmSpecies: TmSpecies = { Species.SAWSBUCK, Species.GOLURK, Species.BOUFFALANT, + Species.TERRAKION, Species.CHESNAUGHT, Species.DIGGERSBY, Species.GOGOAT, @@ -61016,6 +63003,7 @@ export const tmSpecies: TmSpecies = { Species.ZACIAN, Species.ETERNATUS, Species.ZARUDE, + Species.KLEAVOR, Species.TINKATINK, Species.TINKATUFF, Species.TINKATON, @@ -61032,6 +63020,33 @@ export const tmSpecies: TmSpecies = { Species.GALAR_WEEZING, Species.GALAR_YAMASK, ], + [Moves.AURORA_VEIL]: [ + Species.JYNX, + Species.ARTICUNO, + Species.MEW, + Species.DELIBIRD, + Species.SMOOCHUM, + Species.REGICE, + Species.ABOMASNOW, + Species.GLACEON, + Species.FROSLASS, + Species.VANILLITE, + Species.VANILLISH, + Species.VANILLUXE, + Species.CRYOGONAL, + Species.AMAURA, + Species.AURORUS, + Species.BERGMITE, + Species.AVALUGG, + Species.EISCUE, + Species.ARCTOVISH, + Species.IRON_BUNDLE, + Species.ALOLA_SANDSHREW, + Species.ALOLA_SANDSLASH, + Species.ALOLA_VULPIX, + Species.ALOLA_NINETALES, + Species.HISUI_AVALUGG, + ], [Moves.PSYCHIC_FANGS]: [ Species.EKANS, Species.ARBOK, @@ -61698,29 +63713,47 @@ export const tmSpecies: TmSpecies = { Species.BLOODMOON_URSALUNA, ], [Moves.BREAKING_SWIPE]: [ + Species.CHARMANDER, + Species.CHARMELEON, Species.CHARIZARD, + Species.ARBOK, Species.ONIX, Species.RHYDON, Species.DRATINI, Species.DRAGONAIR, Species.DRAGONITE, Species.MEW, + Species.TOTODILE, + Species.CROCONAW, + Species.FERALIGATR, + Species.AMPHAROS, + Species.DUNSPARCE, + Species.GLIGAR, Species.STEELIX, Species.KINGDRA, Species.TYRANITAR, + Species.TREECKO, + Species.GROVYLE, Species.SCEPTILE, Species.FLYGON, Species.ALTARIA, + Species.SEVIPER, Species.MILOTIC, Species.SALAMENCE, Species.LATIAS, Species.LATIOS, Species.RAYQUAZA, + Species.RAMPARDOS, + Species.GABITE, Species.GARCHOMP, Species.RHYPERIOR, + Species.GLISCOR, Species.DIALGA, Species.PALKIA, Species.GIRATINA, + Species.SERPERIOR, + Species.KROKOROK, + Species.KROOKODILE, Species.AXEW, Species.FRAXURE, Species.HAXORUS, @@ -61731,9 +63764,12 @@ export const tmSpecies: TmSpecies = { Species.HELIOLISK, Species.TYRANTRUM, Species.GOODRA, + Species.NOIVERN, Species.ZYGARDE, Species.SALAZZLE, Species.DRAMPA, + Species.JANGMO_O, + Species.HAKAMO_O, Species.KOMMO_O, Species.NECROZMA, Species.NAGANADEL, @@ -61744,12 +63780,18 @@ export const tmSpecies: TmSpecies = { Species.DRAGAPULT, Species.REGIDRAGO, Species.CYCLIZAR, + Species.DUDUNSPARCE, + Species.IRON_THORNS, Species.BAXCALIBUR, Species.ROARING_MOON, Species.KORAIDON, Species.WALKING_WAKE, Species.ARCHALUDON, + Species.HYDRAPPLE, + Species.GOUGING_FIRE, + Species.RAGING_BOLT, Species.ALOLA_EXEGGUTOR, + Species.HISUI_GOODRA, ], [Moves.STEEL_BEAM]: [ Species.MAGNEMITE, @@ -61968,6 +64010,7 @@ export const tmSpecies: TmSpecies = { Species.COPPERAJAH, Species.DURALUDON, Species.IRON_TREADS, + Species.ARCHALUDON, Species.ALOLA_SANDSHREW, Species.ALOLA_SANDSLASH, ], @@ -62064,10 +64107,12 @@ export const tmSpecies: TmSpecies = { Species.KABUTOPS, Species.AERODACTYL, Species.MEW, + Species.AMPHAROS, Species.SUDOWOODO, Species.STEELIX, Species.SHUCKLE, Species.CORSOLA, + Species.NOSEPASS, Species.AGGRON, Species.LUNATONE, Species.SOLROCK, @@ -62082,8 +64127,12 @@ export const tmSpecies: TmSpecies = { Species.REGISTEEL, Species.RAYQUAZA, Species.JIRACHI, + Species.DEOXYS, + Species.BASTIODON, Species.BRONZONG, Species.RHYPERIOR, + Species.PROBOPASS, + Species.ARCEUS, Species.ROGGENROLA, Species.BOLDORE, Species.GIGALITH, @@ -62101,6 +64150,7 @@ export const tmSpecies: TmSpecies = { Species.AURORUS, Species.CARBINK, Species.DIANCIE, + Species.MINIOR, Species.SOLGALEO, Species.LUNALA, Species.NIHILEGO, @@ -62132,7 +64182,9 @@ export const tmSpecies: TmSpecies = { Species.ARCHALUDON, Species.IRON_BOULDER, Species.TERAPAGOS, + Species.ALOLA_GOLEM, Species.GALAR_CORSOLA, + Species.HISUI_AVALUGG, ], [Moves.MISTY_EXPLOSION]: [ Species.CLEFAIRY, @@ -62307,6 +64359,7 @@ export const tmSpecies: TmSpecies = { Species.DRACOZOLT, Species.ARCTOZOLT, Species.REGIELEKI, + Species.RAGING_BOLT, Species.ALOLA_RAICHU, ], [Moves.TERRAIN_PULSE]: [ @@ -62335,30 +64388,63 @@ export const tmSpecies: TmSpecies = { Species.SMOLIV, Species.DOLLIV, Species.ARBOLIVA, + Species.DUDUNSPARCE, Species.ALOLA_EXEGGUTOR, Species.GALAR_STUNFISK, ], [Moves.SKITTER_SMACK]: [ + Species.EKANS, + Species.ARBOK, + Species.VENONAT, + Species.VENOMOTH, Species.PERSIAN, + Species.TENTACRUEL, Species.GASTLY, Species.HAUNTER, Species.GENGAR, + Species.SCYTHER, Species.MEW, + Species.SPINARAK, + Species.ARIADOS, + Species.YANMA, Species.DUNSPARCE, + Species.GLIGAR, + Species.SCIZOR, Species.SHUCKLE, + Species.HERACROSS, Species.OCTILLERY, + Species.SURSKIT, + Species.MASQUERAIN, Species.NINCADA, Species.NINJASK, Species.SHEDINJA, + Species.SABLEYE, + Species.VOLBEAT, + Species.ILLUMISE, + Species.CACNEA, + Species.CACTURNE, + Species.SEVIPER, Species.MILOTIC, + Species.SHUPPET, + Species.BANETTE, Species.DUSKULL, Species.DUSCLOPS, + Species.KRICKETOT, + Species.KRICKETUNE, + Species.COMBEE, + Species.VESPIQUEN, Species.SHELLOS, Species.GASTRODON, Species.SKORUPI, Species.DRAPION, + Species.YANMEGA, + Species.GLISCOR, Species.DUSKNOIR, + Species.GIRATINA, Species.LIEPARD, + Species.SEWADDLE, + Species.SWADLOON, + Species.LEAVANNY, Species.VENIPEDE, Species.WHIRLIPEDE, Species.SCOLIPEDE, @@ -62379,26 +64465,32 @@ export const tmSpecies: TmSpecies = { Species.DURANT, Species.LARVESTA, Species.VOLCARONA, + Species.VIVILLON, Species.GOOMY, Species.SLIGGOO, Species.GOODRA, + Species.KLEFKI, Species.PHANTUMP, Species.TREVENANT, Species.PUMPKABOO, Species.GOURGEIST, Species.ZYGARDE, + Species.HOOPA, Species.DECIDUEYE, Species.GRUBBIN, Species.CHARJABUG, Species.VIKAVOLT, Species.DEWPIDER, Species.ARAQUANID, + Species.FOMANTIS, + Species.LURANTIS, Species.SALANDIT, Species.SALAZZLE, Species.WIMPOD, Species.GOLISOPOD, Species.PHEROMOSA, Species.MARSHADOW, + Species.INTELEON, Species.CHEWTLE, Species.DREDNAW, Species.SILICOBRA, @@ -62408,13 +64500,29 @@ export const tmSpecies: TmSpecies = { Species.GRAPPLOCT, Species.SNOM, Species.FROSMOTH, + Species.KLEAVOR, Species.TAROUNTULA, Species.SPIDOPS, Species.NYMBLE, + Species.LOKIX, + Species.SHROODLE, + Species.GRAFAIAI, + Species.BRAMBLEGHAST, + Species.TOEDSCOOL, + Species.TOEDSCRUEL, + Species.KLAWF, + Species.RELLOR, + Species.RABSCA, Species.TINKATINK, Species.TINKATUFF, Species.TINKATON, + Species.DUDUNSPARCE, + Species.SLITHER_WING, Species.ALOLA_PERSIAN, + Species.HISUI_ZORUA, + Species.HISUI_ZOROARK, + Species.HISUI_SLIGGOO, + Species.HISUI_GOODRA, ], [Moves.BURNING_JEALOUSY]: [ Species.VULPIX, @@ -62722,11 +64830,16 @@ export const tmSpecies: TmSpecies = { Species.HITMONTOP, Species.COMBUSKEN, Species.BLAZIKEN, + Species.MAKUHITA, + Species.HARIYAMA, + Species.INFERNAPE, Species.RIOLU, Species.LUCARIO, Species.CROAGUNK, Species.TOXICROAK, Species.GALLADE, + Species.PIGNITE, + Species.EMBOAR, Species.TIMBURR, Species.GURDURR, Species.CONKELDURR, @@ -62740,9 +64853,13 @@ export const tmSpecies: TmSpecies = { Species.TERRAKION, Species.VIRIZION, Species.KELDEO, + Species.MELOETTA, + Species.CHESNAUGHT, Species.PANCHAM, Species.PANGORO, Species.HAWLUCHA, + Species.CRABRAWLER, + Species.CRABOMINABLE, Species.STUFFUL, Species.BEWEAR, Species.PASSIMIAN, @@ -62760,7 +64877,17 @@ export const tmSpecies: TmSpecies = { Species.ZAMAZENTA, Species.KUBFU, Species.URSHIFU, + Species.SNEASLER, + Species.QUAQUAVAL, + Species.PAWMO, + Species.PAWMOT, + Species.ANNIHILAPE, + Species.IRON_VALIANT, + Species.IRON_LEAVES, Species.GALAR_ZAPDOS, + Species.HISUI_SNEASEL, + Species.HISUI_LILLIGANT, + Species.HISUI_DECIDUEYE, ], [Moves.FLIP_TURN]: [ Species.SQUIRTLE, @@ -62768,6 +64895,10 @@ export const tmSpecies: TmSpecies = { Species.BLASTOISE, Species.PSYDUCK, Species.GOLDUCK, + Species.TENTACOOL, + Species.TENTACRUEL, + Species.SEEL, + Species.DEWGONG, Species.HORSEA, Species.SEADRA, Species.GOLDEEN, @@ -62777,6 +64908,11 @@ export const tmSpecies: TmSpecies = { Species.VAPOREON, Species.KABUTOPS, Species.MEW, + Species.TOTODILE, + Species.CROCONAW, + Species.FERALIGATR, + Species.CHINCHOU, + Species.LANTURN, Species.QWILFISH, Species.KINGDRA, Species.SWAMPERT, @@ -62784,6 +64920,7 @@ export const tmSpecies: TmSpecies = { Species.SHARPEDO, Species.MILOTIC, Species.LUVDISC, + Species.LATIOS, Species.PIPLUP, Species.PRINPLUP, Species.EMPOLEON, @@ -62823,24 +64960,34 @@ export const tmSpecies: TmSpecies = { Species.HISUI_SAMUROTT, ], [Moves.TRIPLE_AXEL]: [ + Species.SEEL, + Species.DEWGONG, Species.JYNX, Species.ARTICUNO, Species.MEW, + Species.BELLOSSOM, Species.SNEASEL, Species.DELIBIRD, Species.HITMONTOP, Species.KIRLIA, Species.GARDEVOIR, Species.MILOTIC, + Species.PIPLUP, + Species.PRINPLUP, + Species.EMPOLEON, + Species.AMBIPOM, Species.BUNEARY, Species.LOPUNNY, Species.WEAVILE, Species.GLACEON, Species.GALLADE, Species.FROSLASS, + Species.LEAVANNY, Species.MINCCINO, Species.CINCCINO, Species.CRYOGONAL, + Species.MIENSHAO, + Species.MELOETTA, Species.POPPLIO, Species.BRIONNE, Species.PRIMARINA, @@ -62849,10 +64996,14 @@ export const tmSpecies: TmSpecies = { Species.PHEROMOSA, Species.MR_RIME, Species.FROSMOTH, + Species.MEOWSCARADA, + Species.QUAXWELL, + Species.QUAQUAVAL, Species.ALOLA_SANDSHREW, Species.ALOLA_SANDSLASH, Species.ALOLA_NINETALES, Species.GALAR_MR_MIME, + Species.HISUI_LILLIGANT, ], [Moves.DUAL_WINGBEAT]: [ Species.CHARIZARD, @@ -62893,6 +65044,7 @@ export const tmSpecies: TmSpecies = { Species.FLYGON, Species.SWABLU, Species.ALTARIA, + Species.TROPIUS, Species.SALAMENCE, Species.LATIAS, Species.LATIOS, @@ -62937,6 +65089,9 @@ export const tmSpecies: TmSpecies = { Species.ROWLET, Species.DARTRIX, Species.DECIDUEYE, + Species.PIKIPEK, + Species.TRUMBEAK, + Species.TOUCANNON, Species.VIKAVOLT, Species.ORICORIO, Species.CUTIEFLY, @@ -62989,10 +65144,14 @@ export const tmSpecies: TmSpecies = { Species.FLAREON, Species.MOLTRES, Species.MEW, + Species.TYPHLOSION, Species.STEELIX, + Species.MAGCARGO, Species.ENTEI, Species.HO_OH, Species.BLAZIKEN, + Species.NUMEL, + Species.CAMERUPT, Species.TORKOAL, Species.TRAPINCH, Species.VIBRAVA, @@ -63000,6 +65159,10 @@ export const tmSpecies: TmSpecies = { Species.BALTOY, Species.CLAYDOL, Species.GROUDON, + Species.INFERNAPE, + Species.TORTERRA, + Species.SHIELDON, + Species.BASTIODON, Species.GIBLE, Species.GABITE, Species.GARCHOMP, @@ -63008,6 +65171,7 @@ export const tmSpecies: TmSpecies = { Species.RHYPERIOR, Species.MAGMORTAR, Species.HEATRAN, + Species.ARCEUS, Species.VICTINI, Species.DRILBUR, Species.EXCADRILL, @@ -63018,12 +65182,16 @@ export const tmSpecies: TmSpecies = { Species.GOLURK, Species.HEATMOR, Species.RESHIRAM, + Species.LANDORUS, + Species.DELPHOX, Species.DIGGERSBY, Species.ZYGARDE, + Species.DIANCIE, Species.VOLCANION, Species.INCINEROAR, Species.SANDYGAST, Species.PALOSSAND, + Species.MINIOR, Species.TURTONATOR, Species.CINDERACE, Species.CARKOL, @@ -63040,6 +65208,8 @@ export const tmSpecies: TmSpecies = { Species.ALOLA_DIGLETT, Species.ALOLA_DUGTRIO, Species.ALOLA_MAROWAK, + Species.HISUI_GROWLITHE, + Species.HISUI_ARCANINE, ], [Moves.TERA_BLAST]: [ Species.BULBASAUR, @@ -65306,6 +67476,7 @@ export const tmPoolTiers: TmPoolTiers = { [Moves.PSYBEAM]: ModifierTier.GREAT, [Moves.HYPER_BEAM]: ModifierTier.ULTRA, [Moves.LOW_KICK]: ModifierTier.COMMON, + [Moves.COUNTER]: ModifierTier.COMMON, [Moves.STRENGTH]: ModifierTier.GREAT, [Moves.SOLAR_BEAM]: ModifierTier.ULTRA, [Moves.FIRE_SPIN]: ModifierTier.COMMON, @@ -65361,6 +67532,7 @@ export const tmPoolTiers: TmPoolTiers = { [Moves.STEEL_WING]: ModifierTier.GREAT, [Moves.ATTRACT]: ModifierTier.COMMON, [Moves.SLEEP_TALK]: ModifierTier.COMMON, + [Moves.HEAL_BELL]: ModifierTier.COMMON, [Moves.RETURN]: ModifierTier.ULTRA, [Moves.FRUSTRATION]: ModifierTier.COMMON, [Moves.SAFEGUARD]: ModifierTier.COMMON, @@ -65370,6 +67542,7 @@ export const tmPoolTiers: TmPoolTiers = { [Moves.ENCORE]: ModifierTier.COMMON, [Moves.IRON_TAIL]: ModifierTier.GREAT, [Moves.METAL_CLAW]: ModifierTier.COMMON, + [Moves.SYNTHESIS]: ModifierTier.GREAT, [Moves.HIDDEN_POWER]: ModifierTier.GREAT, [Moves.RAIN_DANCE]: ModifierTier.COMMON, [Moves.SUNNY_DAY]: ModifierTier.COMMON, @@ -65393,6 +67566,7 @@ export const tmPoolTiers: TmPoolTiers = { [Moves.HELPING_HAND]: ModifierTier.COMMON, [Moves.TRICK]: ModifierTier.COMMON, [Moves.SUPERPOWER]: ModifierTier.ULTRA, + [Moves.RECYCLE]: ModifierTier.COMMON, [Moves.REVENGE]: ModifierTier.GREAT, [Moves.BRICK_BREAK]: ModifierTier.GREAT, [Moves.KNOCK_OFF]: ModifierTier.GREAT, @@ -65425,6 +67599,7 @@ export const tmPoolTiers: TmPoolTiers = { [Moves.BOUNCE]: ModifierTier.GREAT, [Moves.MUD_SHOT]: ModifierTier.GREAT, [Moves.POISON_TAIL]: ModifierTier.GREAT, + [Moves.COVET]: ModifierTier.GREAT, [Moves.MAGICAL_LEAF]: ModifierTier.GREAT, [Moves.CALM_MIND]: ModifierTier.GREAT, [Moves.LEAF_BLADE]: ModifierTier.ULTRA, @@ -65435,6 +67610,7 @@ export const tmPoolTiers: TmPoolTiers = { [Moves.GRAVITY]: ModifierTier.COMMON, [Moves.GYRO_BALL]: ModifierTier.COMMON, [Moves.BRINE]: ModifierTier.GREAT, + [Moves.PLUCK]: ModifierTier.GREAT, [Moves.TAILWIND]: ModifierTier.GREAT, [Moves.U_TURN]: ModifierTier.GREAT, [Moves.CLOSE_COMBAT]: ModifierTier.ULTRA, @@ -65442,14 +67618,17 @@ export const tmPoolTiers: TmPoolTiers = { [Moves.ASSURANCE]: ModifierTier.COMMON, [Moves.EMBARGO]: ModifierTier.COMMON, [Moves.FLING]: ModifierTier.COMMON, + [Moves.GASTRO_ACID]: ModifierTier.GREAT, [Moves.POWER_SWAP]: ModifierTier.COMMON, [Moves.GUARD_SWAP]: ModifierTier.COMMON, + [Moves.WORRY_SEED]: ModifierTier.GREAT, [Moves.TOXIC_SPIKES]: ModifierTier.GREAT, [Moves.FLARE_BLITZ]: ModifierTier.ULTRA, [Moves.AURA_SPHERE]: ModifierTier.GREAT, [Moves.ROCK_POLISH]: ModifierTier.COMMON, [Moves.POISON_JAB]: ModifierTier.GREAT, [Moves.DARK_PULSE]: ModifierTier.GREAT, + [Moves.AQUA_TAIL]: ModifierTier.GREAT, [Moves.SEED_BOMB]: ModifierTier.GREAT, [Moves.AIR_SLASH]: ModifierTier.GREAT, [Moves.X_SCISSOR]: ModifierTier.GREAT, @@ -65506,6 +67685,7 @@ export const tmPoolTiers: TmPoolTiers = { [Moves.SCALD]: ModifierTier.GREAT, [Moves.HEX]: ModifierTier.GREAT, [Moves.SKY_DROP]: ModifierTier.GREAT, + [Moves.INCINERATE]: ModifierTier.GREAT, [Moves.QUASH]: ModifierTier.COMMON, [Moves.ACROBATICS]: ModifierTier.GREAT, [Moves.RETALIATE]: ModifierTier.GREAT, @@ -65541,7 +67721,7 @@ export const tmPoolTiers: TmPoolTiers = { [Moves.ELECTRIC_TERRAIN]: ModifierTier.COMMON, [Moves.DAZZLING_GLEAM]: ModifierTier.ULTRA, [Moves.INFESTATION]: ModifierTier.COMMON, - [Moves.DRAGON_ASCENT]: ModifierTier.ULTRA, + [Moves.POWER_UP_PUNCH]: ModifierTier.GREAT, [Moves.DARKEST_LARIAT]: ModifierTier.GREAT, [Moves.HIGH_HORSEPOWER]: ModifierTier.ULTRA, [Moves.SOLAR_BLADE]: ModifierTier.GREAT, @@ -65552,6 +67732,7 @@ export const tmPoolTiers: TmPoolTiers = { [Moves.SPEED_SWAP]: ModifierTier.COMMON, [Moves.SMART_STRIKE]: ModifierTier.GREAT, [Moves.BRUTAL_SWING]: ModifierTier.GREAT, + [Moves.AURORA_VEIL]: ModifierTier.COMMON, [Moves.PSYCHIC_FANGS]: ModifierTier.GREAT, [Moves.STOMPING_TANTRUM]: ModifierTier.GREAT, [Moves.LIQUIDATION]: ModifierTier.ULTRA, diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index fa9d0fdd55a..8b251d59de9 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -1403,15 +1403,18 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEOT], TrainerSlot.TRAINER, true, p => { p.formIndex = 1; 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; p.generateAndPopulateMoveset(); + p.generateName(); })) .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE], TrainerSlot.TRAINER, true, p => { p.formIndex = 1; 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 => { @@ -1420,6 +1423,7 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.LATIAS, Species.LATIOS], TrainerSlot.TRAINER, true, p => { p.formIndex = 1; p.generateAndPopulateMoveset(); + p.generateName(); })), [TrainerType.STEVEN]: new TrainerConfig(++t).initForChampion(signatureSpecies["STEVEN"],true).setBattleBgm("battle_hoenn_champion").setMixedBattleBgm("battle_hoenn_champion").setHasDouble("steven_wallace_double").setDoubleTrainerType(TrainerType.WALLACE).setDoubleTitle("champion_double") .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.SKARMORY], TrainerSlot.TRAINER, true, p => { @@ -1428,6 +1432,7 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.METAGROSS], TrainerSlot.TRAINER, true, p => { p.formIndex = 1; p.generateAndPopulateMoveset(); + p.generateName(); })), [TrainerType.WALLACE]: new TrainerConfig(++t).initForChampion(signatureSpecies["WALLACE"],true).setBattleBgm("battle_hoenn_champion").setMixedBattleBgm("battle_hoenn_champion").setHasDouble("wallace_steven_double").setDoubleTrainerType(TrainerType.STEVEN).setDoubleTitle("champion_double") .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.PELIPPER], TrainerSlot.TRAINER, true, p => { @@ -1445,6 +1450,7 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.GARCHOMP], TrainerSlot.TRAINER, true, p => { p.formIndex = 1; 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 => { @@ -1457,6 +1463,7 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.LAPRAS], TrainerSlot.TRAINER, true, p => { p.formIndex = 1; 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 => { @@ -1465,6 +1472,7 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.GARDEVOIR], TrainerSlot.TRAINER, true, p => { p.formIndex = 1; 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 => { @@ -1477,6 +1485,7 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.CHARIZARD], TrainerSlot.TRAINER, true, p => { p.formIndex = 3; 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 => { @@ -1551,6 +1560,7 @@ export const trainerConfigs: TrainerConfigs = { p.shiny = true; p.variant = 1; p.formIndex = 1; + p.generateName(); })) .setGenModifiersFunc(party => { const starter = party[0]; @@ -1568,6 +1578,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; + 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 => { @@ -1582,6 +1593,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; + p.generateName(); })) .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GASTRODON])) .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.MEWTWO ], TrainerSlot.TRAINER, true, p => { @@ -1600,6 +1612,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; + p.generateName(); })), [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 => { @@ -1621,6 +1634,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; + p.generateName(); })) .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.GROUDON ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); @@ -1638,6 +1652,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; + p.generateName(); })), [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.KINGDRA, Species.LUDICOLO ], TrainerSlot.TRAINER, true, p => { @@ -1662,6 +1677,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; + p.generateName(); })) .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.KYOGRE ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); @@ -1677,6 +1693,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; + p.generateName(); })) .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.WEAVILE ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); @@ -1694,6 +1711,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; + p.generateName(); })) .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.WEAVILE ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); @@ -1746,6 +1764,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; + p.generateName(); })), [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 => { @@ -1761,6 +1780,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; + p.generateName(); })) .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.YVELTAL ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); diff --git a/src/data/type.ts b/src/data/type.ts index c92416afca9..cf3bc85ab48 100644 --- a/src/data/type.ts +++ b/src/data/type.ts @@ -501,6 +501,55 @@ export function getTypeDamageMultiplier(attackType: integer, defType: integer): } } +/** + * Retrieve the types resisting a given type + * @returns An array populated with Types, or an empty array if no resistances exist (Unknown or Stellar type) + */ +export function getTypeResistances(type: integer): Type[] { + switch (type) { + case Type.NORMAL: + return [Type.ROCK, Type.STEEL, Type.GHOST]; + case Type.FIGHTING: + return [Type.FLYING, Type.POISON, Type.BUG, Type.PSYCHIC, Type.FAIRY, Type.GHOST]; + case Type.FLYING: + return [Type.ROCK, Type.ELECTRIC, Type.STEEL]; + case Type.POISON: + return [Type.POISON, Type.GROUND, Type.ROCK, Type.GHOST, Type.STEEL]; + case Type.GROUND: + return [Type.BUG, Type.GRASS, Type.FLYING]; + case Type.ROCK: + return [Type.FIGHTING, Type.GROUND, Type.STEEL]; + case Type.BUG: + return [Type.FIGHTING, Type.FLYING, Type.POISON, Type.GHOST, Type.STEEL, Type.FIRE, Type.FAIRY]; + case Type.GHOST: + return [Type.DARK, Type.NORMAL]; + case Type.STEEL: + return [Type.STEEL, Type.FIRE, Type.WATER, Type.ELECTRIC]; + case Type.FIRE: + return [Type.ROCK, Type.FIRE, Type.WATER, Type.DRAGON]; + case Type.WATER: + return [Type.WATER, Type.GRASS, Type.DRAGON]; + case Type.GRASS: + return [Type.FLYING, Type.POISON, Type.BUG, Type.STEEL, Type.FIRE, Type.GRASS, Type.DRAGON]; + case Type.ELECTRIC: + return [Type.GRASS, Type.ELECTRIC, Type.DRAGON, Type.GROUND]; + case Type.PSYCHIC: + return [Type.STEEL, Type.PSYCHIC]; + case Type.ICE: + return [Type.STEEL, Type.FIRE, Type.WATER, Type.ICE]; + case Type.DRAGON: + return [Type.STEEL, Type.FAIRY]; + case Type.DARK: + return [Type.FIGHTING, Type.DARK, Type.FAIRY]; + case Type.FAIRY: + return [Type.POISON, Type.STEEL, Type.FIRE]; + case Type.UNKNOWN: + case Type.STELLAR: + default: + return []; + } +} + /** * Retrieve the color corresponding to a specific damage multiplier * @returns A color or undefined if the default color should be used diff --git a/src/data/weather.ts b/src/data/weather.ts index f671c754873..901ad08d164 100644 --- a/src/data/weather.ts +++ b/src/data/weather.ts @@ -1,4 +1,5 @@ import { Biome } from "#enums/biome"; +import { WeatherType } from "#enums/weather-type"; import { getPokemonNameWithAffix } from "../messages"; import Pokemon from "../field/pokemon"; import { Type } from "./type"; @@ -9,19 +10,7 @@ import { SuppressWeatherEffectAbAttr } from "./ability"; import { TerrainType, getTerrainName } from "./terrain"; import i18next from "i18next"; -export enum WeatherType { - NONE, - SUNNY, - RAIN, - SANDSTORM, - HAIL, - SNOW, - FOG, - HEAVY_RAIN, - HARSH_SUN, - STRONG_WINDS -} - +export { WeatherType }; export class Weather { public weatherType: WeatherType; public turnsLeft: integer; diff --git a/src/egg-hatch-phase.ts b/src/egg-hatch-phase.ts index 44b72fb3d05..3965eae74f6 100644 --- a/src/egg-hatch-phase.ts +++ b/src/egg-hatch-phase.ts @@ -11,6 +11,7 @@ import { achvs } from "./system/achv"; import PokemonInfoContainer from "./ui/pokemon-info-container"; import EggCounterContainer from "./ui/egg-counter-container"; import { EggCountChangedEvent } from "./events/egg"; +import { getPokemonNameWithAffix } from "./messages"; /** * Class that represents egg hatching @@ -342,7 +343,7 @@ export class EggHatchPhase extends Phase { this.scene.playSoundWithoutBgm("evolution_fanfare"); - this.scene.ui.showText(i18next.t("egg:hatchFromTheEgg", { pokemonName: this.pokemon.name }), null, () => { + 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(() => { diff --git a/src/enums/battler-tag-type.ts b/src/enums/battler-tag-type.ts index ffbb5f1511c..c6e638c2426 100644 --- a/src/enums/battler-tag-type.ts +++ b/src/enums/battler-tag-type.ts @@ -13,6 +13,7 @@ export enum BattlerTagType { ENCORE = "ENCORE", HELPING_HAND = "HELPING_HAND", INGRAIN = "INGRAIN", + OCTOLOCK = "OCTOLOCK", AQUA_RING = "AQUA_RING", DROWSY = "DROWSY", TRAPPED = "TRAPPED", @@ -60,5 +61,8 @@ export enum BattlerTagType { DESTINY_BOND = "DESTINY_BOND", CENTER_OF_ATTENTION = "CENTER_OF_ATTENTION", ICE_FACE = "ICE_FACE", + STOCKPILING = "STOCKPILING", + RECEIVE_DOUBLE_DAMAGE = "RECEIVE_DOUBLE_DAMAGE", + ALWAYS_GET_HIT = "ALWAYS_GET_HIT", MYSTERY_ENCOUNTER_POST_SUMMON = "MYSTERY_ENCOUNTER_POST_SUMMON" // Provides effects on post-summon for MEs } diff --git a/src/enums/nature.ts b/src/enums/nature.ts new file mode 100644 index 00000000000..5ab8f3c850b --- /dev/null +++ b/src/enums/nature.ts @@ -0,0 +1,27 @@ +export enum Nature { + HARDY, + LONELY, + BRAVE, + ADAMANT, + NAUGHTY, + BOLD, + DOCILE, + RELAXED, + IMPISH, + LAX, + TIMID, + HASTY, + SERIOUS, + JOLLY, + NAIVE, + MODEST, + MILD, + QUIET, + BASHFUL, + RASH, + CALM, + GENTLE, + SASSY, + CAREFUL, + QUIRKY, +} diff --git a/src/enums/pokeball.ts b/src/enums/pokeball.ts new file mode 100644 index 00000000000..8d97fea464c --- /dev/null +++ b/src/enums/pokeball.ts @@ -0,0 +1,8 @@ +export enum PokeballType { + POKEBALL, + GREAT_BALL, + ULTRA_BALL, + ROGUE_BALL, + MASTER_BALL, + LUXURY_BALL, +} diff --git a/src/enums/stat.ts b/src/enums/stat.ts new file mode 100644 index 00000000000..a40319664d6 --- /dev/null +++ b/src/enums/stat.ts @@ -0,0 +1,8 @@ +export enum Stat { + HP = 0, + ATK, + DEF, + SPATK, + SPDEF, + SPD, +} diff --git a/src/enums/status-effect.ts b/src/enums/status-effect.ts new file mode 100644 index 00000000000..b79951f530a --- /dev/null +++ b/src/enums/status-effect.ts @@ -0,0 +1,10 @@ +export enum StatusEffect { + NONE, + POISON, + TOXIC, + PARALYSIS, + SLEEP, + FREEZE, + BURN, + FAINT, +} diff --git a/src/enums/weather-type.ts b/src/enums/weather-type.ts new file mode 100644 index 00000000000..fa699bb3514 --- /dev/null +++ b/src/enums/weather-type.ts @@ -0,0 +1,12 @@ +export enum WeatherType { + NONE, + SUNNY, + RAIN, + SANDSTORM, + HAIL, + SNOW, + FOG, + HEAVY_RAIN, + HARSH_SUN, + STRONG_WINDS, +} diff --git a/src/evolution-phase.ts b/src/evolution-phase.ts index c7986f6664f..7633fbb3fdd 100644 --- a/src/evolution-phase.ts +++ b/src/evolution-phase.ts @@ -10,6 +10,7 @@ import { cos, sin } from "./field/anims"; import { PlayerPokemon } from "./field/pokemon"; import { getTypeRgb } from "./data/type"; import i18next from "i18next"; +import { getPokemonNameWithAffix } from "./messages"; export class EvolutionPhase extends Phase { protected pokemon: PlayerPokemon; @@ -116,7 +117,7 @@ export class EvolutionPhase extends Phase { doEvolution(): void { const evolutionHandler = this.scene.ui.getHandler() as EvolutionSceneHandler; - const preName = this.pokemon.name; + const preName = getPokemonNameWithAffix(this.pokemon); this.scene.ui.showText(i18next.t("menu:evolving", { pokemonName: preName }), null, () => { this.pokemon.cry(); @@ -218,7 +219,7 @@ export class EvolutionPhase extends Phase { this.scene.time.delayedCall(900, () => { evolutionHandler.canCancel = false; - this.pokemon.evolve(this.evolution).then(() => { + 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])); diff --git a/src/field/arena.ts b/src/field/arena.ts index d767f84a135..b0619380982 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -13,7 +13,7 @@ import { BattlerIndex } from "../battle"; import { Terrain, TerrainType } from "../data/terrain"; import { PostTerrainChangeAbAttr, PostWeatherChangeAbAttr, applyPostTerrainChangeAbAttrs, applyPostWeatherChangeAbAttrs } from "../data/ability"; import Pokemon from "./pokemon"; -import * as Overrides from "../overrides"; +import Overrides from "#app/overrides"; import { WeatherChangedEvent, TerrainChangedEvent, TagAddedEvent, TagRemovedEvent } from "../events/arena"; import { ArenaTagType } from "#enums/arena-tag-type"; import { Biome } from "#enums/biome"; @@ -638,6 +638,12 @@ export class Arena { } } + /** Clears terrain and arena tags when entering new biome or trainer battle. */ + resetArenaEffects(): void { + this.trySetTerrain(TerrainType.NONE, false, true); + this.removeAllTags(); + } + preloadBgm(): void { this.scene.loadBgm(this.bgm); } @@ -657,7 +663,7 @@ export class Arena { case Biome.FOREST: return 4.294; case Biome.SEA: - return 1.672; + return 0.024; case Biome.SWAMP: return 4.461; case Biome.BEACH: @@ -709,7 +715,7 @@ export class Arena { case Biome.LABORATORY: return 114.862; case Biome.SLUM: - return 1.221; + return 0.000; case Biome.SNOWY_FOREST: return 3.047; } diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index a234719bf69..49561db4b54 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -3,27 +3,27 @@ import BattleScene, { AnySound } from "../battle-scene"; import { Variant, VariantSet, variantColorCache } from "#app/data/variant"; import { variantData } from "#app/data/variant"; import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from "../ui/battle-info"; -import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, VariablePowerAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, MultiHitAttr, VariableMoveTypeAttr, StatusMoveTypeImmunityAttr, MoveTarget, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatChangesAttr, SacrificialAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit, MoveFlags, NeutralDamageAgainstFlyingTypeMultiplierAttr } from "../data/move"; +import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, VariableMoveTypeAttr, StatusMoveTypeImmunityAttr, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatChangesAttr, SacrificialAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit, MoveFlags, NeutralDamageAgainstFlyingTypeMultiplierAttr, OneHitKOAccuracyAttr } from "../data/move"; import { default as PokemonSpecies, PokemonSpeciesForm, SpeciesFormKey, getFusedSpeciesName, getPokemonSpecies, getPokemonSpeciesForm, getStarterValueFriendshipCap, speciesStarters, starterPassiveAbilities } from "../data/pokemon-species"; import { Constructor } from "#app/utils"; import * as Utils from "../utils"; import { Type, TypeDamageMultiplier, getTypeDamageMultiplier, getTypeRgb } from "../data/type"; import { getLevelTotalExp } from "../data/exp"; import { Stat } from "../data/pokemon-stat"; -import { AttackTypeBoosterModifier, DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, PokemonBaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonMultiHitModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempBattleStatBoosterModifier, StatBoosterModifier, TerastallizeModifier, PokemonBaseStatTotalModifier } from "../modifier/modifier"; +import { DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, PokemonBaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempBattleStatBoosterModifier, StatBoosterModifier, CritBoosterModifier, TerastallizeModifier, PokemonBaseStatTotalModifier } from "../modifier/modifier"; import { PokeballType } from "../data/pokeball"; import { Gender } from "../data/gender"; import { initMoveAnim, loadMoveAnimAssets } from "../data/battle-anims"; import { Status, StatusEffect, getRandomStatus } from "../data/status-effect"; import { pokemonEvolutions, pokemonPrevolutions, SpeciesFormEvolution, SpeciesEvolutionCondition, FusionSpeciesFormEvolution } from "../data/pokemon-evolutions"; import { reverseCompatibleTms, tmSpecies, tmPoolTiers } from "../data/tms"; -import { DamagePhase, FaintPhase, LearnMovePhase, MoveEffectPhase, ObtainStatusEffectPhase, StatChangePhase, SwitchSummonPhase, ToggleDoublePositionPhase } from "../phases"; +import { DamagePhase, FaintPhase, LearnMovePhase, MoveEffectPhase, ObtainStatusEffectPhase, StatChangePhase, SwitchSummonPhase, ToggleDoublePositionPhase, MoveEndPhase } from "../phases"; import { BattleStat } from "../data/battle-stat"; -import { BattlerTag, BattlerTagLapseType, EncoreTag, GroundedTag, HelpingHandTag, HighestStatBoostTag, TypeBoostTag, TypeImmuneTag, getBattlerTag } from "../data/battler-tags"; +import { BattlerTag, BattlerTagLapseType, EncoreTag, GroundedTag, HighestStatBoostTag, TypeImmuneTag, getBattlerTag, SemiInvulnerableTag, TypeBoostTag } from "../data/battler-tags"; import { WeatherType } from "../data/weather"; import { TempBattleStat } from "../data/temp-battle-stat"; -import { ArenaTagSide, WeakenMoveScreenTag, WeakenMoveTypeTag } from "../data/arena-tag"; -import { Ability, AbAttr, BattleStatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, IgnoreOpponentStatChangesAbAttr, MoveImmunityAbAttr, MoveTypeChangeAttr, PreApplyBattlerTagAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, ReduceStatusEffectDurationAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, VariableMovePowerAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyBattleStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr, applyFieldBattleStatMultiplierAbAttrs, FieldMultiplyBattleStatAbAttr, AllyMoveCategoryPowerBoostAbAttr, FieldMoveTypePowerBoostAbAttr, AddSecondStrikeAbAttr, UserFieldMoveTypePowerBoostAbAttr } from "../data/ability"; +import { ArenaTagSide, WeakenMoveScreenTag } from "../data/arena-tag"; +import { Ability, AbAttr, BattleStatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, IgnoreOpponentStatChangesAbAttr, MoveImmunityAbAttr, PreApplyBattlerTagAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, ReduceStatusEffectDurationAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyBattleStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr, applyFieldBattleStatMultiplierAbAttrs, FieldMultiplyBattleStatAbAttr, AddSecondStrikeAbAttr, IgnoreOpponentEvasionAbAttr } from "../data/ability"; import PokemonData from "../system/pokemon-data"; import { BattlerIndex } from "../battle"; import { Mode } from "../ui/ui"; @@ -37,7 +37,7 @@ import { Nature, getNatureStatMultiplier } from "../data/nature"; import { SpeciesFormChange, SpeciesFormChangeActiveTrigger, SpeciesFormChangeMoveLearnedTrigger, SpeciesFormChangePostMoveTrigger, SpeciesFormChangeStatusEffectTrigger } from "../data/pokemon-forms"; import { TerrainType } from "../data/terrain"; import { TrainerSlot } from "../data/trainer-config"; -import * as Overrides from "../overrides"; +import Overrides from "#app/overrides"; import i18next from "i18next"; import { speciesEggMoves } from "../data/egg-moves"; import { ModifierTier } from "../modifier/modifier-tier"; @@ -50,6 +50,7 @@ import { 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.js"; import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; export enum FieldPosition { @@ -61,6 +62,7 @@ export enum FieldPosition { export default abstract class Pokemon extends Phaser.GameObjects.Container { public id: integer; public name: string; + public nickname: string; public species: PokemonSpecies; public formIndex: integer; public abilityIndex: integer; @@ -131,9 +133,19 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.species = species; this.pokeball = dataSource?.pokeball || PokeballType.POKEBALL; this.level = level; - this.abilityIndex = abilityIndex !== undefined - ? abilityIndex - : (species.abilityHidden && hasHiddenAbility ? species.ability2 ? 2 : 1 : species.ability2 ? randAbilityIndex : 0); + // Determine the ability index + if (abilityIndex !== undefined) { + this.abilityIndex = abilityIndex; // Use the provided ability index if it is defined + } else { + // If abilityIndex is not provided, determine it based on species and hidden ability + if (species.abilityHidden && hasHiddenAbility) { + // If the species has a hidden ability and the hidden ability is present + this.abilityIndex = species.ability2 ? 2 : 1; // Use ability index 2 if species has a second ability, otherwise use 1 + } else { + // If there is no hidden ability or species does not have a hidden ability + this.abilityIndex = species.ability2 ? randAbilityIndex : 0; // Use random ability index if species has a second ability, otherwise use 0 + } + } if (formIndex !== undefined) { this.formIndex = formIndex; } @@ -158,6 +170,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.variant = 0; } this.nature = dataSource.nature || 0 as Nature; + this.nickname = dataSource.nickname; this.natureOverride = dataSource.natureOverride !== undefined ? dataSource.natureOverride : -1; this.moveset = dataSource.moveset; this.status = dataSource.status; @@ -231,6 +244,19 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.calculateStats(); } + + getNameToRender() { + try { + if (this.nickname) { + return decodeURIComponent(escape(atob(this.nickname))); + } + return this.name; + } catch (err) { + console.error(`Failed to decode nickname for ${this.name}`, err); + return this.name; + } + } + init(): void { this.fieldPosition = FieldPosition.CENTER; @@ -309,6 +335,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return ret; } + /** + * Sets the Pokemon's name. Only called when loading a Pokemon so this function needs to be called when + * initializing hardcoded Pokemon or else it will not display the form index name properly. + * @returns n/a + */ generateName(): void { if (!this.fusionSpecies) { this.name = this.species.getName(this.formIndex); @@ -536,7 +567,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (!this.scene) { return []; } - return this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier && (m as PokemonHeldItemModifier).pokemonId === this.id, this.isPlayer()) as PokemonHeldItemModifier[]; + return this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier && m.pokemonId === this.id, this.isPlayer()) as PokemonHeldItemModifier[]; } updateScale(): void { @@ -790,6 +821,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.setNature(nature); } + isFullHp(): boolean { + return this.hp >= this.getMaxHp(); + } + getMaxHp(): integer { return this.getStat(Stat.HP); } @@ -1137,7 +1172,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } isGrounded(): boolean { - return !!this.getTag(GroundedTag) || (!this.isOfType(Type.FLYING, true, true) && !this.hasAbility(Abilities.LEVITATE) && !this.getTag(BattlerTagType.MAGNET_RISEN)); + return !!this.getTag(GroundedTag) || (!this.isOfType(Type.FLYING, true, true) && !this.hasAbility(Abilities.LEVITATE) && !this.getTag(BattlerTagType.MAGNET_RISEN) && !this.getTag(SemiInvulnerableTag)); } /** @@ -1166,7 +1201,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { getAttackMoveEffectiveness(source: Pokemon, pokemonMove: PokemonMove, ignoreAbility: boolean = false): TypeDamageMultiplier { const move = pokemonMove.getMove(); const typeless = move.hasAttr(TypelessAttr); - const typeMultiplier = new Utils.NumberHolder(this.getAttackTypeEffectiveness(move.type, source)); + const typeMultiplier = new Utils.NumberHolder(this.getAttackTypeEffectiveness(move, source)); const cancelled = new Utils.BooleanHolder(false); applyMoveAttrs(VariableMoveTypeMultiplierAttr, source, this, move, typeMultiplier); if (!typeless && !ignoreAbility) { @@ -1181,13 +1216,20 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { /** * Calculates the type effectiveness multiplier for an attack type - * @param moveType Type of the move + * @param moveOrType The move being used, or a type if the move is unknown * @param source 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 * @returns a multiplier for the type effectiveness */ - getAttackTypeEffectiveness(moveType: Type, source?: Pokemon, ignoreStrongWinds: boolean = false, simulated: boolean = true): TypeDamageMultiplier { + getAttackTypeEffectiveness(moveOrType: Move | Type, source?: Pokemon, ignoreStrongWinds: boolean = false, simulated: boolean = true): TypeDamageMultiplier { + const move = (moveOrType instanceof Move) + ? moveOrType + : undefined; + const moveType = (moveOrType instanceof Move) + ? move.type + : moveOrType; + if (moveType === Type.STELLAR) { return this.isTerastallized() ? 2 : 1; } @@ -1215,9 +1257,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } - if (!!this.summonData?.tags.find((tag) => tag instanceof TypeImmuneTag && tag.immuneType === moveType)) { - multiplier = 0; - } + const immuneTags = this.findTags(tag => tag instanceof TypeImmuneTag && tag.immuneType === moveType); + immuneTags.forEach(tag => { + if (move !== undefined) { + const hitsTagAttrs = move.getAttrs(HitsTagAttr).filter(attr => attr.tagType === tag.tagType); + if (hitsTagAttrs.length === 0) { + multiplier = 0; + } + } + }); return multiplier; } @@ -1759,6 +1807,48 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return (this.isPlayer() ? this.scene.getPlayerField() : this.scene.getEnemyField())[this.getFieldIndex() ? 0 : 1]; } + /** + * Calculates the accuracy multiplier of the user against a target. + * + * This method considers various factors such as the user's accuracy level, the target's evasion level, + * abilities, and modifiers to compute the final accuracy multiplier. + * + * @param target {@linkcode Pokemon} - The target Pokémon against which the move is used. + * @param sourceMove {@linkcode Move} - The move being used by the user. + * @returns The calculated accuracy multiplier. + */ + getAccuracyMultiplier(target: Pokemon, sourceMove: Move): number { + const isOhko = sourceMove.hasAttr(OneHitKOAccuracyAttr); + if (isOhko) { + return 1; + } + + const userAccuracyLevel = new Utils.IntegerHolder(this.summonData.battleStats[BattleStat.ACC]); + const targetEvasionLevel = new Utils.IntegerHolder(target.summonData.battleStats[BattleStat.EVA]); + + applyAbAttrs(IgnoreOpponentStatChangesAbAttr, target, null, userAccuracyLevel); + applyAbAttrs(IgnoreOpponentStatChangesAbAttr, this, null, targetEvasionLevel); + applyAbAttrs(IgnoreOpponentEvasionAbAttr, this, null, targetEvasionLevel); + applyMoveAttrs(IgnoreOpponentStatChangesAttr, this, target, sourceMove, targetEvasionLevel); + this.scene.applyModifiers(TempBattleStatBoosterModifier, this.isPlayer(), TempBattleStat.ACC, userAccuracyLevel); + + const accuracyMultiplier = new Utils.NumberHolder(1); + if (userAccuracyLevel.value !== targetEvasionLevel.value) { + accuracyMultiplier.value = userAccuracyLevel.value > targetEvasionLevel.value + ? (3 + Math.min(userAccuracyLevel.value - targetEvasionLevel.value, 6)) / 3 + : 3 / (3 + Math.min(targetEvasionLevel.value - userAccuracyLevel.value, 6)); + } + + applyBattleStatMultiplierAbAttrs(BattleStatMultiplierAbAttr, this, BattleStat.ACC, accuracyMultiplier, sourceMove); + + const evasionMultiplier = new Utils.NumberHolder(1); + applyBattleStatMultiplierAbAttrs(BattleStatMultiplierAbAttr, target, BattleStat.EVA, evasionMultiplier); + + accuracyMultiplier.value /= evasionMultiplier.value; + + return accuracyMultiplier.value; + } + apply(source: Pokemon, move: Move): HitResult { let result: HitResult; const damage = new Utils.NumberHolder(0); @@ -1768,15 +1858,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { applyMoveAttrs(VariableMoveCategoryAttr, source, this, move, variableCategory); const moveCategory = variableCategory.value as MoveCategory; - const typeChangeMovePowerMultiplier = new Utils.NumberHolder(1); applyMoveAttrs(VariableMoveTypeAttr, source, this, move); - applyPreAttackAbAttrs(MoveTypeChangeAttr, source, this, move, typeChangeMovePowerMultiplier); const types = this.getTypes(true, true); const cancelled = new Utils.BooleanHolder(false); const typeless = move.hasAttr(TypelessAttr); const typeMultiplier = new Utils.NumberHolder(!typeless && (moveCategory !== MoveCategory.STATUS || move.getAttrs(StatusMoveTypeImmunityAttr).find(attr => types.includes(attr.immuneType))) - ? this.getAttackTypeEffectiveness(move.type, source, false, false) + ? this.getAttackTypeEffectiveness(move, source, false, false) : 1); applyMoveAttrs(VariableMoveTypeMultiplierAttr, source, this, move, typeMultiplier); if (typeless) { @@ -1799,31 +1887,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { case MoveCategory.PHYSICAL: case MoveCategory.SPECIAL: const isPhysical = moveCategory === MoveCategory.PHYSICAL; - const power = new Utils.NumberHolder(move.power); + const power = move.calculateBattlePower(source, this); const sourceTeraType = source.getTeraType(); - if (sourceTeraType !== Type.UNKNOWN && sourceTeraType === move.type && power.value < 60 && move.priority <= 0 && !move.hasAttr(MultiHitAttr) && !this.scene.findModifier(m => m instanceof PokemonMultiHitModifier && m.pokemonId === source.id)) { - power.value = 60; - } - applyPreAttackAbAttrs(VariableMovePowerAbAttr, source, this, move, power); - - if (source.getAlly()?.hasAbilityWithAttr(AllyMoveCategoryPowerBoostAbAttr)) { - applyPreAttackAbAttrs(AllyMoveCategoryPowerBoostAbAttr, source, this, move, power); - } - - const fieldAuras = new Set( - this.scene.getField(true) - .map((p) => p.getAbilityAttrs(FieldMoveTypePowerBoostAbAttr) as FieldMoveTypePowerBoostAbAttr[]) - .flat(), - ); - for (const aura of fieldAuras) { - // The only relevant values are `move` and the `power` holder - aura.applyPreAttack(null, null, null, move, [power]); - } - - const alliedField: Pokemon[] = source instanceof PlayerPokemon ? this.scene.getPlayerField() : this.scene.getEnemyField(); - alliedField.forEach(p => applyPreAttackAbAttrs(UserFieldMoveTypePowerBoostAbAttr, p, this, move, power)); - - power.value *= typeChangeMovePowerMultiplier.value; if (!typeless) { applyPreDefendAbAttrs(TypeImmunityAbAttr, this, source, move, cancelled, typeMultiplier); @@ -1839,27 +1904,16 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { result = HitResult.NO_EFFECT; } else { const typeBoost = source.findTag(t => t instanceof TypeBoostTag && t.boostedType === move.type) as TypeBoostTag; - if (typeBoost) { - power.value *= typeBoost.boostValue; - if (typeBoost.oneUse) { - source.removeTag(typeBoost.tagType); - } + if (typeBoost?.oneUse) { + source.removeTag(typeBoost.tagType); } + const arenaAttackTypeMultiplier = new Utils.NumberHolder(this.scene.arena.getAttackTypeMultiplier(move.type, source.isGrounded())); applyMoveAttrs(IgnoreWeatherTypeDebuffAttr, source, this, move, arenaAttackTypeMultiplier); - if (this.scene.arena.getTerrainType() === TerrainType.GRASSY && this.isGrounded() && move.type === Type.GROUND && move.moveTarget === MoveTarget.ALL_NEAR_OTHERS) { - power.value /= 2; - } - applyMoveAttrs(VariablePowerAttr, source, this, move, power); - - this.scene.applyModifiers(PokemonMultiHitModifier, source.isPlayer(), source, new Utils.IntegerHolder(0), power); - if (!typeless) { - this.scene.arena.applyTags(WeakenMoveTypeTag, move.type, power); - this.scene.applyModifiers(AttackTypeBoosterModifier, source.isPlayer(), source, move.type, power); - } - if (source.getTag(HelpingHandTag)) { - power.value *= 1.5; + const glaiveRushModifier = new Utils.IntegerHolder(1); + if (this.getTag(BattlerTagType.RECEIVE_DOUBLE_DAMAGE)) { + glaiveRushModifier.value = 2; } let isCritical: boolean; const critOnly = new Utils.BooleanHolder(false); @@ -1871,6 +1925,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } else { const critLevel = new Utils.IntegerHolder(0); applyMoveAttrs(HighCritAttr, source, this, move, critLevel); + this.scene.applyModifiers(CritBoosterModifier, source.isPlayer(), source, critLevel); this.scene.applyModifiers(TempBattleStatBoosterModifier, source.isPlayer(), TempBattleStat.CRIT, critLevel); const bonusCrit = new Utils.BooleanHolder(false); if (applyAbAttrs(BonusCritAbAttr, source, null, bonusCrit)) { @@ -1881,6 +1936,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (source.getTag(BattlerTagType.CRIT_BOOST)) { critLevel.value += 2; } + console.log(`crit stage: +${critLevel.value}`); const critChance = [24, 8, 2, 1][Math.max(0, Math.min(critLevel.value, 3))]; isCritical = !source.getTag(BattlerTagType.NO_CRIT) && (critChance === 1 || !this.scene.randBattleSeedInt(critChance)); if (Overrides.NEVER_CRIT_OVERRIDE) { @@ -1918,6 +1974,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { stabMultiplier.value = Math.min(stabMultiplier.value + 0.5, 2.25); } + const targetCount = getMoveTargets(source, move.id).targets.length; + const targetMultiplier = targetCount > 1 ? 0.75 : 1; + applyMoveAttrs(VariableAtkAttr, source, this, move, sourceAtk); applyMoveAttrs(VariableDefAttr, source, this, move, targetDef); @@ -1930,7 +1989,19 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { applyPreAttackAbAttrs(AddSecondStrikeAbAttr, source, this, move, numTargets, new Utils.IntegerHolder(0), twoStrikeMultiplier); if (!isTypeImmune) { - damage.value = Math.ceil(((((2 * source.level / 5 + 2) * power.value * sourceAtk.value / targetDef.value) / 50) + 2) * stabMultiplier.value * typeMultiplier.value * arenaAttackTypeMultiplier.value * screenMultiplier.value * twoStrikeMultiplier.value * ((this.scene.randBattleSeedInt(15) + 85) / 100) * criticalMultiplier.value); + const levelMultiplier = (2 * source.level / 5 + 2); + const randomMultiplier = ((this.scene.randBattleSeedInt(16) + 85) / 100); + damage.value = Math.ceil((((levelMultiplier * power * sourceAtk.value / targetDef.value) / 50) + 2) + * stabMultiplier.value + * typeMultiplier.value + * arenaAttackTypeMultiplier.value + * screenMultiplier.value + * twoStrikeMultiplier.value + * targetMultiplier + * criticalMultiplier.value + * glaiveRushModifier.value + * randomMultiplier); + if (isPhysical && source.status && source.status.effect === StatusEffect.BURN) { if (!move.hasAttr(BypassBurnDamageReductionAttr)) { const burnDamageReductionCancelled = new Utils.BooleanHolder(false); @@ -1972,9 +2043,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (!typeMultiplier.value) { result = move.id === Moves.SHEER_COLD ? HitResult.IMMUNE : HitResult.NO_EFFECT; } else { - const oneHitKo = new Utils.BooleanHolder(false); - applyMoveAttrs(OneHitKOAttr, source, this, move, oneHitKo); - if (oneHitKo.value) { + const isOneHitKo = new Utils.BooleanHolder(false); + applyMoveAttrs(OneHitKOAttr, source, this, move, isOneHitKo); + if (isOneHitKo.value) { result = HitResult.ONE_HIT_KO; isCritical = false; damage.value = this.hp; @@ -1988,37 +2059,41 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } - if (!fixedDamage.value) { + const isOneHitKo = result === HitResult.ONE_HIT_KO; + + if (!fixedDamage.value && !isOneHitKo) { if (!source.isPlayer()) { this.scene.applyModifiers(EnemyDamageBoosterModifier, false, damage); } if (!this.isPlayer()) { this.scene.applyModifiers(EnemyDamageReducerModifier, false, damage); } + + applyPreDefendAbAttrs(ReceivedMoveDamageMultiplierAbAttr, this, source, move, cancelled, damage); } + // This attribute may modify damage arbitrarily, so be careful about changing its order of application. applyMoveAttrs(ModifiedDamageAttr, source, this, move, damage); - applyPreDefendAbAttrs(ReceivedMoveDamageMultiplierAbAttr, this, source, move, cancelled, damage); - console.log("damage", damage.value, move.name, power.value, sourceAtk, targetDef); + console.log("damage", damage.value, move.name, power, sourceAtk, targetDef); // In case of fatal damage, this tag would have gotten cleared before we could lapse it. const destinyTag = this.getTag(BattlerTagType.DESTINY_BOND); - const oneHitKo = result === HitResult.ONE_HIT_KO; if (damage.value) { - if (this.getHpRatio() === 1) { + if (this.isFullHp()) { applyPreDefendAbAttrs(PreDefendFullHpEndureAbAttr, this, source, move, cancelled, damage); } else if (!this.isPlayer() && damage.value >= 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. - */ - damage.value = this.damageAndUpdate(damage.value, result as DamageResult, isCritical, oneHitKo, oneHitKo, true); + * 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. + */ + damage.value = this.damageAndUpdate(damage.value, result as DamageResult, isCritical, isOneHitKo, isOneHitKo, true); this.turnData.damageTaken += damage.value; + if (isCritical) { this.scene.queueMessage(i18next.t("battle:hitResultCriticalHit")); } @@ -2031,14 +2106,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { source.turnData.damageDealt += damage.value; source.turnData.currDamageDealt = damage.value; this.battleData.hitCount++; - const attackResult = { move: move.id, result: result as DamageResult, damage: damage.value, critical: isCritical, sourceId: source.id }; + const attackResult = { move: move.id, result: result as DamageResult, damage: damage.value, critical: isCritical, sourceId: source.id, attackingPosition: source.getBattlerIndex() }; this.turnData.attacksReceived.unshift(attackResult); if (source.isPlayer() && !this.isPlayer()) { this.scene.applyModifiers(DamageMoneyRewardModifier, true, source, damage); } } - if (source.turnData.hitsLeft === 1) { + // 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")); @@ -2047,7 +2123,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.scene.queueMessage(i18next.t("battle:hitResultNotVeryEffective")); break; case HitResult.NO_EFFECT: - this.scene.queueMessage(i18next.t("battle:hitResultNoEffect", { pokemonName: this.name })); + this.scene.queueMessage(i18next.t("battle:hitResultNoEffect", { pokemonName: getPokemonNameWithAffix(this) })); break; case HitResult.IMMUNE: this.scene.queueMessage(`${this.name} is unaffected!`); @@ -2059,13 +2135,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } if (this.isFainted()) { - this.scene.unshiftPhase(new FaintPhase(this.scene, this.getBattlerIndex(), oneHitKo)); + // set splice index here, so future scene queues happen before FaintedPhase + this.scene.setPhaseQueueSplice(); + this.scene.unshiftPhase(new FaintPhase(this.scene, this.getBattlerIndex(), isOneHitKo)); this.resetSummonData(); } if (damage) { - this.scene.clearPhaseQueueSplice(); - const attacker = this.scene.getPokemonById(source.id); destinyTag?.lapse(attacker, BattlerTagLapseType.CUSTOM); } @@ -2080,7 +2156,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { defendingSidePlayField.forEach((p) => applyPreDefendAbAttrs(FieldPriorityMoveImmunityAbAttr, p, source, move, cancelled, typeMultiplier)); } if (!typeMultiplier.value) { - this.scene.queueMessage(i18next.t("battle:hitResultNoEffect", { pokemonName: this.name })); + this.scene.queueMessage(i18next.t("battle:hitResultNoEffect", { pokemonName: getPokemonNameWithAffix(this) })); } result = cancelled.value || !typeMultiplier.value ? HitResult.NO_EFFECT : HitResult.STATUS; break; @@ -2089,6 +2165,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return result; } + /** + * Called by damageAndUpdate() + * @param damage integer + * @param ignoreSegments boolean, not currently used + * @param preventEndure used to update damage if endure or sturdy + * @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 { if (this.isFainted()) { return 0; @@ -2110,9 +2194,16 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } damage = Math.min(damage, this.hp); - this.hp = this.hp - damage; if (this.isFainted() && !ignoreFaintPhase) { + /** + * When adding the FaintPhase, want to toggle future unshiftPhase() and queueMessage() calls + * to appear before the FaintPhase (as FaintPhase will potentially end the encounter and add Phases such as + * GameOverPhase, VictoryPhase, etc.. that will interfere with anything else that happens during this MoveEffectPhase) + * + * 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)); this.resetSummonData(); } @@ -2120,6 +2211,16 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return damage; } + /** + * Called by apply(), given the damage, adds a new DamagePhase and actually updates HP values, etc. + * @param damage integer - passed to damage() + * @param result an enum if it's super effective, not very, etc. + * @param critical boolean if move is a critical hit + * @param ignoreSegments boolean, passed to damage() and not used currently + * @param preventEndure boolean, ignore endure properties of pokemon, passed to damage() + * @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); @@ -2166,13 +2267,19 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return false; } + /** @overload */ + getTag(tagType: BattlerTagType): BattlerTag; + + /** @overload */ + getTag(tagType: Constructor): T; + getTag(tagType: BattlerTagType | Constructor): BattlerTag { if (!this.summonData) { return null; } - return typeof(tagType) === "string" - ? this.summonData.tags.find(t => t.tagType === tagType) - : this.summonData.tags.find(t => t instanceof tagType); + return tagType instanceof Function + ? this.summonData.tags.find(t => t instanceof tagType) + : this.summonData.tags.find(t => t.tagType === tagType); } findTag(tagFilter: ((tag: BattlerTag) => boolean)) { @@ -2182,15 +2289,6 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return this.summonData.tags.find(t => tagFilter(t)); } - getTags(tagType: BattlerTagType | Constructor): BattlerTag[] { - if (!this.summonData) { - return []; - } - return typeof(tagType) === "string" - ? this.summonData.tags.filter(t => t.tagType === tagType) - : this.summonData.tags.filter(t => t instanceof tagType); - } - findTags(tagFilter: ((tag: BattlerTag) => boolean)): BattlerTag[] { if (!this.summonData) { return []; @@ -2210,7 +2308,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { lapseTags(lapseType: BattlerTagLapseType): void { const tags = this.summonData.tags; - tags.filter(t => lapseType === BattlerTagLapseType.FAINT || ((t.lapseType === lapseType) && !(t.lapse(this, lapseType))) || (lapseType === BattlerTagLapseType.TURN_END && t.turnCount < 1)).forEach(t => { + tags.filter(t => lapseType === BattlerTagLapseType.FAINT || ((t.lapseType.some(lType => lType === lapseType)) && !(t.lapse(this, lapseType)))).forEach(t => { t.onRemove(this); tags.splice(tags.indexOf(t), 1); }); @@ -2220,7 +2318,6 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const tags = this.summonData.tags; const tag = tags.find(t => t.tagType === tagType); if (tag) { - tag.turnCount = 0; tag.onRemove(this); tags.splice(tags.indexOf(tag), 1); } @@ -3026,6 +3123,17 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { getBattleInfo(): BattleInfo { return this.battleInfo; } + + /** + * Checks whether or not the Pokemon's root form has the same ability + * @param abilityIndex the given ability index we are checking + * @returns true if the abilities are the same + */ + hasSameAbilityInRootForm(abilityIndex: number): boolean { + const currentAbilityIndex = this.abilityIndex; + const rootForm = getPokemonSpecies(this.species.getRootSpeciesId()); + return rootForm.getAbility(abilityIndex) === rootForm.getAbility(currentAbilityIndex); + } } export default interface Pokemon { @@ -3129,7 +3237,7 @@ export class PlayerPokemon extends Pokemon { 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.unshiftPhase(new SwitchSummonPhase(this.scene, this.getFieldIndex(), slotIndex, false, batonPass)); + this.scene.prependToPhase(new SwitchSummonPhase(this.scene, this.getFieldIndex(), slotIndex, false, batonPass), MoveEndPhase); } if (removeFromField) { this.setVisible(false); @@ -3232,9 +3340,10 @@ export class PlayerPokemon extends Pokemon { }); } - evolve(evolution: SpeciesFormEvolution): Promise { + evolve(evolution: SpeciesFormEvolution, preEvolution: PokemonSpeciesForm): Promise { return new Promise(resolve => { this.pauseEvolutions = false; + // Handles Nincada evolving into Ninjask + Shedinja this.handleSpecialEvolutions(evolution); const isFusion = evolution instanceof FusionSpeciesFormEvolution; if (!isFusion) { @@ -3253,13 +3362,28 @@ export class PlayerPokemon extends Pokemon { this.generateName(); if (!isFusion) { const abilityCount = this.getSpeciesForm().getAbilityCount(); - if (this.abilityIndex >= abilityCount) { // Shouldn't happen - this.abilityIndex = abilityCount - 1; + const preEvoAbilityCount = preEvolution.getAbilityCount(); + 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) { + 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"); + console.warn(this.abilityIndex); + this.abilityIndex = 0; } - } else { + } else { // Do the same as above, but for fusions const abilityCount = this.getFusionSpeciesForm().getAbilityCount(); - if (this.fusionAbilityIndex >= abilityCount) {// Shouldn't happen - this.fusionAbilityIndex = abilityCount - 1; + const preEvoAbilityCount = preEvolution.getAbilityCount(); + 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); + this.fusionAbilityIndex = 0; } } this.compatibleTms.splice(0, this.compatibleTms.length); @@ -3303,9 +3427,9 @@ export class PlayerPokemon extends Pokemon { newPokemon.fusionLuck = this.fusionLuck; this.scene.getParty().push(newPokemon); - newPokemon.evolve(!isFusion ? newEvolution : new FusionSpeciesFormEvolution(this.id, newEvolution)); + newPokemon.evolve((!isFusion ? newEvolution : new FusionSpeciesFormEvolution(this.id, newEvolution)), evoSpecies); const modifiers = this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && (m as PokemonHeldItemModifier).pokemonId === this.id, true) as PokemonHeldItemModifier[]; + && m.pokemonId === this.id, true) as PokemonHeldItemModifier[]; modifiers.forEach(m => { const clonedModifier = m.clone() as PokemonHeldItemModifier; clonedModifier.pokemonId = newPokemon.id; @@ -3398,7 +3522,7 @@ export class PlayerPokemon extends Pokemon { partyMemberIndex--; } const fusedPartyMemberHeldModifiers = this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && (m as PokemonHeldItemModifier).pokemonId === pokemon.id, true) as 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)); @@ -3919,6 +4043,7 @@ export interface AttackMoveResult { damage: integer; critical: boolean; sourceId: integer; + attackingPosition: BattlerIndex; } export class PokemonSummonData { diff --git a/src/form-change-phase.ts b/src/form-change-phase.ts index ebf91c635fd..55bf655081b 100644 --- a/src/form-change-phase.ts +++ b/src/form-change-phase.ts @@ -10,6 +10,7 @@ import PartyUiHandler from "./ui/party-ui-handler"; import { BattleSpec } from "#enums/battle-spec"; import { BattlePhase, MovePhase, PokemonHealPhase } from "./phases"; import { getTypeRgb } from "./data/type"; +import { getPokemonNameWithAffix } from "./messages"; export class FormChangePhase extends EvolutionPhase { private formChange: SpeciesFormChange; @@ -34,7 +35,7 @@ export class FormChangePhase extends EvolutionPhase { } doEvolution(): void { - const preName = this.pokemon.name; + const preName = getPokemonNameWithAffix(this.pokemon); this.pokemon.getPossibleForm(this.formChange).then(transformedPokemon => { @@ -191,7 +192,7 @@ export class QuietFormChangePhase extends BattlePhase { return this.end(); } - const preName = this.pokemon.name; + const preName = getPokemonNameWithAffix(this.pokemon); if (!this.pokemon.isOnField()) { this.pokemon.changeForm(this.formChange).then(() => { diff --git a/src/game-mode.ts b/src/game-mode.ts index 11bedd9a791..110ced33760 100644 --- a/src/game-mode.ts +++ b/src/game-mode.ts @@ -4,7 +4,7 @@ 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 * as Overrides from "./overrides"; +import Overrides from "#app/overrides"; import * as Utils from "./utils"; import { Biome } from "#enums/biome"; import { Species } from "#enums/species"; diff --git a/src/loading-scene.ts b/src/loading-scene.ts index 1ce8ed87156..3d62248f693 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -40,7 +40,7 @@ export class LoadingScene extends SceneBase { this.loadImage("loading_bg", "arenas"); this.loadImage("logo", ""); - this.loadImage("pride-update", "events"); + // this.loadImage("pride-update", "events"); // Load menu images this.loadAtlas("bg", "ui"); @@ -92,6 +92,7 @@ export class LoadingScene extends SceneBase { this.loadImage("shiny_star_small", "ui", "shiny_small.png"); this.loadImage("shiny_star_small_1", "ui", "shiny_small_1.png"); this.loadImage("shiny_star_small_2", "ui", "shiny_small_2.png"); + this.loadImage("passive_bg", "ui", "passive_bg.png"); this.loadAtlas("shiny_icons", "ui"); this.loadImage("ha_capsule", "ui", "ha_capsule.png"); this.loadImage("champion_ribbon", "ui", "champion_ribbon.png"); @@ -146,6 +147,9 @@ export class LoadingScene extends SceneBase { this.loadImage(`summary_tabs_${t}`, "ui"); } + this.loadImage("scroll_bar", "ui"); + this.loadImage("scroll_bar_handle", "ui"); + this.loadImage("starter_container_bg", "ui"); this.loadImage("starter_select_bg", "ui"); this.loadImage("select_cursor", "ui"); this.loadImage("select_cursor_highlight", "ui"); @@ -155,6 +159,8 @@ export class LoadingScene extends SceneBase { this.loadImage("select_gen_cursor_highlight", "ui"); this.loadImage("saving_icon", "ui"); + this.loadImage("discord", "ui"); + this.loadImage("google", "ui"); this.loadImage("default_bg", "arenas"); // Load arena images diff --git a/src/locales/de/ability-trigger.ts b/src/locales/de/ability-trigger.ts index 4e69db20231..68930fbee21 100644 --- a/src/locales/de/ability-trigger.ts +++ b/src/locales/de/ability-trigger.ts @@ -5,7 +5,58 @@ export const abilityTriggers: SimpleTranslationEntries = { "badDreams": "{{pokemonName}} ist in einem Alptraum gefangen!", "costar": "{{pokemonName}} kopiert die Statusveränderungen von {{allyName}}!", "iceFaceAvoidedDamage": "{{pokemonName}} wehrt Schaden mit {{abilityName}} ab!", + "perishBody": "Durch {{abilityName}} von {{pokemonName}} werden beide Pokémon nach drei Runden K.O. gehen!", + "poisonHeal": "{{abilityName}} von {{pokemonName}} füllte einige KP auf!", "trace": "{{pokemonName}} kopiert {{abilityName}} von {{targetName}}!", "windPowerCharged": "Der Treffer durch {{moveName}} läd die Stärke von {{pokemonName}} auf!", "quickDraw": "Durch Schnellschuss kann {{pokemonName}} schneller handeln als sonst!", + "blockItemTheft": "{{abilityName}} von {{pokemonNameWithAffix}} verhindert Item-Diebstahl!", + "typeImmunityHeal": "{{abilityName}} von {{pokemonNameWithAffix}} füllte einige KP auf!", + "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} vermeidet Schaden mit {{abilityName}}!", + "postDefendDisguise": "Die Tarnung von {{pokemonNameWithAffix}} ist aufgeflogen!!", + "moveImmunity": "Es hat keine Wirkung auf {{pokemonNameWithAffix}}...", + "reverseDrain": "{{pokemonNameWithAffix}} saugt Kloakensoße auf!", + "postDefendTypeChange": "{{abilityName}} von {{pokemonNameWithAffix}} macht es zu einem {{typeName}}-Typ!", + "postDefendContactDamage": "{{abilityName}} von {{pokemonNameWithAffix}} schadet seinem Angreifer!", + "postDefendAbilitySwap": "{{pokemonNameWithAffix}} tauscht Fähigkeiten mit dem Ziel!", + "postDefendAbilityGive": "{{pokemonNameWithAffix}} gibt seinem Ziel {{abilityName}}!", + "postDefendMoveDisable": "{{moveName}} von {{pokemonNameWithAffix}} wurde blockiert!", + "pokemonTypeChange": "{{pokemonNameWithAffix}} nimmt den Typ {{moveType}} an!", + "postAttackStealHeldItem": "{{pokemonNameWithAffix}} stiehlt {{stolenItemType}} von {{defenderName}}!", + "postDefendStealHeldItem": "{{pokemonNameWithAffix}} stiehlt {{stolenItemType}} von {{attackerName}}!", + "copyFaintedAllyAbility": "Die Fähigkeit {{abilityName}} von {{pokemonNameWithAffix}} wurde übernommen!", + "intimidateImmunity": "{{abilityName}} von {{pokemonNameWithAffix}} verhindert den Effekt von Bedroher!", + "postSummonAllyHeal": "{{pokemonNameWithAffix}} trinkt den von {{pokemonName}} zubereiteten Tee!", + "postSummonClearAllyStats": "Die Statusveränderungen von {{pokemonNameWithAffix}} wurden aufgehoben!", + "postSummonTransform": "{{pokemonNameWithAffix}} verwandelt sich in {{targetName}}!", + "protectStat": "{{abilityName}} von {{pokemonNameWithAffix}} verhindert das der Statuswert {{statName}} gesenkt wird!", + "statusEffectImmunityWithName": "{{abilityName}} von {{pokemonNameWithAffix}} verhindert {{statusEffectName}}!", + "statusEffectImmunity": "{{abilityName}} von {{pokemonNameWithAffix}} verhindert Statusprobleme", + "battlerTagImmunity": "{{abilityName}} von {{pokemonNameWithAffix}} verhindert {{battlerTagName}}!", + "forewarn": "Vorwarnung von {{pokemonNameWithAffix}}: Konzentraion auf {{moveName}}!", + "frisk": "{{pokemonNameWithAffix}} hat die Fähigkeit {{opponentAbilityName}} von {{opponentName}} erschnüffelt!", + "postWeatherLapseHeal": "{{abilityName}} von {{pokemonName}} füllte einige KP auf!", + "postWeatherLapseDamage": "{{pokemonNameWithAffix}} wurde durch {{abilityName}} verletzt!", + "postTurnLootCreateEatenBerry": "{{pokemonNameWithAffix}} hat {{berryName}} geerntet!", + "postTurnHeal": "{{abilityName}} von {{pokemonName}} füllte einige KP auf!", + "fetchBall": "{{pokemonNameWithAffix}} hat einen {{pokeballName}} gefunden!", + "healFromBerryUse": "{{abilityName}} von {{pokemonName}} füllte einige KP auf!", + "arenaTrap": "{{abilityName}} von {{pokemonNameWithAffix}} verhindert den Tausch!", + "postBattleLoot": "{{pokemonNameWithAffix}} hebt {{itemName}} auf!", + "postFaintContactDamage": "{{abilityName}} von {{pokemonNameWithAffix}} schadet seinem Angreifer!", + "postFaintHpDamage": "{{abilityName}} von {{pokemonNameWithAffix}} schadet seinem Angreifer!", + "postSummonPressure": "{{pokemonNameWithAffix}} setzt Gegner mit Erzwinger unter Druck!", + "postSummonMoldBreaker": "{{pokemonNameWithAffix}} gelingt es, gegnerische Fähigkeiten zu überbrücken!", + "postSummonAnticipation": "{{pokemonNameWithAffix}} erschaudert!", + "postSummonTurboblaze": "{{pokemonNameWithAffix}} strahlt eine lodernde Aura aus!", + "postSummonTeravolt": "{{pokemonNameWithAffix}} strahlt eine knisternde Aura aus!", + "postSummonDarkAura": "{{pokemonNameWithAffix}} strahlt eine dunkle Aura aus!", + "postSummonFairyAura": "{{pokemonNameWithAffix}} strahlt eine Feenaura aus!", + "postSummonNeutralizingGas": "Reaktionsgas von {{pokemonNameWithAffix}} hat sich in der Umgebung ausgebreitet!", + "postSummonAsOneGlastrier": "{{pokemonNameWithAffix}} verfügt über zwei Fähigkeiten!", + "postSummonAsOneSpectrier": "{{pokemonNameWithAffix}} verfügt über zwei Fähigkeiten!", + "postSummonVesselOfRuin": "Unheilsgefäß von {{pokemonNameWithAffix}} schwächt {{statName}} aller Pokémon im Umkreis!", + "postSummonSwordOfRuin": "Unheilsschwert von {{pokemonNameWithAffix}} schwächt {{statName} aller Pokémon im Umkreis!", + "postSummonTabletsOfRuin": "Unheilstafeln von {{pokemonNameWithAffix}} schwächt {{statName}} aller Pokémon im Umkreis!", + "postSummonBeadsOfRuin": "Unheilsjuwelen von {{pokemonNameWithAffix}} schwächt {{statName}} aller Pokémon im Umkreis!", } as const; diff --git a/src/locales/de/arena-flyout.ts b/src/locales/de/arena-flyout.ts new file mode 100644 index 00000000000..c353b432bc0 --- /dev/null +++ b/src/locales/de/arena-flyout.ts @@ -0,0 +1,49 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const arenaFlyout: SimpleTranslationEntries = { + // Title + "activeBattleEffects": "Aktive Kampfeffekte", + "player": "Spieler", + "neutral": "Neutral", + "enemy": "Gegner", + + // WeatherType + "sunny": "Sonne", + "rain": "Regen", + "sandstorm": "Sandsturm", + "hail": "Hagelsturm", + "snow": "Schneesturm", + "fog": "Nebel", + "heavyRain": "Strömender Regen", + "harshSun": "Sehr starker Sonnenschein", + "strongWinds": "Luftströmungen", + + // TerrainType + "misty": "Nebelfeld", + "electric": "Elektrofeld", + "grassy": "Grasfeld", + "psychic": "Psychofeld", + + // ArenaTagType + "mudSport": "Lehmsuhler", + "waterSport": "Nassmacher", + "spikes": "Stachler", + "toxicSpikes": "Giftspitzen", + "mist": "Weißnebel", + "futureSight": "Seher", + "doomDesire": "Kismetwunsch", + "wish": "Wunschtraum", + "stealthRock": "Tarnsteine", + "stickyWeb": "Klebenetz", + "trickRoom": "Bizarroraum", + "gravity": "Erdanziehung", + "reflect": "Reflektor", + "lightScreen": "Lichtschild", + "auroraVeil": "Auroraschleier", + "quickGuard": "Rapidschutz", + "wideGuard": "Rundumschutz", + "matBlock": "Tatami-Schild", + "craftyShield": "Trickschutz", + "tailwind": "Rückenwind", + "happyHour": "Goldene Zeiten", +}; diff --git a/src/locales/de/battle-info.ts b/src/locales/de/battle-info.ts new file mode 100644 index 00000000000..f24dad46c6c --- /dev/null +++ b/src/locales/de/battle-info.ts @@ -0,0 +1,5 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battleInfo: SimpleTranslationEntries = { + "generation": "Generation {{generation}}", +} as const; diff --git a/src/locales/de/battle.ts b/src/locales/de/battle.ts index 06b9ec719ba..a9686da7524 100644 --- a/src/locales/de/battle.ts +++ b/src/locales/de/battle.ts @@ -2,22 +2,22 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const battle: SimpleTranslationEntries = { "bossAppeared": "{{bossName}} erscheint.", - "trainerAppeared": "{{trainerName}}\nmöchte kämpfen!", - "trainerAppearedDouble": "{{trainerName}}\nmöchten kämpfen!", - "trainerSendOut": "{{trainerName}} setzt\n{{pokemonName}} ein!", + "trainerAppeared": "{{trainerName}} möchte kämpfen!", + "trainerAppearedDouble": "{{trainerName}} möchten kämpfen!", + "trainerSendOut": "{{trainerName}} setzt {{pokemonName}} ein!", "singleWildAppeared": "Ein wildes {{pokemonName}} erscheint!", - "multiWildAppeared": "Ein wildes {{pokemonName1}}\nund {{pokemonName2}} erscheinen!", + "multiWildAppeared": "Ein wildes {{pokemonName1}} und {{pokemonName2}} erscheinen!", "playerComeBack": "Komm zurück, {{pokemonName}}!", "trainerComeBack": "{{trainerName}} ruft {{pokemonName}} zurück!", "playerGo": "Los! {{pokemonName}}!", "trainerGo": "{{trainerName}} sendet {{pokemonName}} raus!", - "switchQuestion": "Möchtest du\n{{pokemonName}} auswechseln?", - "trainerDefeated": "{{trainerName}}\nwurde besiegt!", - "moneyWon": "Du gewinnst\n{{moneyAmount}} ₽!", + "switchQuestion": "Möchtest du {{pokemonName}} auswechseln?", + "trainerDefeated": "{{trainerName}} wurde besiegt!", + "moneyWon": "Du gewinnst {{moneyAmount}} ₽!", "moneyPickedUp": "Du hebst {{moneyAmount}} ₽ auf!", "pokemonCaught": "{{pokemonName}} wurde gefangen!", "addedAsAStarter": "{{pokemonName}} wurde als Starterpokémon hinzugefügt!", - "partyFull": "Dein Team ist voll.\nMöchtest du ein Pokémon durch {{pokemonName}} ersetzen?", + "partyFull": "Dein Team ist voll. Möchtest du ein Pokémon durch {{pokemonName}} ersetzen?", "pokemon": "Pokémon", "sendOutPokemon": "Los, {{pokemonName}}!", "hitResultCriticalHit": "Ein Volltreffer!", @@ -28,36 +28,36 @@ export const battle: SimpleTranslationEntries = { "attackFailed": "Es ist fehlgeschlagen!", "attackMissed": "Die Attacke hat {{pokemonNameWithAffix}} verfehlt!", "attackHitsCount": "{{count}}-mal getroffen!", - "rewardGain": "Du erhältst\n{{modifierName}}!", - "expGain": "{{pokemonName}} erhält\n{{exp}} Erfahrungspunkte!", - "levelUp": "{{pokemonName}} erreicht\nLv. {{level}}!", - "learnMove": "{{pokemonName}} erlernt\n{{moveName}}!", + "rewardGain": "Du erhältst {{modifierName}}!", + "expGain": "{{pokemonName}} erhält {{exp}} Erfahrungspunkte!", + "levelUp": "{{pokemonName}} erreicht Lv. {{level}}!", + "learnMove": "{{pokemonName}} erlernt {{moveName}}!", "learnMovePrompt": "{{pokemonName}} versucht, {{moveName}} zu erlernen.", - "learnMoveLimitReached": "Aber {{pokemonName}} kann nur\nmaximal vier Attacken erlernen.", - "learnMoveReplaceQuestion": "Soll eine bekannte Attacke durch\n{{moveName}} ersetzt werden?", - "learnMoveStopTeaching": "{{moveName}} nicht\nerlernen?", - "learnMoveNotLearned": "{{pokemonName}} hat\n{{moveName}} nicht erlernt.", + "learnMoveLimitReached": "Aber {{pokemonName}} kann nur maximal vier Attacken erlernen.", + "learnMoveReplaceQuestion": "Soll eine bekannte Attacke durch {{moveName}} ersetzt werden?", + "learnMoveStopTeaching": "{{moveName}} nicht erlernen?", + "learnMoveNotLearned": "{{pokemonName}} hat {{moveName}} nicht erlernt.", "learnMoveForgetQuestion": "Welche Attacke soll vergessen werden?", - "learnMoveForgetSuccess": "{{pokemonName}} hat\n{{moveName}} vergessen.", + "learnMoveForgetSuccess": "{{pokemonName}} hat {{moveName}} vergessen.", "countdownPoof": "@d{32}Eins, @d{15}zwei @d{15}und@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}schwupp!", "learnMoveAnd": "Und…", - "levelCapUp": "Die Levelbeschränkung\nwurde auf {{levelCap}} erhöht!", + "levelCapUp": "Die Levelbeschränkung wurde auf {{levelCap}} erhöht!", "moveNotImplemented": "{{moveName}} ist noch nicht implementiert und kann nicht ausgewählt werden.", - "moveNoPP": "Es sind keine AP für\ndiese Attacke mehr übrig!", + "moveNoPP": "Es sind keine AP für diese Attacke mehr übrig!", "moveDisabled": "{{moveName}} ist deaktiviert!", - "noPokeballForce": "Eine unsichtbare Kraft\nverhindert die Nutzung von Pokébällen.", - "noPokeballTrainer": "Du kannst das Pokémon\neines anderen Trainers nicht fangen!", - "noPokeballMulti": "Du kannst erst einen Pokéball werfen,\nwenn nur noch ein Pokémon übrig ist!", - "noPokeballStrong": "Das Ziel-Pokémon ist zu stark, um gefangen zu werden!\nDu musst es zuerst schwächen!", - "noEscapeForce": "Eine unsichtbare Kraft\nverhindert die Flucht.", - "noEscapeTrainer": "Du kannst nicht\naus einem Trainerkampf fliehen!", - "noEscapePokemon": "{{pokemonName}}'s {{moveName}}\nverhindert {{escapeVerb}}!", + "noPokeballForce": "Eine unsichtbare Kraft verhindert die Nutzung von Pokébällen.", + "noPokeballTrainer": "Du kannst das Pokémon eines anderen Trainers nicht fangen!", + "noPokeballMulti": "Du kannst erst einen Pokéball werfen, wenn nur noch ein Pokémon übrig ist!", + "noPokeballStrong": "Das Ziel-Pokémon ist zu stark, um gefangen zu werden! Du musst es zuerst schwächen!", + "noEscapeForce": "Eine unsichtbare Kraft verhindert die Flucht.", + "noEscapeTrainer": "Du kannst nicht aus einem Trainerkampf fliehen!", + "noEscapePokemon": "{{moveName}} von {{pokemonName}} verhindert {{escapeVerb}}!", "runAwaySuccess": "Du bist entkommen!", "runAwayCannotEscape": "Flucht gescheitert!", "escapeVerbSwitch": "auswechseln", "escapeVerbFlee": "flucht", "skipItemQuestion": "Bist du sicher, dass du kein Item nehmen willst?", - "notDisabled": "{{pokemonName}}'s {{moveName}} ist\nnicht mehr deaktiviert!", + "notDisabled": "{{moveName}} von {{pokemonName}} ist nicht mehr deaktiviert!", "turnEndHpRestore": "Die KP von {{pokemonName}} wurden wiederhergestellt.", "hpIsFull": "Die KP von {{pokemonName}} sind voll!", "eggHatching": "Oh?", @@ -67,17 +67,34 @@ export const battle: SimpleTranslationEntries = { "useMove": "{{pokemonNameWithAffix}} setzt {{moveName}} ein!", "drainMessage": "{{pokemonName}} wurde Energie abgesaugt", "regainHealth": "KP von {{pokemonName}} wurden wieder aufgefrischt!", - "stealEatBerry": "{{pokemonName}} stole and ate\n{{targetName}}'s {{berryName}}!", + "stealEatBerry": "{{pokemonName}} hat {{targetName}} seine {{berryName}} weggefuttert!", + "ppHealBerry": "{{berryName}} von {{pokemonNameWithAffix}} füllt AP von {{moveName}} auf!", + "hpHealBerry": "{{berryName}} füllt KP von {{pokemonNameWithAffix}} auf!", "fainted": "{{pokemonNameWithAffix}} wurde besiegt!", - "statRose": "{{stats}} von {{pokemonNameWithAffix}} steigt!", - "statSharplyRose": "{{stats}} von {{pokemonNameWithAffix}} steigt stark!", - "statRoseDrastically": "{{stats}} von {{pokemonNameWithAffix}} steigt drastisch!", - "statWontGoAnyHigher": "{{stats}} von {{pokemonNameWithAffix}} kann nicht weiter erhöht werden!", - "statFell": "{{stats}} von {{pokemonNameWithAffix}} sinkt!", - "statHarshlyFell": "{{stats}} von {{pokemonNameWithAffix}} sinkt stark!", - "statSeverelyFell": "{{stats}} von {{pokemonNameWithAffix}} sinkt drastisch!", - "statWontGoAnyLower": "{{stats}} von {{pokemonNameWithAffix}} kann nicht weiter sinken!", + "statsAnd": "und", + "stats": "Alle Werte", + "statRose_one": "{{stats}} von {{pokemonNameWithAffix}} steigt!", + "statRose_other": "{{stats}} von {{pokemonNameWithAffix}} steigen!", + "statSharplyRose_one": "{{stats}} von {{pokemonNameWithAffix}} steigt stark!", + "statSharplyRose_other": "{{stats}} von {{pokemonNameWithAffix}} steigen stark!", + "statRoseDrastically_one": "{{stats}} von {{pokemonNameWithAffix}} steigt drastisch!", + "statRoseDrastically_other": "{{stats}} von {{pokemonNameWithAffix}} steigen drastisch!", + "statWontGoAnyHigher_one": "{{stats}} von {{pokemonNameWithAffix}} kann nicht weiter erhöht werden!", + "statWontGoAnyHigher_other": "{{stats}} von {{pokemonNameWithAffix}} können nicht weiter erhöht werden!", + "statFell_one": "{{stats}} von {{pokemonNameWithAffix}} sinkt!", + "statFell_other": "{{stats}} von {{pokemonNameWithAffix}} sinken!", + "statHarshlyFell_one": "{{stats}} von {{pokemonNameWithAffix}} sinkt stark!", + "statHarshlyFell_other": "{{stats}} von {{pokemonNameWithAffix}} sinken stark!", + "statSeverelyFell_one": "{{stats}} von {{pokemonNameWithAffix}} sinkt drastisch!", + "statSeverelyFell_other": "{{stats}} von {{pokemonNameWithAffix}} sinken drastisch!", + "statWontGoAnyLower_one": "{{stats}} von {{pokemonNameWithAffix}} kann nicht weiter sinken!", + "statWontGoAnyLower_other": "{{stats}} von {{pokemonNameWithAffix}} können nicht weiter sinken!", + "transformedIntoType": "{{pokemonName}} transformed\ninto the {{type}} type!", "ppReduced": "{{moveName}} von {{targetName}} wird um {{reduction}} AP reduziert!", + "retryBattle": "Möchtest du vom Beginn des Kampfes neustarten?", + "unlockedSomething": "{{unlockedThing}} wurde freigeschaltet.", + "congratulations": "Glückwunsch!", + "beatModeFirstTime": "{{speciesName}} hat den {{gameMode}} Modus zum ersten Mal beendet! Du erhältst {{newModifier}}!", "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} kann sich wegen des Rückstoßes durch den Angriff nicht bewegen!", "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} kann nicht mehr fliehen!", "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} wurde von {{moveName}} befreit.", @@ -124,15 +141,19 @@ export const battle: SimpleTranslationEntries = { "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}} übersteht die Attacke!", "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}} übersteht die Attacke!", "battlerTagsPerishSongLapse": "Abgesang von {{pokemonNameWithAffix}} steht bei {{turnCount}}.", + "battlerTagsCenterOfAttentionOnAdd": "{{pokemonNameWithAffix}} zieht alle Aufmerksamkeit auf sich!", "battlerTagsTruantLapse": "{{pokemonNameWithAffix}} faulenzt!", "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}} kommt nicht in Fahrt!", "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}} kriegt schließlich doch noch die Kurve!", "battlerTagsHighestStatBoostOnAdd": "{{statName}} von {{pokemonNameWithAffix}} wird verstärkt!", "battlerTagsHighestStatBoostOnRemove": "Der Effekt von {{abilityName}} von {{pokemonNameWithAffix}} lässt nach!", + "battlerTagsMagnetRisenOnAdd": "{{pokemonNameWithAffix}} schwebt aufgrund von Elektromagnetismus!", + "battlerTagsMagnetRisenOnRemove": "Der Elektromagnetismus von {{pokemonNameWithAffix}} hört auf zu wirken!", "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}} läuft zu Hochtouren auf!", "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}} entspannt.", "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} wurde eingepökelt!", "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} wurde durch {{moveName}} verletzt!", "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}} nimmt einen Teil seiner KP und legt einen Fluch auf {{pokemonName}}!", - "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} wurde durch den Fluch verletzt!" + "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} wurde durch den Fluch verletzt!", + "battlerTagsStockpilingOnAdd": "{{pokemonNameWithAffix}} stockpiled {{stockpiledCount}}!" } as const; diff --git a/src/locales/de/battler-tags.ts b/src/locales/de/battler-tags.ts new file mode 100644 index 00000000000..2858d163dac --- /dev/null +++ b/src/locales/de/battler-tags.ts @@ -0,0 +1,12 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battlerTags: SimpleTranslationEntries = { + "trappedDesc": "Wechselsperre", + "flinchedDesc": "Zurückschrecken", + "confusedDesc": "Verwirrung", + "infatuatedDesc": "Verliebt", + "seedDesc": "Bepflanzt", + "nightmareDesc": "Nachtmahr", + "ingrainDesc": "Verwurzlung", + "drowsyDesc": "Schläfrigkeit", +} as const; diff --git a/src/locales/de/bgm-name.ts b/src/locales/de/bgm-name.ts index 1a6712b8608..2a247e51a44 100644 --- a/src/locales/de/bgm-name.ts +++ b/src/locales/de/bgm-name.ts @@ -74,16 +74,16 @@ export const bgmName: SimpleTranslationEntries = { "battle_wild": "SW Vs. Wilde Pokémon", "battle_wild_strong": "SW Vs. Starke Wilde Pokémon", "end_summit": "PMDDX Gipfel des Himmelturms", - "battle_rocket_grunt": "HGSS Team Rocket Battle", - "battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle", - "battle_galactic_grunt": "BDSP Team Galactic Battle", + "battle_rocket_grunt": "HGSS Vs. Team Rocket Rüpel", + "battle_aqua_magma_grunt": "ORAS Vs. Team Aqua & Magma", + "battle_galactic_grunt": "BDSP Vs. Team Galaktik Rüpel", "battle_plasma_grunt": "SW Vs. Team Plasma Rüpel", - "battle_flare_grunt": "XY Team Flare Battle", - "battle_rocket_boss": "USUM Giovanni Battle", - "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", - "battle_galactic_boss": "BDSP Cyrus Battle", - "battle_plasma_boss": "B2W2 Ghetsis Battle", - "battle_flare_boss": "XY Lysandre Battle", + "battle_flare_grunt": "XY Vs. Team Flare Rüpel", + "battle_rocket_boss": "USUM Vs. Giovanni", + "battle_aqua_magma_boss": "ORAS Vs. Team Aqua & Magma Boss", + "battle_galactic_boss": "BDSP Vs. Zyrus", + "battle_plasma_boss": "S2W2 Vs. G-Cis", + "battle_flare_boss": "XY Vs. Flordelis", // Biome Music "abyss": "PMD Erkundungsteam Himmel Dunkelkrater", @@ -110,9 +110,9 @@ export const bgmName: SimpleTranslationEntries = { "plains": "PMD Erkundungsteam Himmel Himmelsgipfel-Prärie", "power_plant": "PMD Erkundungsteam Himmel Weite Ampere-Ebene", "ruins": "PMD Erkundungsteam Himmel Tiefes Ruinenverlies", - "sea": "PMD Erkundungsteam Himmel Salzwasserhöhle", + "sea": "Andr06 - Marine Mystique", // Name defined by the composer "seabed": "Firel - Seabed", // The composer thinks about a more creative name - "slum": "PMD Erkundungsteam Himmel Himmelsgipfel-Küste", + "slum": "Andr06 - Sneaky Snom", // Name defined by the composer "snowy_forest": "PMD Erkundungsteam Himmel Himmelsgipfel-Schneefeld", "space": "Firel - Aether", "swamp": "PMD Erkundungsteam Himmel Ringmeer", diff --git a/src/locales/de/challenges.ts b/src/locales/de/challenges.ts index 176de9879b6..e5e8a96f3fd 100644 --- a/src/locales/de/challenges.ts +++ b/src/locales/de/challenges.ts @@ -23,4 +23,10 @@ export const challenges: TranslationEntries = { "desc_default": "Du kannst nur Pokémon des gewählten Typs verwenden." // types in pokemon-info }, + "freshStart": { + "name": "Neuanfang", + "desc": "Du kannst nur die ursprünglichen Starter verwenden, genau so, als hättest du gerade erst mit Pokérogue begonnen.", + "value.0": "Aus", + "value.1": "An", + } } as const; diff --git a/src/locales/de/config.ts b/src/locales/de/config.ts index ffbb2733205..940e3927bfd 100644 --- a/src/locales/de/config.ts +++ b/src/locales/de/config.ts @@ -1,8 +1,11 @@ import { ability } from "./ability"; import { abilityTriggers } from "./ability-trigger"; +import { arenaFlyout } from "./arena-flyout"; import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; +import { battleInfo } from "./battle-info"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; +import { battlerTags } from "./battler-tags"; import { berry } from "./berry"; import { bgmName } from "./bgm-name"; import { biome } from "./biome"; @@ -31,8 +34,10 @@ import { move } from "./move"; import { nature } from "./nature"; import { pokeball } from "./pokeball"; import { pokemon } from "./pokemon"; +import { pokemonForm } from "./pokemon-form"; import { pokemonInfo } from "./pokemon-info"; import { pokemonInfoContainer } from "./pokemon-info-container"; +import { pokemonSummary } from "./pokemon-summary"; import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler"; import { splashMessages } from "./splash-messages"; import { starterSelectUiHandler } from "./starter-select-ui-handler"; @@ -49,8 +54,11 @@ import { modifierSelectUiHandler } from "./modifier-select-ui-handler"; export const deConfig = { ability: ability, abilityTriggers: abilityTriggers, + arenaFlyout: arenaFlyout, battle: battle, + battleInfo: battleInfo, battleMessageUiHandler: battleMessageUiHandler, + battlerTags: battlerTags, berry: berry, bgmName: bgmName, biome: biome, @@ -80,8 +88,10 @@ export const deConfig = { nature: nature, pokeball: pokeball, pokemon: pokemon, + pokemonForm: pokemonForm, pokemonInfo: pokemonInfo, pokemonInfoContainer: pokemonInfoContainer, + pokemonSummary: pokemonSummary, saveSlotSelectUiHandler: saveSlotSelectUiHandler, settings: settings, splashMessages: splashMessages, diff --git a/src/locales/de/game-mode.ts b/src/locales/de/game-mode.ts index 72661bd4682..3347bbb565f 100644 --- a/src/locales/de/game-mode.ts +++ b/src/locales/de/game-mode.ts @@ -6,5 +6,5 @@ export const gameMode: SimpleTranslationEntries = { "endlessSpliced": "Endlos (Fusion)", "dailyRun": "Täglicher Run", "unknown": "Unbekannt", - "challenge": "Challenge", + "challenge": "Herausforderung", } as const; diff --git a/src/locales/de/menu-ui-handler.ts b/src/locales/de/menu-ui-handler.ts index 0338ba6f399..6d461d286af 100644 --- a/src/locales/de/menu-ui-handler.ts +++ b/src/locales/de/menu-ui-handler.ts @@ -18,6 +18,10 @@ export const menuUiHandler: SimpleTranslationEntries = { "exportSlotSelect": "Wähle einen Slot zum Exportieren.", "importData": "Daten importieren", "exportData": "Daten exportieren", + "linkDiscord": "Discord verbinden", + "unlinkDiscord": "Discord trennen", + "linkGoogle": "Google verbinden", + "unlinkGoogle": "Google trennen", "cancel": "Abbrechen", "losingProgressionWarning": "Du wirst jeglichen Fortschritt seit Anfang dieses Kampfes verlieren. Fortfahren?", "noEggs": "Du brütest aktuell keine Eier aus!" diff --git a/src/locales/de/menu.ts b/src/locales/de/menu.ts index cb8cf9a318a..bfc4c31efcb 100644 --- a/src/locales/de/menu.ts +++ b/src/locales/de/menu.ts @@ -17,6 +17,7 @@ export const menu: SimpleTranslationEntries = { "username": "Benutzername", "password": "Passwort", "login": "Anmelden", + "orUse": "Oder nutze", "register": "Registrieren", "emptyUsername": "Benutzername darf nicht leer sein.", "invalidLoginUsername": "Der eingegebene Benutzername ist ungültig.", @@ -53,5 +54,9 @@ export const menu: SimpleTranslationEntries = { "no":"Nein", "disclaimer": "HAFTUNGSAUSSCHLUSS", "disclaimerDescription": "Dieses Spiel ist ein unfertiges Produkt. Es kann spielbeinträchtigende Fehler (bis hin zum Verlust des Speicherstandes)\n aufweisen, sich ohne Vorankündigung ändern und es gibt keine Garantie dass es weiterentwickelt oder fertiggestellt wird.", + "choosePokemon": "Wähle ein Pokémon.", + "renamePokemon": "Pokémon umbennenen", + "rename": "Umbenennen", + "nickname": "Spitzname", "errorServerDown": "Ups! Es gab einen Fehler beim Versuch\nden Server zu kontaktieren\nLasse dieses Fenster offen\nDu wirst automatisch neu verbunden.", } as const; diff --git a/src/locales/de/modifier-type.ts b/src/locales/de/modifier-type.ts index d1019ec4270..90ac9413466 100644 --- a/src/locales/de/modifier-type.ts +++ b/src/locales/de/modifier-type.ts @@ -58,10 +58,10 @@ export const modifierType: ModifierTypeTranslationEntries = { description: "Erhöht die Stärke aller {{moveType}}-Attacken eines Pokémon um 20%.", }, "PokemonLevelIncrementModifierType": { - description: "Erhöht das Level eines Pokémon um 1.", + description: "Erhöht das Level eines Pokémon um {{levels}}.", }, "AllPokemonLevelIncrementModifierType": { - description: "Erhöht das Level aller Teammitglieder um 1.", + description: "Erhöht das Level aller Teammitglieder um {{levels}}.", }, "PokemonBaseStatBoosterModifierType": { description: "Erhöht den {{statName}} Basiswert des Trägers um 10%. Das Stapellimit erhöht sich, je höher dein IS-Wert ist.", @@ -153,6 +153,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "REVIVER_SEED": { name: "Belebersamen", description: "Belebt den Träger mit der Hälfte seiner KP wieder, sollte er durch einen direkten Treffer kampfunfähig werden." }, + "WHITE_HERB": { name: "Schlohkraut", description: "Ein Item zum Tragen. Es hebt einmalig jede negative Statuswertveränderung auf." }, + "ETHER": { name: "Äther" }, "MAX_ETHER": { name: "Top-Äther" }, @@ -182,6 +184,9 @@ export const modifierType: ModifierTypeTranslationEntries = { "SOOTHE_BELL": { name: "Sanftglocke" }, + "SCOPE_LENS": { name: "Scope-Linse", description: "Ein Item zum Tragen. Es erhöht die Volltrefferquote." }, + "LEEK": { name: "Lauchstange", description: "Ein Item, das von Porenta getragen werden kann. Diese lange Lauchstange erhöht die Volltrefferquote stark." }, + "EVIOLITE": { name: "Evolith", description: "Ein mysteriöser Klumpen, der die Vert. u. Spez.-Vert. von Pokémon erhöht, die sich noch entwickeln können." }, "SOUL_DEW": { name: "Seelentau", description: "Erhöht den Einfluss des Wesens eines Pokemon auf seine Werte um 10% (additiv)." }, @@ -208,7 +213,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "FOCUS_BAND": { name: "Fokusband", description: "Fügt eine 10% Chance hinzu, dass Angriffe die zur Kampfunfähigkeit führen mit 1 KP überlebt werden." }, - "QUICK_CLAW": { name: "Quick Claw", description: "Fügt eine 10% Change hinzu als erster anzugreifen. (Nach Prioritätsangriffen)." }, + "QUICK_CLAW": { name: "Flinkklaue", description: "Fügt eine 10% Change hinzu als erster anzugreifen. (Nach Prioritätsangriffen)." }, "KINGS_ROCK": { name: "King-Stein", description: "Fügt eine 10% Chance hinzu, dass der Gegner nach einem Angriff zurückschreckt." }, @@ -221,7 +226,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "BATON": { name: "Stab", description: "Ermöglicht das Weitergeben von Effekten beim Wechseln von Pokémon, wodurch auch Fallen umgangen werden." }, "SHINY_CHARM": { name: "Schillerpin", description: "Erhöht die Chance deutlich, dass ein wildes Pokémon ein schillernd ist." }, - "ABILITY_CHARM": { name: "Ability Charm", description: "Erhöht die Chance deutlich, dass ein wildes Pokémon eine versteckte Fähigkeit hat." }, + "ABILITY_CHARM": { name: "Fähigkeitspin", description: "Erhöht die Chance deutlich, dass ein wildes Pokémon eine versteckte Fähigkeit hat." }, "IV_SCANNER": { name: "IS-Scanner", description: "Erlaubt es die IS-Werte von wilden Pokémon zu scannen.\n(2 IS-Werte pro Staplung. Die besten IS-Werte zuerst)." }, diff --git a/src/locales/de/modifier.ts b/src/locales/de/modifier.ts index c1a282ee5f1..50b7e80b252 100644 --- a/src/locales/de/modifier.ts +++ b/src/locales/de/modifier.ts @@ -5,6 +5,7 @@ export const modifier: SimpleTranslationEntries = { "turnHealApply": "{{typeName}} von {{pokemonNameWithAffix}} füllt einige KP auf!", "hitHealApply": "{{typeName}} von {{pokemonNameWithAffix}} füllt einige KP auf!", "pokemonInstantReviveApply": "{{pokemonNameWithAffix}} wurde durch {{typeName}} wiederbelebt!", + "pokemonResetNegativeStatStageApply": "Die negative Statuswertveränderung von {{pokemonNameWithAffix}} wurde durch {{typeName}} aufgehoben!", "moneyInterestApply": "Du erhählst {{moneyAmount}} ₽ durch das Item {{typeName}}!", "turnHeldItemTransferApply": "{{itemName}} von {{pokemonNameWithAffix}} wurde durch {{typeName}} von {{pokemonName}} absorbiert!", "contactHeldItemTransferApply": "{{itemName}} von {{pokemonNameWithAffix}} wurde durch {{typeName}} von {{pokemonName}} geklaut!", diff --git a/src/locales/de/move-trigger.ts b/src/locales/de/move-trigger.ts new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/locales/de/move.ts b/src/locales/de/move.ts index 430b4f85ec3..f8e5f7c6ff5 100644 --- a/src/locales/de/move.ts +++ b/src/locales/de/move.ts @@ -2975,7 +2975,7 @@ export const move: MoveTranslationEntries = { }, "dynamaxCannon": { name: "Dynamax-Kanone", - effect: "Der Anwender schießt einen Strahl aus seinem Kern ab. Dynamaximierte Ziele erleiden doppelten Schaden." + effect: "Der Anwender schießt einen Strahl aus seinem Kern ab. Verursacht bis zu doppelt so viel Schaden, wenn das Level des Gegners höher als die Levelgrenze ist." }, "snipeShot": { name: "Präzisionsschuss", diff --git a/src/locales/de/party-ui-handler.ts b/src/locales/de/party-ui-handler.ts index 604efb83628..097b670c768 100644 --- a/src/locales/de/party-ui-handler.ts +++ b/src/locales/de/party-ui-handler.ts @@ -16,6 +16,7 @@ export const partyUiHandler: SimpleTranslationEntries = { "PASS_BATON": "Stafette nutzen", "UNPAUSE_EVOLUTION": "Entwicklung fortsetzen", "REVIVE": "Wiederbeleben", + "RENAME": "Umbenennen", "choosePokemon": "Wähle ein Pokémon.", "doWhatWithThisPokemon": "Was soll mit diesem Pokémon geschehen?", diff --git a/src/locales/de/pokemon-form.ts b/src/locales/de/pokemon-form.ts new file mode 100644 index 00000000000..ee4e3a8f9be --- /dev/null +++ b/src/locales/de/pokemon-form.ts @@ -0,0 +1,190 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const pokemonForm: SimpleTranslationEntries = { + // Battle forms + "mega": "Mega-{{pokemonName}}", + "mega-x": "Mega-{{pokemonName}} X", + "mega-y": "Mega-{{pokemonName}} Y", + "primal": "Proto-{{pokemonName}}", + "gigantamax": "G-Dyna-{{pokemonName}}", + "eternamax": "U-Dyna-{{pokemonName}}", + + // Starters forms + // 1G + "pikachuCosplay": "Cosplay", + "pikachuCoolCosplay": "Rocker-Pikachu", + "pikachuBeautyCosplay": "Damen-Pikachu", + "pikachuCuteCosplay": "Star-Pikachu", + "pikachuSmartCosplay": "Professoren-Pikachu", + "pikachuToughCosplay": "Wrestler-Pikachu", + "pikachuPartner": "Partner-Pikachu", + "eeveePartner": "Partner-Evoli", + // 2G + "pichuSpiky": "Strubbelohr-Pichu", + "unownA": "A", + "unownB": "B", + "unownC": "C", + "unownD": "D", + "unownE": "E", + "unownF": "F", + "unownG": "G", + "unownH": "H", + "unownI": "I", + "unownJ": "J", + "unownK": "K", + "unownL": "L", + "unownM": "M", + "unownN": "N", + "unownO": "O", + "unownP": "P", + "unownQ": "Q", + "unownR": "R", + "unownS": "S", + "unownT": "T", + "unownU": "U", + "unownV": "V", + "unownW": "W", + "unownX": "X", + "unownY": "Y", + "unownZ": "Z", + "unownExclamation": "!", + "unownQuestion": "?", + // 3G + "castformSunny": "Sonnenform", + "castformRainy": "Regenform", + "castformSnowy": "Schneeform", + "deoxysNormal": "Normalform", + // 4G + "burmyPlant": "Pflanzenumhang", + "burmySandy": "Sandumhang", + "burmyTrash": "Lumpenumhang", + "shellosEast": "Östliches Meer", + "shellosWest": "Westliches Meer", + "rotomHeat": "Hitze-Rotom", + "rotomWash": "Wasch-Rotom", + "rotomFrost": "Frost-Rotom", + "rotomFan": "Wirbel-Rotom", + "rotomMow": "Schneid-Rotom", + "giratinaAltered": "Wandelform", + "shayminLand": "Landform", + // 5G + "basculinRedStriped": "Rotlinige Form", + "basculinBlueStriped": "Blaulinige Form", + "basculinWhiteStriped": "Weißlinige Form", + "deerlingSpring": "Frühlingsform", + "deerlingSummer": "Sommerform", + "deerlingAutumn": "Herbstform", + "deerlingWinter": "Winterform", + "tornadusIncarnate": "Inkarnationsform", + "thundurusIncarnate": "Inkarnationsform", + "landorusIncarnate": "Inkarnationsform", + "keldeoOrdinary": "Standardform", + "meloettaAria": "Gesangsform", + // 6G + "froakieBattleBond": "Ash-Form", + "scatterbugMeadow": "Blumenmeermuster", + "scatterbugIcySnow": "Frostmuster", + "scatterbugPolar": "Schneefeldmuster", + "scatterbugTundra": "Flockenmuster", + "scatterbugContinental": "Kontinentalmuster", + "scatterbugGarden": "Ziergartenmuster", + "scatterbugElegant": "Prunkmuster", + "scatterbugModern": "Innovationsmuster", + "scatterbugMarine": "Aquamarinmuster", + "scatterbugArchipelago": "Archipelmuster", + "scatterbugHighPlains": "Dürrmuster", + "scatterbugSandstorm": "Sandmuster", + "scatterbugRiver": "Flussdeltamuster", + "scatterbugMonsoon": "Monsunmuster", + "scatterbugSavanna": "Savannenmuster", + "scatterbugSun": "Sonnenmuster", + "scatterbugOcean": "Ozeanmuster", + "scatterbugJungle": "Dschungelmuster", + "scatterbugFancy": "Fantasiemuster", + "scatterbugPokeBall": "Pokéball-Muster", + "flabebeRed": "Rotblütler", + "flabebeYellow": "Gelbblütler", + "flabebeOrange": "Orangeblütler", + "flabebeBlue": "Blaublütler", + "flabebeWhite": "Weißblütler", + "furfrouHeart": "Herzchenschnitt", + "furfrouStar": "Sternchenschnitt", + "furfrouDiamond": "Diamantenschitt", + "furfrouDebutante": "Fräuleinschnitt", + "furfrouMatron": "Damenschnitt", + "furfrouDandy": "Kavalierschnitt", + "furfrouLaReine": "Königinnenschnitt", + "furfrouKabuki": "Kabuki-Schnitt", + "furfrouPharaoh": "Herrscherschnitt", + "pumpkabooSmall": "Größe S", + "pumpkabooLarge": "Größe L", + "pumpkabooSuper": "Größe XL", + "xerneasNeutral": "Ruhe-Modus", + "xerneasActive": "Aktiv-Modus", + "zygarde50": "50% Form", + "zygarde10": "10% Form", + "zygarde50Pc": "50% Form Scharwandel", + "zygarde10Pc": "10% Form Scharwandel", + "zygardeComplete": "Optimum-Form", + // 7G + "oricorioBaile": "Flamenco-Stil", + "oricorioPompom": "Cheerleading-Stil", + "oricorioPau": "Hula-Stil", + "oricorioSensu": "Buyo-Stil", + "rockruffOwnTempo": "Gleichmut", + "miniorRedMeteor": "Rote-Meteorform", + "miniorOrangeMeteor": "Oranger-Meteorform", + "miniorYellowMeteor": "Gelber-Meteorform", + "miniorGreenMeteor": "Grüner-Meteorform", + "miniorBlueMeteor": "Hellblaue-Meteorform", + "miniorIndigoMeteor": "Blaue-Meteorform", + "miniorVioletMeteor": "Violette-Meteorform", + "miniorRed": "Roter Kern", + "miniorOrange": "Oranger Kern", + "miniorYellow": "Gelber Kern", + "miniorGreen": "Grüner Kern", + "miniorBlue": "Hellblauer Kern", + "miniorIndigo": "Blauer Kern", + "miniorViolet": "Violetter Kern", + "mimikyuDisguised": "Verkleidete Form", + "mimikyuBusted": "Entlarvte Form", + "magearnaOriginal": "Originalfarbe", + "marshadowZenith": "Zenitform", + // 8G + "sinisteaPhony": "Fälschungsform", + "sinisteaAntique": "Originalform", + "eiscueNoIce": "Wohlfühlkopf", + "indeedeeMale": "männlich", + "indeedeeFemale": "weiblich", + "morpekoFullBelly": "Pappsattmuster", + "zacianHeroOfManyBattles": "Heldenhafter Krieger", + "zamazentaHeroOfManyBattles": "Heldenhafter Krieger", + "zarudeDada": "Papa", + "enamorusIncarnate": "Inkarnationsform", + // 9G + "squawkabillyGreenPlumage": "Grüngefiedert", + "squawkabillyBluePlumage": "Blaugefiedert", + "squawkabillyYellowPlumage": "Gelbgefiedert", + "squawkabillyWhitePlumage": "Weißgefiedert", + "tatsugiriCurly": "Gebogene Form", + "tatsugiriDroopy": "Hängende Form", + "tatsugiriStretchy": "Gestrekte Form", + "gimmighoulChest": "Truhenform", + "gimmighoulRoaming": "Wanderform", + "koraidonApexBuild": "Vollkommene Gestalt", + "koraidonLimitedBuild":"Gehemmte Gestalt", + "koraidonSprintingBuild":"Sprintgestalt", + "koraidonSwimmingBuild":"Schwimmgestalt", + "koraidonGlidingBuild":"Schwingengestalt", + "miraidonUltimateMode":"Kompletter Modus", + "miraidonLowPowerMode":"Begrenzter Modus", + "miraidonDriveMode":"Fahrmodus", + "miraidonAquaticMode":"Wassermodus", + "miraidonGlideMode":"Gleitmodus", + "poltchageistCounterfeit": "Imitationsform", + "poltchageistArtisan": "Kostbarkeitsform", + "paldeaTaurosCombat": "Gefechtsvariante", + "paldeaTaurosBlaze": "Flammenvariante", + "paldeaTaurosAqua": "Flutenvariante", + +} as const; diff --git a/src/locales/de/pokemon-summary.ts b/src/locales/de/pokemon-summary.ts new file mode 100644 index 00000000000..69683d4d4a0 --- /dev/null +++ b/src/locales/de/pokemon-summary.ts @@ -0,0 +1,20 @@ +import { TranslationEntries } from "#app/interfaces/locales"; + +export const pokemonSummary: TranslationEntries = { + "pokemonInfo": "Pokémon Info", + "status": "Status", + "powerAccuracyCategory": "Stärke\nGenauigkeit\nKategorie", + "type": "Typ", + "unknownTrainer": "Unbekannt", + "ot": "OT", + "nature": "Wesen", + "expPoints": "Erf. Punkte", + "nextLv": "Nächstes Lvl.", + "cancel": "Abbrechen", + + "memoString": "Wesen: {{natureFragment}}\n{{metFragment}}", + "metFragment": { + "normal": "Herkunft: {{biome}}\nMit Lv. {{level}} erhalten.", + "apparently": "Herkunft: {{biome}}\nOffenbar mit Lv. {{level}} erhalten.", + }, +} as const; diff --git a/src/locales/de/save-slot-select-ui-handler.ts b/src/locales/de/save-slot-select-ui-handler.ts index b6577cd574a..47069d62780 100644 --- a/src/locales/de/save-slot-select-ui-handler.ts +++ b/src/locales/de/save-slot-select-ui-handler.ts @@ -4,6 +4,6 @@ export const saveSlotSelectUiHandler: SimpleTranslationEntries = { "overwriteData": "Den ausgewählten Speicherstand überschreiben?", "loading": "Läd...", "wave": "Welle", - "lv": "Lvl", + "lv": "Lv. ", "empty": "Leer", } as const; diff --git a/src/locales/de/settings.ts b/src/locales/de/settings.ts index 0254611b5d5..227b8f97581 100644 --- a/src/locales/de/settings.ts +++ b/src/locales/de/settings.ts @@ -96,4 +96,5 @@ export const settings: SimpleTranslationEntries = { "controller": "Controller", "gamepadSupport": "Controllerunterstützung", "showBgmBar": "Musiknamen anzeigen", + "shopOverlayOpacity": "Shop Overlay Deckkraft", } as const; diff --git a/src/locales/de/splash-messages.ts b/src/locales/de/splash-messages.ts index f5ab8572b7b..a521d96057d 100644 --- a/src/locales/de/splash-messages.ts +++ b/src/locales/de/splash-messages.ts @@ -34,4 +34,5 @@ export const splashMessages: SimpleTranslationEntries = { "alsoTryRadicalRed": "Versuche auch Radical Red!", "eeveeExpo": "Evoli-Expo!", "ynoproject": "YNO-Projekt!", + "breedersInSpace": "Züchter im Weltall!", } as const; diff --git a/src/locales/de/starter-select-ui-handler.ts b/src/locales/de/starter-select-ui-handler.ts index 92ead61ebe7..9cf08846401 100644 --- a/src/locales/de/starter-select-ui-handler.ts +++ b/src/locales/de/starter-select-ui-handler.ts @@ -7,6 +7,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; */ export const starterSelectUiHandler: SimpleTranslationEntries = { "confirmStartTeam": "Mit diesen Pokémon losziehen?", + "invalidParty": "This is not a valid starting party!", "gen1": "I", "gen2": "II", "gen3": "III", diff --git a/src/locales/en/ability-trigger.ts b/src/locales/en/ability-trigger.ts index b516bc8dde0..8e35ea4deb9 100644 --- a/src/locales/en/ability-trigger.ts +++ b/src/locales/en/ability-trigger.ts @@ -10,4 +10,53 @@ export const abilityTriggers: SimpleTranslationEntries = { "trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!", "windPowerCharged": "Being hit by {{moveName}} charged {{pokemonName}} with power!", "quickDraw": "{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", + "blockItemTheft": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents item theft!", + "typeImmunityHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!", + "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} avoided damage\nwith {{abilityName}}!", + "postDefendDisguise": "{{pokemonNameWithAffix}}'s disguise was busted!", + "moveImmunity": "It doesn't affect {{pokemonNameWithAffix}}!", + "reverseDrain": "{{pokemonNameWithAffix}} sucked up the liquid ooze!", + "postDefendTypeChange": "{{pokemonNameWithAffix}}'s {{abilityName}}\nmade it the {{typeName}} type!", + "postDefendContactDamage": "{{pokemonNameWithAffix}}'s {{abilityName}}\nhurt its attacker!", + "postDefendAbilitySwap": "{{pokemonNameWithAffix}} swapped\nabilities with its target!", + "postDefendAbilityGive": "{{pokemonNameWithAffix}} gave its target\n{{abilityName}}!", + "postDefendMoveDisable": "{{pokemonNameWithAffix}}'s {{moveName}}\nwas disabled!", + "pokemonTypeChange": "{{pokemonNameWithAffix}} transformed into the {{moveType}} type!", + "postAttackStealHeldItem": "{{pokemonNameWithAffix}} stole\n{{defenderName}}'s {{stolenItemType}}!", + "postDefendStealHeldItem": "{{pokemonNameWithAffix}} stole\n{{attackerName}}'s {{stolenItemType}}!", + "copyFaintedAllyAbility": "{{pokemonNameWithAffix}}'s {{abilityName}} was taken over!", + "intimidateImmunity": "{{pokemonNameWithAffix}}'s {{abilityName}} prevented it from being Intimidated!", + "postSummonAllyHeal": "{{pokemonNameWithAffix}} drank down all the\nmatcha that {{pokemonName}} made!", + "postSummonClearAllyStats": "{{pokemonNameWithAffix}}'s stat changes\nwere removed!", + "postSummonTransform": "{{pokemonNameWithAffix}} transformed\ninto {{targetName}}!", + "protectStat": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents lowering its {{statName}}!", + "statusEffectImmunityWithName": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents {{statusEffectName}}!", + "statusEffectImmunity": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents status problems!", + "battlerTagImmunity": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents {{battlerTagName}}!", + "forewarn": "{{pokemonNameWithAffix}} was forewarned about {{moveName}}!", + "frisk": "{{pokemonNameWithAffix}} frisked {{opponentName}}'s {{opponentAbilityName}}!", + "postWeatherLapseHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!", + "postWeatherLapseDamage": "{{pokemonNameWithAffix}} is hurt\nby its {{abilityName}}!", + "postTurnLootCreateEatenBerry": "{{pokemonNameWithAffix}} harvested one {{berryName}}!", + "postTurnHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!", + "fetchBall": "{{pokemonNameWithAffix}} found a\n{{pokeballName}}!", + "healFromBerryUse": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP!", + "arenaTrap": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents switching!", + "postBattleLoot": "{{pokemonNameWithAffix}} picked up\n{{itemName}}!", + "postFaintContactDamage": "{{pokemonNameWithAffix}}'s {{abilityName}}\nhurt its attacker!", + "postFaintHpDamage": "{{pokemonNameWithAffix}}'s {{abilityName}}\nhurt its attacker!", + "postSummonPressure": "{{pokemonNameWithAffix}} is exerting its Pressure!", + "postSummonMoldBreaker": "{{pokemonNameWithAffix}} breaks the mold!", + "postSummonAnticipation": "{{pokemonNameWithAffix}} shuddered!", + "postSummonTurboblaze": "{{pokemonNameWithAffix}} is radiating a blazing aura!", + "postSummonTeravolt": "{{pokemonNameWithAffix}} is radiating a bursting aura!", + "postSummonDarkAura": "{{pokemonNameWithAffix}} is radiating a Dark Aura!", + "postSummonFairyAura": "{{pokemonNameWithAffix}} is radiating a Fairy Aura!", + "postSummonNeutralizingGas": "{{pokemonNameWithAffix}}'s Neutralizing Gas filled the area!", + "postSummonAsOneGlastrier": "{{pokemonNameWithAffix}} has two Abilities!", + "postSummonAsOneSpectrier": "{{pokemonNameWithAffix}} has two Abilities!", + "postSummonVesselOfRuin": "{{pokemonNameWithAffix}}'s Vessel of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", + "postSummonSwordOfRuin": "{{pokemonNameWithAffix}}'s Sword of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", + "postSummonTabletsOfRuin": "{{pokemonNameWithAffix}}'s Tablets of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", + "postSummonBeadsOfRuin": "{{pokemonNameWithAffix}}'s Beads of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", } as const; diff --git a/src/locales/en/achv.ts b/src/locales/en/achv.ts index bff75344ea5..3063488c659 100644 --- a/src/locales/en/achv.ts +++ b/src/locales/en/achv.ts @@ -264,6 +264,10 @@ export const PGMachv: AchievementTranslationEntries = { "MONO_FAIRY": { name: "Hey! Listen!", }, + "FRESH_START": { + name: "First Try!", + description: "Complete the fresh start challenge." + } } as const; // Achievement translations for the when the player character is female (it for now uses the same translations as the male version) diff --git a/src/locales/en/arena-flyout.ts b/src/locales/en/arena-flyout.ts new file mode 100644 index 00000000000..8a31d37b10c --- /dev/null +++ b/src/locales/en/arena-flyout.ts @@ -0,0 +1,49 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const arenaFlyout: SimpleTranslationEntries = { + // Title + "activeBattleEffects": "Active Battle Effects", + "player": "Player", + "neutral": "Neutral", + "enemy": "Enemy", + + // WeatherType + "sunny": "Sunny", + "rain": "Rain", + "sandstorm": "Sandstorm", + "hail": "Hail", + "snow": "Snow", + "fog": "Fog", + "heavyRain": "Heavy Rain", + "harshSun": "Harsh Sun", + "strongWinds": "Strong Winds", + + // TerrainType + "misty": "Misty Terrain", + "electric": "Electric Terrain", + "grassy": "Grassy Terrain", + "psychic": "Psychic Terrain", + + // ArenaTagType + "mudSport": "Mud Sport", + "waterSport": "Water Sport", + "spikes": "Spikes", + "toxicSpikes": "Toxic Spikes", + "mist": "Mist", + "futureSight": "Future Sight", + "doomDesire": "Doom Desire", + "wish": "Wish", + "stealthRock": "Stealth Rock", + "stickyWeb": "Sticky Web", + "trickRoom": "Trick Room", + "gravity": "Gravity", + "reflect": "Reflect", + "lightScreen": "Light Screen", + "auroraVeil": "Aurora Veil", + "quickGuard": "Quick Guard", + "wideGuard": "Wide Guard", + "matBlock": "Mat Block", + "craftyShield": "Crafty Shield", + "tailwind": "Tailwind", + "happyHour": "Happy Hour", +}; diff --git a/src/locales/en/battle-info.ts b/src/locales/en/battle-info.ts new file mode 100644 index 00000000000..f24dad46c6c --- /dev/null +++ b/src/locales/en/battle-info.ts @@ -0,0 +1,5 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battleInfo: SimpleTranslationEntries = { + "generation": "Generation {{generation}}", +} as const; diff --git a/src/locales/en/battle.ts b/src/locales/en/battle.ts index d4dfb9ba525..ae276f43d62 100644 --- a/src/locales/en/battle.ts +++ b/src/locales/en/battle.ts @@ -73,15 +73,32 @@ export const battle: SimpleTranslationEntries = { "drainMessage": "{{pokemonName}} had its\nenergy drained!", "regainHealth": "{{pokemonName}} regained\nhealth!", "stealEatBerry": "{{pokemonName}} stole and ate\n{{targetName}}'s {{berryName}}!", + "ppHealBerry": "{{pokemonNameWithAffix}} restored PP to its move {{moveName}}\nusing its {{berryName}}!", + "hpHealBerry": "{{pokemonNameWithAffix}} restored its health using\nits {{berryName}}!", "fainted": "{{pokemonNameWithAffix}} fainted!", - "statRose": "{{pokemonNameWithAffix}}'s {{stats}} rose!", - "statSharplyRose": "{{pokemonNameWithAffix}}'s {{stats}} sharply rose!", - "statRoseDrastically": "{{pokemonNameWithAffix}}'s {{stats}} rose drastically!", - "statWontGoAnyHigher": "{{pokemonNameWithAffix}}'s {{stats}} won't go any higher!", - "statFell": "{{pokemonNameWithAffix}}'s {{stats}} fell!", - "statHarshlyFell": "{{pokemonNameWithAffix}}'s {{stats}} harshly fell!", - "statSeverelyFell": "{{pokemonNameWithAffix}}'s {{stats}} severely fell!", - "statWontGoAnyLower": "{{pokemonNameWithAffix}}'s {{stats}} won't go any lower!", + "statsAnd": "and", + "stats": "Stats", + "statRose_one": "{{pokemonNameWithAffix}}'s {{stats}} rose!", + "statRose_other": "{{pokemonNameWithAffix}}'s {{stats}} rose!", + "statSharplyRose_one": "{{pokemonNameWithAffix}}'s {{stats}} sharply rose!", + "statSharplyRose_other": "{{pokemonNameWithAffix}}'s {{stats}} sharply rose!", + "statRoseDrastically_one": "{{pokemonNameWithAffix}}'s {{stats}} rose drastically!", + "statRoseDrastically_other": "{{pokemonNameWithAffix}}'s {{stats}} rose drastically!", + "statWontGoAnyHigher_one": "{{pokemonNameWithAffix}}'s {{stats}} won't go any higher!", + "statWontGoAnyHigher_other": "{{pokemonNameWithAffix}}'s {{stats}} won't go any higher!", + "statFell_one": "{{pokemonNameWithAffix}}'s {{stats}} fell!", + "statFell_other": "{{pokemonNameWithAffix}}'s {{stats}} fell!", + "statHarshlyFell_one": "{{pokemonNameWithAffix}}'s {{stats}} harshly fell!", + "statHarshlyFell_other": "{{pokemonNameWithAffix}}'s {{stats}} harshly fell!", + "statSeverelyFell_one": "{{pokemonNameWithAffix}}'s {{stats}} severely fell!", + "statSeverelyFell_other": "{{pokemonNameWithAffix}}'s {{stats}} severely fell!", + "statWontGoAnyLower_one": "{{pokemonNameWithAffix}}'s {{stats}} won't go any lower!", + "statWontGoAnyLower_other": "{{pokemonNameWithAffix}}'s {{stats}} won't go any lower!", + "transformedIntoType": "{{pokemonName}} transformed\ninto the {{type}} type!", + "retryBattle": "Would you like to retry from the start of the battle?", + "unlockedSomething": "{{unlockedThing}}\nhas been unlocked.", + "congratulations": "Congratulations!", + "beatModeFirstTime": "{{speciesName}} beat {{gameMode}} Mode for the first time!\nYou received {{newModifier}}!", "ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!", "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} must\nrecharge!", "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} can no\nlonger escape!", @@ -129,16 +146,20 @@ export const battle: SimpleTranslationEntries = { "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}} endured\nthe hit!", "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}} endured\nthe hit!", "battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}}'s perish count fell to {{turnCount}}.", + "battlerTagsCenterOfAttentionOnAdd": "{{pokemonNameWithAffix}} became the center\nof attention!", "battlerTagsTruantLapse": "{{pokemonNameWithAffix}} is\nloafing around!", "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}} can't\nget it going!", "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}} finally\ngot its act together!", "battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}'s {{statName}}\nwas heightened!", "battlerTagsHighestStatBoostOnRemove": "The effects of {{pokemonNameWithAffix}}'s\n{{abilityName}} wore off!", + "battlerTagsMagnetRisenOnAdd": "{{pokemonNameWithAffix}} levitated with electromagnetism!", + "battlerTagsMagnetRisenOnRemove": "{{pokemonNameWithAffix}}'s electromagnetism wore off!", "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}} is getting\npumped!", "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}} relaxed.", "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} is being salt cured!", "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} is hurt by {{moveName}}!", "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}} cut its own HP and put a curse on the {{pokemonName}}!", "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} is afflicted by the Curse!", + "battlerTagsStockpilingOnAdd": "{{pokemonNameWithAffix}} stockpiled {{stockpiledCount}}!", "mysteryEncounterAppeared": "What's this?" } as const; diff --git a/src/locales/en/battler-tags.ts b/src/locales/en/battler-tags.ts new file mode 100644 index 00000000000..1d897c70f3d --- /dev/null +++ b/src/locales/en/battler-tags.ts @@ -0,0 +1,12 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battlerTags: SimpleTranslationEntries = { + "trappedDesc": "trapping", + "flinchedDesc": "flinching", + "confusedDesc": "confusion", + "infatuatedDesc": "infatuation", + "seedDesc": "seeding", + "nightmareDesc": "nightmares", + "ingrainDesc": "roots", + "drowsyDesc": "drowsiness", +} as const; diff --git a/src/locales/en/bgm-name.ts b/src/locales/en/bgm-name.ts index 87d90dabc9d..01fb86b281d 100644 --- a/src/locales/en/bgm-name.ts +++ b/src/locales/en/bgm-name.ts @@ -110,9 +110,9 @@ export const bgmName: SimpleTranslationEntries = { "plains": "PMD EoS Sky Peak Prairie", "power_plant": "PMD EoS Far Amp Plains", "ruins": "PMD EoS Deep Sealed Ruin", - "sea": "PMD EoS Brine Cave", + "sea": "Andr06 - Marine Mystique", // Name defined by the composer "seabed": "Firel - Seabed", // The composer thinks about a more creative name - "slum": "PMD EoS Sky Peak Coast", + "slum": "Andr06 - Sneaky Snom", // Name defined by the composer "snowy_forest": "PMD EoS Sky Peak Snowfield", "space": "Firel - Aether", "swamp": "PMD EoS Surrounded Sea", diff --git a/src/locales/en/challenges.ts b/src/locales/en/challenges.ts index a40f05a0843..a3b45d31792 100644 --- a/src/locales/en/challenges.ts +++ b/src/locales/en/challenges.ts @@ -23,4 +23,10 @@ export const challenges: TranslationEntries = { "desc_default": "You can only use Pokémon of the chosen type." //types in pokemon-info }, + "freshStart": { + "name": "Fresh Start", + "desc": "You can only use the original starters, and only as if you had just started pokerogue.", + "value.0": "Off", + "value.1": "On", + } } as const; diff --git a/src/locales/en/config.ts b/src/locales/en/config.ts index 1aa7a8d06ba..71158a470aa 100644 --- a/src/locales/en/config.ts +++ b/src/locales/en/config.ts @@ -2,9 +2,12 @@ import { common } from "./common.js"; import { settings } from "./settings.js"; import { ability } from "./ability"; import { abilityTriggers } from "./ability-trigger"; +import { arenaFlyout } from "./arena-flyout"; import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; +import { battleInfo } from "./battle-info"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; +import { battlerTags } from "./battler-tags"; import { berry } from "./berry"; import { bgmName } from "./bgm-name"; import { biome } from "./biome"; @@ -35,8 +38,10 @@ import { nature } from "./nature"; import { partyUiHandler } from "./party-ui-handler"; import { pokeball } from "./pokeball"; import { pokemon } from "./pokemon"; +import { pokemonForm } from "./pokemon-form"; import { pokemonInfo } from "./pokemon-info"; import { pokemonInfoContainer } from "./pokemon-info-container"; +import { pokemonSummary } from "./pokemon-summary"; import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler"; import { splashMessages } from "./splash-messages"; import { starterSelectUiHandler } from "./starter-select-ui-handler"; @@ -50,8 +55,11 @@ import { modifierSelectUiHandler } from "./modifier-select-ui-handler"; export const enConfig = { ability: ability, abilityTriggers: abilityTriggers, + arenaFlyout: arenaFlyout, battle: battle, + battleInfo: battleInfo, battleMessageUiHandler: battleMessageUiHandler, + battlerTags: battlerTags, berry: berry, bgmName: bgmName, biome: biome, @@ -82,8 +90,10 @@ export const enConfig = { nature: nature, pokeball: pokeball, pokemon: pokemon, + pokemonForm: pokemonForm, pokemonInfo: pokemonInfo, pokemonInfoContainer: pokemonInfoContainer, + pokemonSummary: pokemonSummary, saveSlotSelectUiHandler: saveSlotSelectUiHandler, settings: settings, splashMessages: splashMessages, diff --git a/src/locales/en/menu-ui-handler.ts b/src/locales/en/menu-ui-handler.ts index 97d6e38a099..6eb680544ed 100644 --- a/src/locales/en/menu-ui-handler.ts +++ b/src/locales/en/menu-ui-handler.ts @@ -18,6 +18,10 @@ export const menuUiHandler: SimpleTranslationEntries = { "exportSlotSelect": "Select a slot to export from.", "importData": "Import Data", "exportData": "Export Data", + "linkDiscord": "Link Discord", + "unlinkDiscord": "Unlink Discord", + "linkGoogle": "Link Google", + "unlinkGoogle": "Unlink Google", "cancel": "Cancel", "losingProgressionWarning": "You will lose any progress since the beginning of the battle. Proceed?", "noEggs": "You are not hatching\nany eggs at the moment!" diff --git a/src/locales/en/menu.ts b/src/locales/en/menu.ts index 542399fee51..fe4d96c5120 100644 --- a/src/locales/en/menu.ts +++ b/src/locales/en/menu.ts @@ -17,6 +17,7 @@ export const menu: SimpleTranslationEntries = { "username": "Username", "password": "Password", "login": "Login", + "orUse": "Or use", "register": "Register", "emptyUsername": "Username must not be empty", "invalidLoginUsername": "The provided username is invalid", @@ -53,5 +54,9 @@ export const menu: SimpleTranslationEntries = { "no":"No", "disclaimer": "DISCLAIMER", "disclaimerDescription": "This game is an unfinished product; it might have playability issues (including the potential loss of save data),\n change without notice, and may or may not be updated further or completed.", + "choosePokemon": "Choose a Pokémon.", + "renamePokemon": "Rename Pokémon", + "rename": "Rename", + "nickname": "Nickname", "errorServerDown": "Oops! There was an issue contacting the server.\n\nYou may leave this window open,\nthe game will automatically reconnect.", } as const; diff --git a/src/locales/en/modifier-type.ts b/src/locales/en/modifier-type.ts index 7f8ca139e77..aee0f17334d 100644 --- a/src/locales/en/modifier-type.ts +++ b/src/locales/en/modifier-type.ts @@ -58,10 +58,10 @@ export const modifierType: ModifierTypeTranslationEntries = { description: "Increases the power of a Pokémon's {{moveType}}-type moves by 20%.", }, "PokemonLevelIncrementModifierType": { - description: "Increases a Pokémon's level by 1.", + description: "Increases a Pokémon's level by {{levels}}.", }, "AllPokemonLevelIncrementModifierType": { - description: "Increases all party members' level by 1.", + description: "Increases all party members' level by {{levels}}.", }, "PokemonBaseStatBoosterModifierType": { description: "Increases the holder's base {{statName}} by 10%. The higher your IVs, the higher the stack limit.", @@ -163,6 +163,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "REVIVER_SEED": { name: "Reviver Seed", description: "Revives the holder for 1/2 HP upon fainting from a direct hit." }, + "WHITE_HERB": { name: "White Herb", description: "An item to be held by a Pokémon. It will restore any lowered stat in battle." }, + "ETHER": { name: "Ether" }, "MAX_ETHER": { name: "Max Ether" }, @@ -192,6 +194,9 @@ export const modifierType: ModifierTypeTranslationEntries = { "SOOTHE_BELL": { name: "Soothe Bell" }, + "SCOPE_LENS": { name: "Scope Lens", description: "It's a lens for scoping out weak points. It boosts the holder's critical-hit ratio."}, + "LEEK": { name: "Leek", description: "This very long and stiff stalk of leek boosts the critical-hit ratio of Farfetch'd's moves."}, + "EVIOLITE": { name: "Eviolite", description: "This mysterious evolutionary lump boosts the Defense and Sp. Def stats when held by a Pokémon that can still evolve." }, "SOUL_DEW": { name: "Soul Dew", description: "Increases the influence of a Pokémon's nature on its stats by 10% (additive)." }, diff --git a/src/locales/en/modifier.ts b/src/locales/en/modifier.ts index d3da4c2150b..85098cdaaec 100644 --- a/src/locales/en/modifier.ts +++ b/src/locales/en/modifier.ts @@ -5,6 +5,7 @@ export const modifier: SimpleTranslationEntries = { "turnHealApply": "{{pokemonNameWithAffix}} restored a little HP using\nits {{typeName}}!", "hitHealApply": "{{pokemonNameWithAffix}} restored a little HP using\nits {{typeName}}!", "pokemonInstantReviveApply": "{{pokemonNameWithAffix}} was revived\nby its {{typeName}}!", + "pokemonResetNegativeStatStageApply": "{{pokemonNameWithAffix}}'s lowered stats were restored\nby its {{typeName}}!", "moneyInterestApply": "You received interest of ₽{{moneyAmount}}\nfrom the {{typeName}}!", "turnHeldItemTransferApply": "{{pokemonNameWithAffix}}'s {{itemName}} was absorbed\nby {{pokemonName}}'s {{typeName}}!", "contactHeldItemTransferApply": "{{pokemonNameWithAffix}}'s {{itemName}} was snatched\nby {{pokemonName}}'s {{typeName}}!", diff --git a/src/locales/en/move.ts b/src/locales/en/move.ts index b9a8836dfec..cec7c93ede5 100644 --- a/src/locales/en/move.ts +++ b/src/locales/en/move.ts @@ -2975,7 +2975,7 @@ export const move: MoveTranslationEntries = { }, "dynamaxCannon": { name: "Dynamax Cannon", - effect: "The user unleashes a strong beam from its core. This move deals twice the damage if the target is over level 200." + effect: "The user unleashes a strong beam from its core. Deals up to twice the damage if the target is overly leveled." }, "snipeShot": { name: "Snipe Shot", diff --git a/src/locales/en/party-ui-handler.ts b/src/locales/en/party-ui-handler.ts index 37343cfa892..70858a391ae 100644 --- a/src/locales/en/party-ui-handler.ts +++ b/src/locales/en/party-ui-handler.ts @@ -16,6 +16,7 @@ export const partyUiHandler: SimpleTranslationEntries = { "PASS_BATON": "Pass Baton", "UNPAUSE_EVOLUTION": "Unpause Evolution", "REVIVE": "Revive", + "RENAME": "Rename", "SELECT": "Select", "choosePokemon": "Choose a Pokémon.", diff --git a/src/locales/en/pokemon-form.ts b/src/locales/en/pokemon-form.ts new file mode 100644 index 00000000000..b80819d5c64 --- /dev/null +++ b/src/locales/en/pokemon-form.ts @@ -0,0 +1,190 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const pokemonForm: SimpleTranslationEntries = { + // Battle forms + "mega": "Mega {{pokemonName}}", + "mega-x": "Mega {{pokemonName}} X", + "mega-y": "Mega {{pokemonName}} Y", + "primal": "Primal {{pokemonName}}", + "gigantamax": "G-Max {{pokemonName}}", + "eternamax": "E-Max {{pokemonName}}", + + // Starters forms + // 1G + "pikachuCosplay": "Cosplay", + "pikachuCoolCosplay": "Cool Cosplay", + "pikachuBeautyCosplay": "Beauty Cosplay", + "pikachuCuteCosplay": "Cute Cosplay", + "pikachuSmartCosplay": "Smart Cosplay", + "pikachuToughCosplay": "Tough Cosplay", + "pikachuPartner": "Partner", + "eeveePartner": "Partner", + // 2G + "pichuSpiky": "Spiky", + "unownA": "A", + "unownB": "B", + "unownC": "C", + "unownD": "D", + "unownE": "E", + "unownF": "F", + "unownG": "G", + "unownH": "H", + "unownI": "I", + "unownJ": "J", + "unownK": "K", + "unownL": "L", + "unownM": "M", + "unownN": "N", + "unownO": "O", + "unownP": "P", + "unownQ": "Q", + "unownR": "R", + "unownS": "S", + "unownT": "T", + "unownU": "U", + "unownV": "V", + "unownW": "W", + "unownX": "X", + "unownY": "Y", + "unownZ": "Z", + "unownExclamation": "!", + "unownQuestion": "?", + // 3G + "castformSunny": "Sunny", + "castformRainy": "Rainy", + "castformSnowy": "Snowy", + "deoxysNormal": "Normal", + // 4G + "burmyPlant": "Plant", + "burmySandy": "Sandy", + "burmyTrash": "Trash", + "shellosEast": "East", + "shellosWest": "West", + "rotomHeat": "Heat", + "rotomWash": "Wash", + "rotomFrost": "Frost", + "rotomFan": "Fan", + "rotomMow": "Mow", + "giratinaAltered": "Altered", + "shayminLand": "Land", + // 5G + "basculinRedStriped": "Red Striped", + "basculinBlueStriped": "Blue Striped", + "basculinWhiteStriped": "White Striped", + "deerlingSpring": "Spring", + "deerlingSummer": "Summer", + "deerlingAutumn": "Autumn", + "deerlingWinter": "Winter", + "tornadusIncarnate": "Incarnate", + "thundurusIncarnate": "Incarnate", + "landorusIncarnate": "Incarnate", + "keldeoOrdinary": "Ordinary", + "meloettaAria": "Aria", + // 6G + "froakieBattleBond": "Battle Bond", + "scatterbugMeadow": "Meadow", + "scatterbugIcySnow": "Icy Snow", + "scatterbugPolar": "Polar", + "scatterbugTundra": "Tundra", + "scatterbugContinental": "Continental", + "scatterbugGarden": "Garden", + "scatterbugElegant": "Elegant", + "scatterbugModern": "Modern", + "scatterbugMarine": "Marine", + "scatterbugArchipelago": "Archipelago", + "scatterbugHighPlains": "High Plains", + "scatterbugSandstorm": "Sandstorm", + "scatterbugRiver": "River", + "scatterbugMonsoon": "Monsoon", + "scatterbugSavanna": "Savanna", + "scatterbugSun": "Sun", + "scatterbugOcean": "Ocean", + "scatterbugJungle": "Jungle", + "scatterbugFancy": "Fancy", + "scatterbugPokeBall": "Poké Ball", + "flabebeRed": "Red", + "flabebeYellow": "Yellow", + "flabebeOrange": "Orange", + "flabebeBlue": "Blue", + "flabebeWhite": "White", + "furfrouHeart": "Heart", + "furfrouStar": "Star", + "furfrouDiamond": "Diamond", + "furfrouDebutante": "Debutante", + "furfrouMatron": "Matron", + "furfrouDandy": "Dandy", + "furfrouLaReine": "La Reine", + "furfrouKabuki": "Kabuki", + "furfrouPharaoh": "Pharaoh", + "pumpkabooSmall": "Small", + "pumpkabooLarge": "Large", + "pumpkabooSuper": "Super", + "xerneasNeutral": "Neutral", + "xerneasActive": "Active", + "zygarde50": "50% Forme", + "zygarde10": "10% Forme", + "zygarde50Pc": "50% Forme Power Construct", + "zygarde10Pc": "10% Forme Power Construct", + "zygardeComplete": "Complete Forme", + // 7G + "oricorioBaile": "Baile", + "oricorioPompom": "Pom-Pom", + "oricorioPau": "Pau", + "oricorioSensu": "Sensu", + "rockruffOwnTempo": "Own Tempo", + "miniorRedMeteor": "Red Meteor", + "miniorOrangeMeteor": "Orange Meteor", + "miniorYellowMeteor": "Yellow Meteor", + "miniorGreenMeteor": "Green Meteor", + "miniorBlueMeteor": "Blue Meteor", + "miniorIndigoMeteor": "Indigo Meteor", + "miniorVioletMeteor": "Violet Meteor", + "miniorRed": "Red", + "miniorOrange": "Orange", + "miniorYellow": "Yellow", + "miniorGreen": "Green", + "miniorBlue": "Blue", + "miniorIndigo": "Indigo", + "miniorViolet": "Violet", + "mimikyuDisguised": "Disguised", + "mimikyuBusted": "Busted", + "magearnaOriginal": "Original", + "marshadowZenith": "Zenith", + // 8G + "sinisteaPhony": "Phony", + "sinisteaAntique": "Antique", + "eiscueNoIce": "No Ice", + "indeedeeMale": "Male", + "indeedeeFemale": "Female", + "morpekoFullBelly": "Full Belly", + "zacianHeroOfManyBattles": "Hero Of Many Battles", + "zamazentaHeroOfManyBattles": "Hero Of Many Battles", + "zarudeDada": "Dada", + "enamorusIncarnate": "Incarnate", + // 9G + "squawkabillyGreenPlumage": "Green Plumage", + "squawkabillyBluePlumage": "Blue Plumage", + "squawkabillyYellowPlumage": "Yellow Plumage", + "squawkabillyWhitePlumage": "White Plumage", + "tatsugiriCurly": "Curly", + "tatsugiriDroopy": "Droopy", + "tatsugiriStretchy": "Stretchy", + "gimmighoulChest": "Chest", + "gimmighoulRoaming": "Roaming", + "koraidonApexBuild": "Apex Build", + "koraidonLimitedBuild":"Limited Build", + "koraidonSprintingBuild":"Sprinting Build", + "koraidonSwimmingBuild":"Swimming Build", + "koraidonGlidingBuild":"Gliding Build", + "miraidonUltimateMode":"Ultimate Mode", + "miraidonLowPowerMode":"Low Power Mode", + "miraidonDriveMode":"Drive Mode", + "miraidonAquaticMode":"Aquatic Mode", + "miraidonGlideMode":"Glide Mode", + "poltchageistCounterfeit": "Counterfeit", + "poltchageistArtisan": "Artisan", + "paldeaTaurosCombat": "Combat", + "paldeaTaurosBlaze": "Blaze", + "paldeaTaurosAqua": "Aqua", + +} as const; diff --git a/src/locales/en/pokemon-summary.ts b/src/locales/en/pokemon-summary.ts new file mode 100644 index 00000000000..484ea2a9d67 --- /dev/null +++ b/src/locales/en/pokemon-summary.ts @@ -0,0 +1,20 @@ +import { TranslationEntries } from "#app/interfaces/locales"; + +export const pokemonSummary: TranslationEntries = { + "pokemonInfo": "Pokémon Info", + "status": "Status", + "powerAccuracyCategory": "Power\nAccuracy\nCategory", + "type": "Type", + "unknownTrainer": "Unknown", + "ot": "OT", + "nature": "nature", + "expPoints": "Exp. Points", + "nextLv": "Next Lv.", + "cancel": "Cancel", + + "memoString": "{{natureFragment}} nature,\n{{metFragment}}", + "metFragment": { + "normal": "met at Lv{{level}},\n{{biome}}.", + "apparently": "apparently met at Lv{{level}},\n{{biome}}.", + }, +} as const; diff --git a/src/locales/en/settings.ts b/src/locales/en/settings.ts index f68a649269f..491bfa4a481 100644 --- a/src/locales/en/settings.ts +++ b/src/locales/en/settings.ts @@ -96,4 +96,5 @@ export const settings: SimpleTranslationEntries = { "controller": "Controller", "gamepadSupport": "Gamepad Support", "showBgmBar": "Show Music Names", + "shopOverlayOpacity": "Shop Overlay Opacity" } as const; diff --git a/src/locales/en/splash-messages.ts b/src/locales/en/splash-messages.ts index 17eafc2d6d6..e549bc24f19 100644 --- a/src/locales/en/splash-messages.ts +++ b/src/locales/en/splash-messages.ts @@ -34,4 +34,5 @@ export const splashMessages: SimpleTranslationEntries = { "alsoTryRadicalRed": "Also Try Radical Red!", "eeveeExpo": "Eevee Expo!", "ynoproject": "YNOproject!", + "breedersInSpace": "Breeders in space!", } as const; diff --git a/src/locales/en/starter-select-ui-handler.ts b/src/locales/en/starter-select-ui-handler.ts index ac59785bab7..6d7b7f7cfb2 100644 --- a/src/locales/en/starter-select-ui-handler.ts +++ b/src/locales/en/starter-select-ui-handler.ts @@ -6,7 +6,8 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; * account interactions, descriptive text, etc. */ export const starterSelectUiHandler: SimpleTranslationEntries = { - "confirmStartTeam":"Begin with these Pokémon?", + "confirmStartTeam": "Begin with these Pokémon?", + "invalidParty": "This is not a valid starting party!", "gen1": "I", "gen2": "II", "gen3": "III", @@ -22,6 +23,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "nature": "Nature:", "eggMoves": "Egg Moves", "addToParty": "Add to Party", + "removeFromParty": "Remove from Party", "toggleIVs": "Toggle IVs", "manageMoves": "Manage Moves", "manageNature": "Manage Nature", diff --git a/src/locales/es/ability-trigger.ts b/src/locales/es/ability-trigger.ts index 5c09c3832c0..d5d487235e9 100644 --- a/src/locales/es/ability-trigger.ts +++ b/src/locales/es/ability-trigger.ts @@ -5,7 +5,58 @@ export const abilityTriggers: SimpleTranslationEntries = { "badDreams": "¡{{pokemonName}} está atormentado!", "costar": "{{pokemonName}} copied {{allyName}}'s stat changes!", "iceFaceAvoidedDamage": "¡{{pokemonNameWithAffix}} evitó\ndaño con {{abilityName}}!", + "perishBody": "{{pokemonName}}'s {{abilityName}}\nwill faint both pokemon in 3 turns!", + "poisonHeal": "{{pokemonName}}'s {{abilityName}}\nrestored its HP a little!", "trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!", "windPowerCharged": "¡{{pokemonName}} se ha cargado de electricidad gracias a {{moveName}}!", "quickDraw": "{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", + "blockItemTheft": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents item theft!", + "typeImmunityHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!", + "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} avoided damage\nwith {{abilityName}}!", + "postDefendDisguise": "{{pokemonNameWithAffix}}'s disguise was busted!", + "moveImmunity": "It doesn't affect {{pokemonNameWithAffix}}!", + "reverseDrain": "{{pokemonNameWithAffix}} sucked up the liquid ooze!", + "postDefendTypeChange": "{{pokemonNameWithAffix}}'s {{abilityName}}\nmade it the {{typeName}} type!", + "postDefendContactDamage": "{{pokemonNameWithAffix}}'s {{abilityName}}\nhurt its attacker!", + "postDefendAbilitySwap": "{{pokemonNameWithAffix}} swapped\nabilities with its target!", + "postDefendAbilityGive": "{{pokemonNameWithAffix}} gave its target\n{{abilityName}}!", + "postDefendMoveDisable": "{{pokemonNameWithAffix}}'s {{moveName}}\nwas disabled!", + "pokemonTypeChange": "{{pokemonNameWithAffix}} transformed into the {{moveType}} type!", + "postAttackStealHeldItem": "{{pokemonNameWithAffix}} stole\n{{defenderName}}'s {{stolenItemType}}!", + "postDefendStealHeldItem": "{{pokemonNameWithAffix}} stole\n{{attackerName}}'s {{stolenItemType}}!", + "copyFaintedAllyAbility": "{{pokemonNameWithAffix}}'s {{abilityName}} was taken over!", + "intimidateImmunity": "{{pokemonNameWithAffix}}'s {{abilityName}} prevented it from being Intimidated!", + "postSummonAllyHeal": "{{pokemonNameWithAffix}} drank down all the\nmatcha that {{pokemonName}} made!", + "postSummonClearAllyStats": "{{pokemonNameWithAffix}}'s stat changes\nwere removed!", + "postSummonTransform": "{{pokemonNameWithAffix}} transformed\ninto {{targetName}}!", + "protectStat": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents lowering its {{statName}}!", + "statusEffectImmunityWithName": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents {{statusEffectName}}!", + "statusEffectImmunity": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents status problems!", + "battlerTagImmunity": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents {{battlerTagName}}!", + "forewarn": "{{pokemonNameWithAffix}} was forewarned about {{moveName}}!", + "frisk": "{{pokemonNameWithAffix}} frisked {{opponentName}}'s {{opponentAbilityName}}!", + "postWeatherLapseHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!", + "postWeatherLapseDamage": "{{pokemonNameWithAffix}} is hurt\nby its {{abilityName}}!", + "postTurnLootCreateEatenBerry": "{{pokemonNameWithAffix}} harvested one {{berryName}}!", + "postTurnHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!", + "fetchBall": "{{pokemonNameWithAffix}} found a\n{{pokeballName}}!", + "healFromBerryUse": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP!", + "arenaTrap": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents switching!", + "postBattleLoot": "{{pokemonNameWithAffix}} picked up\n{{itemName}}!", + "postFaintContactDamage": "{{pokemonNameWithAffix}}'s {{abilityName}}\nhurt its attacker!", + "postFaintHpDamage": "{{pokemonNameWithAffix}}'s {{abilityName}}\nhurt its attacker!", + "postSummonPressure": "{{pokemonNameWithAffix}} is exerting its Pressure!", + "postSummonMoldBreaker": "{{pokemonNameWithAffix}} breaks the mold!", + "postSummonAnticipation": "{{pokemonNameWithAffix}} shuddered!", + "postSummonTurboblaze": "{{pokemonNameWithAffix}} is radiating a blazing aura!", + "postSummonTeravolt": "{{pokemonNameWithAffix}} is radiating a bursting aura!", + "postSummonDarkAura": "{{pokemonNameWithAffix}} is radiating a Dark Aura!", + "postSummonFairyAura": "{{pokemonNameWithAffix}} is radiating a Fairy Aura!", + "postSummonNeutralizingGas": "{{pokemonNameWithAffix}}'s Neutralizing Gas filled the area!", + "postSummonAsOneGlastrier": "{{pokemonNameWithAffix}} has two Abilities!", + "postSummonAsOneSpectrier": "{{pokemonNameWithAffix}} has two Abilities!", + "postSummonVesselOfRuin": "{{pokemonNameWithAffix}}'s Vessel of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", + "postSummonSwordOfRuin": "{{pokemonNameWithAffix}}'s Sword of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", + "postSummonTabletsOfRuin": "{{pokemonNameWithAffix}}'s Tablets of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", + "postSummonBeadsOfRuin": "{{pokemonNameWithAffix}}'s Beads of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", } as const; diff --git a/src/locales/es/arena-flyout.ts b/src/locales/es/arena-flyout.ts new file mode 100644 index 00000000000..376b737811f --- /dev/null +++ b/src/locales/es/arena-flyout.ts @@ -0,0 +1,49 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const arenaFlyout: SimpleTranslationEntries = { + // Title + "activeBattleEffects": "Efectos de Terreno Activos", + "player": "Jugador", + "neutral": "Neutral", + "enemy": "Enemigo", + + // WeatherType + "sunny": "Sol", + "rain": "Lluvia", + "sandstorm": "Tormenta de Arena", + "hail": "Granizo", + "snow": "Nieve", + "fog": "Niebla", + "heavyRain": "Diluvio", + "harshSun": "Sol Abrasador", + "strongWinds": "Turbulencias", + + // TerrainType + "misty": "Campo de Niebla", + "electric": "Campo Eléctrico", + "grassy": "Campo de Hierba", + "psychic": "Campo Psíquico", + + // ArenaTagType + "mudSport": "Chapoteo Lodo", + "waterSport": "Hidrochorro", + "spikes": "Púas", + "toxicSpikes": "Púas Tóxicas", + "mist": "Neblina", + "futureSight": "Premonición", + "doomDesire": "Deseo Oculto", + "wish": "Deseo", + "stealthRock": "Trampa Rocas", + "stickyWeb": "Red Vidcosa", + "trickRoom": "Espacio Raro", + "gravity": "Gravedad", + "reflect": "Reflejo", + "lightScreen": "Pantalla de Luz", + "auroraVeil": "Velo Aurora", + "quickGuard": "Anticipo", + "wideGuard": "Vasta Guardia", + "matBlock": "Escudo Tatami", + "craftyShield": "Truco Defensa", + "tailwind": "Viento Afín", + "happyHour": "Paga Extra", +}; diff --git a/src/locales/es/battle-info.ts b/src/locales/es/battle-info.ts new file mode 100644 index 00000000000..f24dad46c6c --- /dev/null +++ b/src/locales/es/battle-info.ts @@ -0,0 +1,5 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battleInfo: SimpleTranslationEntries = { + "generation": "Generation {{generation}}", +} as const; diff --git a/src/locales/es/battle.ts b/src/locales/es/battle.ts index bc0dd1e4b78..7f29060c5d3 100644 --- a/src/locales/es/battle.ts +++ b/src/locales/es/battle.ts @@ -68,15 +68,32 @@ export const battle: SimpleTranslationEntries = { "drainMessage": "¡{{pokemonName}} tuvo su\nenergía absorbida!", "regainHealth": "¡{{pokemonName}} recuperó\nPS!", "stealEatBerry": "¡{{pokemonName}} robó la {{berryName}}\nde {{targetName}} y se la comió!", + "ppHealBerry": "{{pokemonNameWithAffix}} restored PP to its move {{moveName}}\nusing its {{berryName}}!", + "hpHealBerry": "{{pokemonNameWithAffix}} restored its health using\nits {{berryName}}!", "fainted": "¡{{pokemonNameWithAffix}} se debilitó!", - "statRose": "¡El {{stats}} de {{pokemonNameWithAffix}} ha subido!", - "statSharplyRose": "¡El {{stats}} de {{pokemonNameWithAffix}} ha subido mucho!", - "statRoseDrastically": "¡El {{stats}} de {{pokemonNameWithAffix}} ha subido muchísimo!", - "statWontGoAnyHigher": "¡El {{stats}} de {{pokemonNameWithAffix}} no puede subir más!", - "statFell": "¡El {{stats}} de {{pokemonNameWithAffix}} ha bajado!", - "statHarshlyFell": "¡El {{stats}} de {{pokemonNameWithAffix}}} ha bajado mucho!", - "statSeverelyFell": "¡El {{stats}} de {{pokemonNameWithAffix}} ha bajado muchísimo!", - "statWontGoAnyLower": "¡El {{stats}} de {{pokemonNameWithAffix}} no puede bajar más!", + "statsAnd": "y", + "stats": "Las estadísticas", + "statRose_one": "¡El {{stats}} de {{pokemonNameWithAffix}} ha subido!", + "statRose_other": "¡{{stats}} de\n{{pokemonNameWithAffix}} han subido!", + "statSharplyRose_one": "¡El {{stats}} de {{pokemonNameWithAffix}} ha subido mucho!", + "statSharplyRose_other": "¡{{stats}} de\n{{pokemonNameWithAffix}} han subido mucho!", + "statRoseDrastically_one": "¡El {{stats}} de {{pokemonNameWithAffix}} ha subido muchísimo!", + "statRoseDrastically_other": "¡{{stats}} de\n{{pokemonNameWithAffix}} han subido muchísimo!", + "statWontGoAnyHigher_one": "¡El {{stats}} de {{pokemonNameWithAffix}} no puede subir más!", + "statWontGoAnyHigher_other": "¡{{stats}} de\n{{pokemonNameWithAffix}} no pueden subir más!", + "statFell_one": "¡El {{stats}} de {{pokemonNameWithAffix}} ha bajado!", + "statFell_other": "¡{{stats}} de\n{{pokemonNameWithAffix}} han bajado!", + "statHarshlyFell_one": "¡El {{stats}} de {{pokemonNameWithAffix}} ha bajado mucho!", + "statHarshlyFell_other": "¡{{stats}} de\n{{pokemonNameWithAffix}} han bajado mucho!", + "statSeverelyFell_one": "¡El {{stats}} de {{pokemonNameWithAffix}} ha bajado muchísimo!", + "statSeverelyFell_other": "¡{{stats}} de\n{{pokemonNameWithAffix}} han bajado muchísimo!", + "statWontGoAnyLower_one": "¡El {{stats}} de {{pokemonNameWithAffix}} no puede bajar más!", + "statWontGoAnyLower_other": "¡{{stats}} de\n{{pokemonNameWithAffix}} no pueden bajar más!", + "transformedIntoType": "{{pokemonName}} transformed\ninto the {{type}} type!", + "retryBattle": "Would you like to retry from the start of the battle?", + "unlockedSomething": "{{unlockedThing}}\nhas been unlocked.", + "congratulations": "Congratulations!", + "beatModeFirstTime": "{{speciesName}} beat {{gameMode}} Mode for the first time!\nYou received {{newModifier}}!", "ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!", "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} must\nrecharge!", "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} can no\nlonger escape!", @@ -124,15 +141,19 @@ export const battle: SimpleTranslationEntries = { "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}} endured\nthe hit!", "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}} endured\nthe hit!", "battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}}'s perish count fell to {{turnCount}}.", + "battlerTagsCenterOfAttentionOnAdd": "{{pokemonNameWithAffix}} became the center\nof attention!", "battlerTagsTruantLapse": "{{pokemonNameWithAffix}} is\nloafing around!", "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}} can't\nget it going!", "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}} finally\ngot its act together!", "battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}'s {{statName}}\nwas heightened!", "battlerTagsHighestStatBoostOnRemove": "The effects of {{pokemonNameWithAffix}}'s\n{{abilityName}} wore off!", + "battlerTagsMagnetRisenOnAdd": "{{pokemonNameWithAffix}} levitated with electromagnetism!", + "battlerTagsMagnetRisenOnRemove": "{{pokemonNameWithAffix}}'s electromagnetism wore off!", "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}} is getting\npumped!", "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}} relaxed.", "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} is being salt cured!", "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} is hurt by {{moveName}}!", "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}} cut its own HP and put a curse on the {{pokemonName}}!", - "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} is afflicted by the Curse!" + "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} is afflicted by the Curse!", + "battlerTagsStockpilingOnAdd": "{{pokemonNameWithAffix}} stockpiled {{stockpiledCount}}!" } as const; diff --git a/src/locales/es/battler-tags.ts b/src/locales/es/battler-tags.ts new file mode 100644 index 00000000000..1d897c70f3d --- /dev/null +++ b/src/locales/es/battler-tags.ts @@ -0,0 +1,12 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battlerTags: SimpleTranslationEntries = { + "trappedDesc": "trapping", + "flinchedDesc": "flinching", + "confusedDesc": "confusion", + "infatuatedDesc": "infatuation", + "seedDesc": "seeding", + "nightmareDesc": "nightmares", + "ingrainDesc": "roots", + "drowsyDesc": "drowsiness", +} as const; diff --git a/src/locales/es/bgm-name.ts b/src/locales/es/bgm-name.ts index a0f7544d608..ab6de0b81b5 100644 --- a/src/locales/es/bgm-name.ts +++ b/src/locales/es/bgm-name.ts @@ -110,9 +110,9 @@ export const bgmName: SimpleTranslationEntries = { "plains": "PMD EoS - Pradera de la Cumbre del Cielo", "power_plant": "PMD EoS - Pradera Destello", "ruins": "PMD EoS - Sima Hermética", - "sea": "PMD EoS - Cueva Aguamar", + "sea": "Andr06 - Marine Mystique", // Name defined by the composer "seabed": "Firel - Seabed", // The composer thinks about a more creative name - "slum": "PMD EoS - Costa de la Cumbre del Cielo", + "slum": "Andr06 - Sneaky Snom", // Name defined by the composer "snowy_forest": "PMD EoS - Campo nevado de la Cumbre del Cielo", "space": "Firel - Aether", "swamp": "PMD EoS - Mar Circundante", diff --git a/src/locales/es/config.ts b/src/locales/es/config.ts index 341fafa4ca9..ab23a52b7bb 100644 --- a/src/locales/es/config.ts +++ b/src/locales/es/config.ts @@ -1,8 +1,11 @@ import { ability } from "./ability"; import { abilityTriggers } from "./ability-trigger"; +import { arenaFlyout } from "./arena-flyout"; import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; +import { battleInfo } from "./battle-info"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; +import { battlerTags } from "./battler-tags"; import { berry } from "./berry"; import { bgmName } from "./bgm-name"; import { biome } from "./biome"; @@ -31,8 +34,10 @@ import { move } from "./move"; import { nature } from "./nature"; import { pokeball } from "./pokeball"; import { pokemon } from "./pokemon"; +import { pokemonForm } from "./pokemon-form"; import { pokemonInfo } from "./pokemon-info"; import { pokemonInfoContainer } from "./pokemon-info-container"; +import { pokemonSummary } from "./pokemon-summary"; import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler"; import { splashMessages } from "./splash-messages"; import { starterSelectUiHandler } from "./starter-select-ui-handler"; @@ -49,8 +54,11 @@ import { modifierSelectUiHandler } from "./modifier-select-ui-handler"; export const esConfig = { ability: ability, abilityTriggers: abilityTriggers, + arenaFlyout: arenaFlyout, battle: battle, + battleInfo: battleInfo, battleMessageUiHandler: battleMessageUiHandler, + battlerTags: battlerTags, berry: berry, bgmName: bgmName, biome: biome, @@ -80,8 +88,10 @@ export const esConfig = { nature: nature, pokeball: pokeball, pokemon: pokemon, + pokemonForm: pokemonForm, pokemonInfo: pokemonInfo, pokemonInfoContainer: pokemonInfoContainer, + pokemonSummary: pokemonSummary, saveSlotSelectUiHandler: saveSlotSelectUiHandler, settings: settings, splashMessages: splashMessages, diff --git a/src/locales/es/menu-ui-handler.ts b/src/locales/es/menu-ui-handler.ts index bf71c2b390b..e38ac4eab3d 100644 --- a/src/locales/es/menu-ui-handler.ts +++ b/src/locales/es/menu-ui-handler.ts @@ -18,6 +18,10 @@ export const menuUiHandler: SimpleTranslationEntries = { "exportSlotSelect": "Selecciona una ranura para exportar.", "importData": "Importar Datos", "exportData": "Exportar Datos", + "linkDiscord": "Conectar Discord", + "unlinkDiscord": "Desconectar Discord", + "linkGoogle": "Conectar Google", + "unlinkGoogle": "Desconectar Google", "cancel": "Cancelar", "losingProgressionWarning": "Perderás cualquier progreso desde el inicio de la batalla. ¿Continuar?", "noEggs": "You are not hatching\nany eggs at the moment!" diff --git a/src/locales/es/menu.ts b/src/locales/es/menu.ts index 85d9d50f015..55bd9c6c038 100644 --- a/src/locales/es/menu.ts +++ b/src/locales/es/menu.ts @@ -17,6 +17,7 @@ export const menu: SimpleTranslationEntries = { "username": "Usuario", "password": "Contraseña", "login": "Iniciar Sesión", + "orUse": "O usa", "register": "Registrarse", "emptyUsername": "El usuario no puede estar vacío", "invalidLoginUsername": "El usuario no es válido", @@ -53,5 +54,9 @@ export const menu: SimpleTranslationEntries = { "no":"No", "disclaimer": "AVISO", "disclaimerDescription": "Este juego es un producto inacabado; puede tener problemas de jugabilidad (incluyendo la posible pérdida\n de datos de guardado),cambiar sin avisar, y puede o no puede ser actualizado hasta ser completado.", + "choosePokemon": "Choose a Pokémon.", + "renamePokemon": "Rename Pokémon", + "rename": "Rename", + "nickname": "Nickname", "errorServerDown": "¡Ups! Ha habido un problema al contactar con el servidor.\n\nPuedes mantener esta ventana abierta,\nel juego se reconectará automáticamente.", } as const; diff --git a/src/locales/es/modifier-type.ts b/src/locales/es/modifier-type.ts index 5d5ed5ddc5c..d2bd44a0f06 100644 --- a/src/locales/es/modifier-type.ts +++ b/src/locales/es/modifier-type.ts @@ -58,10 +58,10 @@ export const modifierType: ModifierTypeTranslationEntries = { description: "Aumenta la potencia de los movimientos de tipo {{moveType}} de un Pokémon en un 20%.", }, "PokemonLevelIncrementModifierType": { - description: "Aumenta el nivel de un Pokémon en 1.", + description: "Aumenta el nivel de un Pokémon en {{levels}}.", }, "AllPokemonLevelIncrementModifierType": { - description: "Aumenta el nivel de todos los miembros del equipo en 1.", + description: "Aumenta el nivel de todos los miembros del equipo en {{levels}}.", }, "PokemonBaseStatBoosterModifierType": { description: "Aumenta la est. {{statName}} base del portador en un 10%.\nCuanto mayores sean tus IVs, mayor será el límite de acumulación.", @@ -153,6 +153,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "REVIVER_SEED": { name: "Semilla Revivir", description: "Revive al portador con la mitad de sus PS al debilitarse por un golpe directo." }, + "WHITE_HERB": { name: "White Herb", description: "An item to be held by a Pokémon. It will restore any lowered stat in battle." }, + "ETHER": { name: "Éter" }, "MAX_ETHER": { name: "Éter Máx." }, @@ -182,6 +184,9 @@ export const modifierType: ModifierTypeTranslationEntries = { "SOOTHE_BELL": { name: "Camp. Alivio" }, + "SCOPE_LENS": { name: "Periscopio", description: "Aumenta la probabilidad de asestar un golpe crítico." }, + "LEEK": { name: "Puerro", description: "Puerro muy largo y duro que aumenta la probabilidad de asestar un golpe crítico. Debe llevarlo Farfetch'd." }, + "EVIOLITE": { name: "Mineral Evolutivo", description: "Roca misteriosa. El Pokémon portador aumentará su Defensa y su Defensa Especial si aún puede evolucionar." }, "SOUL_DEW": { name: "Rocío bondad", description: "Aumenta la influencia de la naturaleza de un Pokémon en sus estadísticas en un 10% (aditivo)." }, diff --git a/src/locales/es/modifier.ts b/src/locales/es/modifier.ts index d3da4c2150b..85098cdaaec 100644 --- a/src/locales/es/modifier.ts +++ b/src/locales/es/modifier.ts @@ -5,6 +5,7 @@ export const modifier: SimpleTranslationEntries = { "turnHealApply": "{{pokemonNameWithAffix}} restored a little HP using\nits {{typeName}}!", "hitHealApply": "{{pokemonNameWithAffix}} restored a little HP using\nits {{typeName}}!", "pokemonInstantReviveApply": "{{pokemonNameWithAffix}} was revived\nby its {{typeName}}!", + "pokemonResetNegativeStatStageApply": "{{pokemonNameWithAffix}}'s lowered stats were restored\nby its {{typeName}}!", "moneyInterestApply": "You received interest of ₽{{moneyAmount}}\nfrom the {{typeName}}!", "turnHeldItemTransferApply": "{{pokemonNameWithAffix}}'s {{itemName}} was absorbed\nby {{pokemonName}}'s {{typeName}}!", "contactHeldItemTransferApply": "{{pokemonNameWithAffix}}'s {{itemName}} was snatched\nby {{pokemonName}}'s {{typeName}}!", diff --git a/src/locales/es/move.ts b/src/locales/es/move.ts index 3693e008574..873e7e2da94 100644 --- a/src/locales/es/move.ts +++ b/src/locales/es/move.ts @@ -2975,7 +2975,7 @@ export const move: MoveTranslationEntries = { }, dynamaxCannon: { name: "Cañón Dinamax", - effect: "El usuario ataca emitiendo un rayo desde su núcleo. El daño infligido se duplica si el objetivo supera el nivel 200.", + effect: "El usuario ataca emitiendo un rayo desde su núcleo. Inflinge hasta el doble de daño si el objetivo tiene más niveles de lo normal." }, snipeShot: { name: "Disparo Certero", diff --git a/src/locales/es/party-ui-handler.ts b/src/locales/es/party-ui-handler.ts index b310a98840d..cbbd6734b62 100644 --- a/src/locales/es/party-ui-handler.ts +++ b/src/locales/es/party-ui-handler.ts @@ -16,6 +16,7 @@ export const partyUiHandler: SimpleTranslationEntries = { "PASS_BATON": "Relevo", "UNPAUSE_EVOLUTION": "Reanudar Evolución", "REVIVE": "Revivir", + "RENAME": "Rename", "choosePokemon": "Elige a un Pokémon.", "doWhatWithThisPokemon": "¿Que quieres hacer con este Pokémon?", diff --git a/src/locales/es/pokemon-form.ts b/src/locales/es/pokemon-form.ts new file mode 100644 index 00000000000..415593b0446 --- /dev/null +++ b/src/locales/es/pokemon-form.ts @@ -0,0 +1,190 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const pokemonForm: SimpleTranslationEntries = { + // Battle forms + "mega": "Mega {{pokemonName}}", + "mega-x": "Mega {{pokemonName}} X", + "mega-y": "Mega {{pokemonName}} Y", + "primal": "{{pokemonName}} Primigenio", + "gigantamax": "G-Max {{pokemonName}}", + "eternamax": "E-Max {{pokemonName}}", + + // Starters forms + // 1G + "pikachuCosplay": "Coqueta", + "pikachuCoolCosplay": "Roquera", + "pikachuBeautyCosplay": "Aristócrata", + "pikachuCuteCosplay": "Superstar", + "pikachuSmartCosplay": "Erudita", + "pikachuToughCosplay": "Enmascarada", + "pikachuPartner": "Compañero", + "eeveePartner": "Compañero", + // 2G + "pichuSpiky": "Spiky", + "unownA": "A", + "unownB": "B", + "unownC": "C", + "unownD": "D", + "unownE": "E", + "unownF": "F", + "unownG": "G", + "unownH": "H", + "unownI": "I", + "unownJ": "J", + "unownK": "K", + "unownL": "L", + "unownM": "M", + "unownN": "N", + "unownO": "O", + "unownP": "P", + "unownQ": "Q", + "unownR": "R", + "unownS": "S", + "unownT": "T", + "unownU": "U", + "unownV": "V", + "unownW": "W", + "unownX": "X", + "unownY": "Y", + "unownZ": "Z", + "unownExclamation": "!", + "unownQuestion": "?", + // 3G + "castformSunny": "Sol", + "castformRainy": "Lluvia", + "castformSnowy": "Nieve", + "deoxysNormal": "Normal", + // 4G + "burmyPlant": "Planta", + "burmySandy": "Arena", + "burmyTrash": "Basura", + "shellosEast": "Este", + "shellosWest": "Oeste", + "rotomHeat": "Calor", + "rotomWash": "Lavado", + "rotomFrost": "Frío", + "rotomFan": "Ventilador", + "rotomMow": "Corte", + "giratinaAltered": "Altered", + "shayminLand": "Land", + // 5G + "basculinRedStriped": "Raya Roja", + "basculinBlueStriped": "Raya Azul", + "basculinWhiteStriped": "Raya Blanca", + "deerlingSpring": "Primavera", + "deerlingSummer": "Verano", + "deerlingAutumn": "Otoño", + "deerlingWinter": "Invierno", + "tornadusIncarnate": "Incarnate", + "thundurusIncarnate": "Incarnate", + "landorusIncarnate": "Incarnate", + "keldeoOrdinary": "Ordinary", + "meloettaAria": "Aria", + // 6G + "froakieBattleBond": "Fuerte Afecto", + "scatterbugMeadow": "Floral", + "scatterbugIcySnow": "Polar", + "scatterbugPolar": "Taiga", + "scatterbugTundra": "Tundra", + "scatterbugContinental": "Continental", + "scatterbugGarden": "Vergel", + "scatterbugElegant": "Oriental", + "scatterbugModern": "Moderno", + "scatterbugMarine": "Marino", + "scatterbugArchipelago": "Isleño", + "scatterbugHighPlains": "Estepa", + "scatterbugSandstorm": "Desierto", + "scatterbugRiver": "Oasis", + "scatterbugMonsoon": "Monzón", + "scatterbugSavanna": "Pantano", + "scatterbugSun": "Solar", + "scatterbugOcean": "Océano", + "scatterbugJungle": "Jungla", + "scatterbugFancy": "Fantasía", + "scatterbugPokeBall": "Poké Ball", + "flabebeRed": "Rojo", + "flabebeYellow": "Amarillo", + "flabebeOrange": "Naranja", + "flabebeBlue": "Azul", + "flabebeWhite": "Blanco", + "furfrouHeart": "Corazón", + "furfrouStar": "Estrella", + "furfrouDiamond": "Diamante", + "furfrouDebutante": "Debutante", + "furfrouMatron": "Matrón", + "furfrouDandy": "Dandi", + "furfrouLaReine": "La Reine", + "furfrouKabuki": "Kabuki", + "furfrouPharaoh": "Faraón", + "pumpkabooSmall": "Pequeño", + "pumpkabooLarge": "Grande", + "pumpkabooSuper": "Enorme", + "xerneasNeutral": "Relajado", + "xerneasActive": "Activo", + "zygarde50": "Al 50%", + "zygarde10": "Al 10%", + "zygarde50Pc": "Zygarde al 50%", + "zygarde10Pc": "Zygarde al 10%", + "zygardeComplete": "Zygarde Completo", + // 7G + "oricorioBaile": "Apasionado", + "oricorioPompom": "Animado", + "oricorioPau": "Plácido", + "oricorioSensu": "Refinado", + "rockruffOwnTempo": "Ritmo Propio", + "miniorRedMeteor": "Núcleo Rojo", + "miniorOrangeMeteor": "Núcleo Naranja", + "miniorYellowMeteor": "Núcleo Amarillo", + "miniorGreenMeteor": "Núcleo Verde", + "miniorBlueMeteor": "Núcleo Azul", + "miniorIndigoMeteor": "Núcleo Añil", + "miniorVioletMeteor": "Núcleo Violeta", + "miniorRed": "Rojo", + "miniorOrange": "Naranja", + "miniorYellow": "Amarillo", + "miniorGreen": "Verde", + "miniorBlue": "Azul", + "miniorIndigo": "Añil", + "miniorViolet": "Violeta", + "mimikyuDisguised": "Encubierta", + "mimikyuBusted": "Descubierta", + "magearnaOriginal": "Vetusto", + "marshadowZenith": "Cénit", + // 8G + "sinisteaPhony": "Falsificada", + "sinisteaAntique": "Auténtica", + "eiscueNoIce": "Cara Deshielo", + "indeedeeMale": "Macho", + "indeedeeFemale": "Hembra", + "morpekoFullBelly": "Full Belly", + "zacianHeroOfManyBattles": "Hero Of Many Battles", + "zamazentaHeroOfManyBattles": "Hero Of Many Battles", + "zarudeDada": "Papá", + "enamorusIncarnate": "Incarnate", + // 9G + "squawkabillyGreenPlumage": "Plumaje Verde", + "squawkabillyBluePlumage": "Plumaje Azul", + "squawkabillyYellowPlumage": "Plumaje Amarillo", + "squawkabillyWhitePlumage": "Plumaje Blanco", + "tatsugiriCurly": "Curvada", + "tatsugiriDroopy": "Lánguida", + "tatsugiriStretchy": "Estirada", + "gimmighoulChest": "Cofre", + "gimmighoulRoaming": "Andante", + "koraidonApexBuild": "Apex Build", + "koraidonLimitedBuild":"Limited Build", + "koraidonSprintingBuild":"Sprinting Build", + "koraidonSwimmingBuild":"Swimming Build", + "koraidonGlidingBuild":"Gliding Build", + "miraidonUltimateMode":"Ultimate Mode", + "miraidonLowPowerMode":"Low Power Mode", + "miraidonDriveMode":"Drive Mode", + "miraidonAquaticMode":"Aquatic Mode", + "miraidonGlideMode":"Glide Mode", + "poltchageistCounterfeit": "Imitación", + "poltchageistArtisan": "Original", + "paldeaTaurosCombat": "Combatiente", + "paldeaTaurosBlaze": "Ardiente", + "paldeaTaurosAqua": "Acuático", + +} as const; diff --git a/src/locales/es/pokemon-summary.ts b/src/locales/es/pokemon-summary.ts new file mode 100644 index 00000000000..2eca4f118c6 --- /dev/null +++ b/src/locales/es/pokemon-summary.ts @@ -0,0 +1,20 @@ +import { TranslationEntries } from "#app/interfaces/locales"; + +export const pokemonSummary: TranslationEntries = { + "pokemonInfo": "Info. Pokémon", + "status": "Estado", + "powerAccuracyCategory": "Potencia\nPrecisión\nCategoría", + "type": "Tipo", + "unknownTrainer": "Desconocido", + "ot": "EO", + "nature": "Naturaleza", + "expPoints": "Puntos Exp.", + "nextLv": "Nv. siguiente", + "cancel": "Salir", + + "memoString": "Naturaleza {{natureFragment}},\n{{metFragment}}", + "metFragment": { + "normal": "encontrado al Nv. {{level}},\n{{biome}}.", + "apparently": "aparentemente encontrado al Nv. {{level}},\n{{biome}}.", + }, +} as const; diff --git a/src/locales/es/settings.ts b/src/locales/es/settings.ts index dfd6f097242..407bfab602f 100644 --- a/src/locales/es/settings.ts +++ b/src/locales/es/settings.ts @@ -96,4 +96,5 @@ export const settings: SimpleTranslationEntries = { "controller": "Controller", "gamepadSupport": "Gamepad Support", "showBgmBar": "Show Music Names", + "shopOverlayOpacity": "Opacidad de la fase de compra" } as const; diff --git a/src/locales/es/splash-messages.ts b/src/locales/es/splash-messages.ts index 0d6f050be94..47f9fa1f98f 100644 --- a/src/locales/es/splash-messages.ts +++ b/src/locales/es/splash-messages.ts @@ -34,4 +34,5 @@ export const splashMessages: SimpleTranslationEntries = { "alsoTryRadicalRed": "¡Prueba también Radical Red!", "eeveeExpo": "¡Eevee Expo!", "ynoproject": "¡YNOproject!", + "breedersInSpace": "Criadores... ¡EN EL ESPACIO!", } as const; diff --git a/src/locales/es/starter-select-ui-handler.ts b/src/locales/es/starter-select-ui-handler.ts index 14c22e22097..6f7d845ca64 100644 --- a/src/locales/es/starter-select-ui-handler.ts +++ b/src/locales/es/starter-select-ui-handler.ts @@ -6,7 +6,8 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; * account interactions, descriptive text, etc. */ export const starterSelectUiHandler: SimpleTranslationEntries = { - "confirmStartTeam":"¿Comenzar con estos Pokémon?", + "confirmStartTeam": "¿Comenzar con estos Pokémon?", + "invalidParty": "This is not a valid starting party!", "gen1": "I", "gen2": "II", "gen3": "III", diff --git a/src/locales/fr/ability-trigger.ts b/src/locales/fr/ability-trigger.ts index f99ff15c26f..b063a2aca68 100644 --- a/src/locales/fr/ability-trigger.ts +++ b/src/locales/fr/ability-trigger.ts @@ -9,5 +9,54 @@ export const abilityTriggers: SimpleTranslationEntries = { "poisonHeal": "{{abilityName}} de {{pokemonName}}\nrestaure un peu ses PV !", "trace": "{{pokemonName}} copie le talent {{abilityName}}\nde {{targetName}} !", "windPowerCharged": "{{pokemonName}} a été touché par la capacité {{moveName}} et se charge en électricité !", - "quickDraw": "{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", + "quickDraw": "Tir Vif permet à {{pokemonName}}\nd’agir plus vite que d’habitude !", + "blockItemTheft": "{{abilityName}} de {{pokemonNameWithAffix}}\nempêche son objet d’être volé !", + "typeImmunityHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !", + "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} évite\nles dégâts avec {{abilityName}} !", + "postDefendDisguise": "Le déguisement de {{pokemonNameWithAffix}}\ntombe !", + "moveImmunity": "Ça n'affecte pas {{pokemonNameWithAffix}}…", + "reverseDrain": "{{pokemonNameWithAffix}} aspire\nle suintement !", + "postDefendTypeChange": "{{abilityName}} de {{pokemonNameWithAffix}}\nle transforme en type {{typeName}} !", + "postDefendContactDamage": "{{pokemonNameWithAffix}} est blessé\npar son talent {{abilityName}} !", + "postDefendAbilitySwap": "{{pokemonNameWithAffix}} et sa cible\néchangent leurs talents !", + "postDefendAbilityGive": "{{pokemonNameWithAffix}} donne\nle talent {{abilityName}} à sa cible !", + "postDefendMoveDisable": "La capacité {{moveName}}\nde {{pokemonNameWithAffix}} est mise sous entrave !", + "pokemonTypeChange": "{{pokemonNameWithAffix}} prend\nle type {{moveType}} !", + "postAttackStealHeldItem": "{{pokemonNameWithAffix}} vole\nl’objet {{stolenItemType}} de {{defenderName}} !", + "postDefendStealHeldItem": "{{pokemonNameWithAffix}} vole\nl’objet {{stolenItemType}} de {{attackerName}} !", + "copyFaintedAllyAbility": "{{pokemonNameWithAffix}} reçoit\nle talent {{abilityName}} !", + "intimidateImmunity": "{{abilityName}} de {{pokemonNameWithAffix}}\nl’empêche d'être intimidé !", + "postSummonAllyHeal": "{{pokemonNameWithAffix}} boit le thé\npréparé par {{pokemonName}} !", + "postSummonClearAllyStats": "Les stats de {{pokemonNameWithAffix}}\nsont revenues à la normale !", + "postSummonTransform": "{{pokemonNameWithAffix}} prend\nl’apparence de {{targetName}} !", + "protectStat": "{{abilityName}} de {{pokemonNameWithAffix}}\nempêche {{statName}} de baisser !", + "statusEffectImmunityWithName": "{{abilityName}} de {{pokemonNameWithAffix}}\nl’empêche d’être {{statusEffectName}} !", + "statusEffectImmunity": "{{abilityName}} de {{pokemonNameWithAffix}}\nempêche tout problème de statut !", + "battlerTagImmunity": "{{abilityName}} de {{pokemonNameWithAffix}}\nempêche {{battlerTagName}} !", + "forewarn": "La capacité {{moveName}}\nde {{pokemonNameWithAffix}} a été détectée !", + "frisk": "{{pokemonNameWithAffix}} fouille {{opponentName}}\net trouve son talent {{opponentAbilityName}} !", + "postWeatherLapseHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !", + "postWeatherLapseDamage": "{{pokemonNameWithAffix}} est blessé\npar son talent {{abilityName}} !", + "postTurnLootCreateEatenBerry": "{{pokemonNameWithAffix}} a récolté\nune {{berryName}} !", + "postTurnHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !", + "fetchBall": "{{pokemonNameWithAffix}} trouve\nune {{pokeballName}} !", + "healFromBerryUse": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaure un peu ses PV !", + "arenaTrap": "{{pokemonNameWithAffix}} empêche\nles changements grâce à son talent {{abilityName}} !", + "postBattleLoot": "{{pokemonNameWithAffix}} ramasse\nl’objet {{itemName}} !", + "postFaintContactDamage": "{{pokemonNameWithAffix}} est blessé\npar son talent {{abilityName}} !", + "postFaintHpDamage": "{{pokemonNameWithAffix}} est blessé\npar son talent {{abilityName}} !", + "postSummonPressure": "{{pokemonNameWithAffix}}\naugmente la pression !", + "postSummonMoldBreaker": "{{pokemonNameWithAffix}}\nbrise le moule !", + "postSummonAnticipation": "{{pokemonNameWithAffix}}\nest tout tremblant !", + "postSummonTurboblaze": "{{pokemonNameWithAffix}} dégage\nune aura de flammes incandescentes !", + "postSummonTeravolt": "{{pokemonNameWithAffix}} dégage\nune aura électrique instable !", + "postSummonDarkAura": "{{pokemonNameWithAffix}} dégage\nune aura ténébreuse !", + "postSummonFairyAura": "{{pokemonNameWithAffix}} dégage\nune aura enchanteresse !", + "postSummonNeutralizingGas": "Le gaz inhibiteur {{pokemonNameWithAffix}}\nenvahit les lieux !", + "postSummonAsOneGlastrier": "{{pokemonNameWithAffix}}\na deux talents !", + "postSummonAsOneSpectrier": "{{pokemonNameWithAffix}}\na deux talents !", + "postSummonVesselOfRuin": "L’Urne du Fléau de {{pokemonNameWithAffix}}\naffaiblit l’{{statName}} des Pokémon alentour !", + "postSummonSwordOfRuin": "L’Épée du Fléau de {{pokemonNameWithAffix}}\naffaiblit la {{statName}} des Pokémon alentour !", + "postSummonTabletsOfRuin": "Le Bois du Fléau de {{pokemonNameWithAffix}}\naffaiblit l’{{statName}} des Pokémon alentour !", + "postSummonBeadsOfRuin": "Les Perles du Fléau de {{pokemonNameWithAffix}}\naffaiblissent la {{statName}} des Pokémon alentour !", } as const; diff --git a/src/locales/fr/arena-flyout.ts b/src/locales/fr/arena-flyout.ts new file mode 100644 index 00000000000..cf412e3b671 --- /dev/null +++ b/src/locales/fr/arena-flyout.ts @@ -0,0 +1,49 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const arenaFlyout: SimpleTranslationEntries = { + // Title + "activeBattleEffects": "Effets Actifs", + "player": "Vous", + "neutral": "Neutre", + "enemy": "Ennemi", + + // WeatherType + "sunny": "Soleil", + "rain": "Pluie", + "sandstorm": "Tempête de Sable", + "hail": "Grêle", + "snow": "Neige", + "fog": "Brouillard", + "heavyRain": "Pluie Battante", + "harshSun": "Soleil Brulant", + "strongWinds": "Vent Mystérieux", + + // TerrainType + "misty": "Champ Brumeux", + "electric": "Champ Électrifié", + "grassy": "Champ Herbu", + "psychic": "Champ Psychique", + + // ArenaTagType + "mudSport": "Lance-Boue", + "waterSport": "Tourniquet", + "spikes": "Picots", + "toxicSpikes": "Pics Toxik", + "mist": "Brume", + "futureSight": "Prescience", + "doomDesire": "Vœu Destructeur", + "wish": "Vœu", + "stealthRock": "Piège de Roc", + "stickyWeb": "Toile Gluante", + "trickRoom": "Distorsion", + "gravity": "Gravité", + "reflect": "Protection", + "lightScreen": "Mur Lumière", + "auroraVeil": "Voile Aurore", + "quickGuard": "Prévention", + "wideGuard": "Garde Large", + "matBlock": "Tatamigaeshi", + "craftyShield": "Vigilance", + "tailwind": "Vent Arrière", + "happyHour": "Étrennes", +}; diff --git a/src/locales/fr/battle-info.ts b/src/locales/fr/battle-info.ts new file mode 100644 index 00000000000..a0b2ad2911a --- /dev/null +++ b/src/locales/fr/battle-info.ts @@ -0,0 +1,5 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battleInfo: SimpleTranslationEntries = { + "generation": "Génération {{generation}}", +} as const; diff --git a/src/locales/fr/battle.ts b/src/locales/fr/battle.ts index fc155664aaa..861dc6fd73c 100644 --- a/src/locales/fr/battle.ts +++ b/src/locales/fr/battle.ts @@ -66,18 +66,35 @@ export const battle: SimpleTranslationEntries = { "foePokemonWithAffix": "{{pokemonName}} ennemi", "useMove": "{{pokemonNameWithAffix}} utilise\n{{moveName}} !", "stealEatBerry": "{{pokemonName}} vole et mange\nla {{berryName}} de {{targetName}} !", + "ppHealBerry": "La {{berryName}} de {{pokemonNameWithAffix}}\nrestaure les PP de sa capacité {{moveName}} !", + "hpHealBerry": "La {{berryName}} de {{pokemonNameWithAffix}}\nrestaure son énergie !", "drainMessage": "L’énergie de {{pokemonName}}\nest drainée !", "regainHealth": "{{pokemonName}} récupère\ndes PV !", "fainted": "{{pokemonNameWithAffix}}\nest K.O. !", - "statRose": "{{stats}} de {{pokemonNameWithAffix}}\naugmente !", - "statSharplyRose": "{{stats}} de {{pokemonNameWithAffix}}\naugmente beaucoup !", - "statRoseDrastically": "{{stats}} de {{pokemonNameWithAffix}}\naugmente énormément !", - "statWontGoAnyHigher": "{{stats}} de {{pokemonNameWithAffix}}\nne peut plus augmenter !", - "statFell": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse !", - "statHarshlyFell": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse beaucoup !", - "statSeverelyFell": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse énormément !", - "statWontGoAnyLower": "{{stats}} de {{pokemonNameWithAffix}}\nne peut plus baisser !", + "statsAnd": "et", + "stats": "Les stats", + "statRose_one": "{{stats}} de {{pokemonNameWithAffix}}\naugmente !", + "statRose_other": "{{stats}} de {{pokemonNameWithAffix}}\naugmentent !", + "statSharplyRose_one": "{{stats}} de {{pokemonNameWithAffix}}\naugmente beaucoup !", + "statSharplyRose_other": "{{stats}} de {{pokemonNameWithAffix}}\naugmentent beaucoup !", + "statRoseDrastically_one": "{{stats}} de {{pokemonNameWithAffix}}\naugmente énormément !", + "statRoseDrastically_other": "{{stats}} de {{pokemonNameWithAffix}}\naugmentent énormément !", + "statWontGoAnyHigher_one": "{{stats}} de {{pokemonNameWithAffix}}\nne peut plus augmenter !", + "statWontGoAnyHigher_other": "{{stats}} de {{pokemonNameWithAffix}}\nne peuvent plus augmenter !", + "statFell_one": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse !", + "statFell_other": "{{stats}} de {{pokemonNameWithAffix}}\nbaissent !", + "statHarshlyFell_one": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse beaucoup !", + "statHarshlyFell_other": "{{stats}} de {{pokemonNameWithAffix}}\nbaissent beaucoup !", + "statSeverelyFell_one": "{{stats}} de {{pokemonNameWithAffix}}\nbaisse énormément !", + "statSeverelyFell_other": "{{stats}} de {{pokemonNameWithAffix}}\nbaissent énormément !", + "statWontGoAnyLower_one": "{{stats}} de {{pokemonNameWithAffix}}\nne peut plus baisser !", + "statWontGoAnyLower_other": "{{stats}} de {{pokemonNameWithAffix}}\nne peuvent plus baisser !", + "transformedIntoType": "{{pokemonName}} transformed\ninto the {{type}} type!", "ppReduced": "Les PP de la capacité {{moveName}}\nde {{targetName}} baissent de {{reduction}} !", + "retryBattle": "Voulez-vous réessayer depuis le début du combat ?", + "unlockedSomething": "{{unlockedThing}}\na été débloqué.", + "congratulations": "Félicitations !", + "beatModeFirstTime": "{{speciesName}} a battu le mode {{gameMode}} pour la première fois !\nVous avez reçu {{newModifier}} !", "battlerTagsRechargingLapse": "Le contrecoup empêche {{pokemonNameWithAffix}}\n de bouger !", "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}}\nne peut plus s’échapper !", "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} est libéré\nde la capacité {{moveName}} !", @@ -124,15 +141,19 @@ export const battle: SimpleTranslationEntries = { "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}}\nencaisse les coups !", "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}}\nencaisse les coups !", "battlerTagsPerishSongLapse": "Le compte à rebours de Requiem\nde {{pokemonNameWithAffix}} descend à {{turnCount}} !", - "battlerTagsTruantLapse": "{{pokemonNameWithAffix}} paresse !", - "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}}\nn’arrive pas à se motiver !", - "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}}\narrive enfin à s’y mettre sérieusement !", - "battlerTagsHighestStatBoostOnAdd": "{{statName}} de {{pokemonNameWithAffix}}\nest renforcée !", - "battlerTagsHighestStatBoostOnRemove": "L’effet du talent {{abilityName}}\nde {{pokemonNameWithAffix}} se dissipe !", + "battlerTagsCenterOfAttentionOnAdd": "{{pokemonNameWithAffix}} devient\nle centre de l’attention !", + "battlerTagsTruantLapse": "{{pokemonNameWithAffix}} paresse !", + "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}}\nn’arrive pas à se motiver !", + "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}}\narrive enfin à s’y mettre sérieusement !", + "battlerTagsHighestStatBoostOnAdd": "{{statName}} de {{pokemonNameWithAffix}}\nest renforcée !", + "battlerTagsHighestStatBoostOnRemove": "L’effet du talent {{abilityName}}\nde {{pokemonNameWithAffix}} se dissipe !", + "battlerTagsMagnetRisenOnAdd": "{{pokemonNameWithAffix}} lévite\nsur un champ magnétique !", + "battlerTagsMagnetRisenOnRemove": "Le magnétisme de{{pokemonNameWithAffix}}\nse dissipe !", "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}}\nest prêt à tout donner !", "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}} se détend.", "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}}\nest couvert de sel !", "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} est blessé\npar la capacité {{moveName}} !", "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}} sacrifie des PV\net lance une malédiction sur {{pokemonName}} !", - "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} est touché par la malédiction !" + "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} est touché par la malédiction !", + "battlerTagsStockpilingOnAdd": "{{pokemonNameWithAffix}} stockpiled {{stockpiledCount}}!" } as const; diff --git a/src/locales/fr/battler-tags.ts b/src/locales/fr/battler-tags.ts new file mode 100644 index 00000000000..971fe4e00d1 --- /dev/null +++ b/src/locales/fr/battler-tags.ts @@ -0,0 +1,12 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battlerTags: SimpleTranslationEntries = { + "trappedDesc": "le piège", + "flinchedDesc": "la peur", + "confusedDesc": "la confusion", + "infatuatedDesc": "l’amour", + "seedDesc": "l’infection", + "nightmareDesc": "les cauchemars", + "ingrainDesc": "l’enracinement", + "drowsyDesc": "la somnolence", +} as const; diff --git a/src/locales/fr/bgm-name.ts b/src/locales/fr/bgm-name.ts index 15ec145a6ff..c6453a919cf 100644 --- a/src/locales/fr/bgm-name.ts +++ b/src/locales/fr/bgm-name.ts @@ -110,9 +110,9 @@ export const bgmName: SimpleTranslationEntries = { "plains": "PDM EdS - Pic Céleste (prairie)", "power_plant": "PDM EdS - Plaines Élek", "ruins": "PDM EdS - Ruine Scellée", - "sea": "PDM EdS - Caverne Saline", + "sea": "Andr06 - Marine Mystique", // Name defined by the composer "seabed": "Firel - Seabed", // The composer thinks about a more creative name - "slum": "PDM EdS - Pic Céleste (côte)", + "slum": "Andr06 - Sneaky Snom", // Name defined by the composer "snowy_forest": "PDM EdS - Pic Céleste (plaine enneigée)", "space": "Firel - Aether", "swamp": "PDM EdS - Mer Fermée", diff --git a/src/locales/fr/config.ts b/src/locales/fr/config.ts index d8f9a6601c1..787c210c1b0 100644 --- a/src/locales/fr/config.ts +++ b/src/locales/fr/config.ts @@ -1,8 +1,11 @@ import { ability } from "./ability"; import { abilityTriggers } from "./ability-trigger"; +import { arenaFlyout } from "./arena-flyout"; import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; +import { battleInfo } from "./battle-info"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; +import { battlerTags } from "./battler-tags"; import { berry } from "./berry"; import { bgmName } from "./bgm-name"; import { biome } from "./biome"; @@ -31,8 +34,10 @@ import { move } from "./move"; import { nature } from "./nature"; import { pokeball } from "./pokeball"; import { pokemon } from "./pokemon"; +import { pokemonForm } from "./pokemon-form"; import { pokemonInfo } from "./pokemon-info"; import { pokemonInfoContainer } from "./pokemon-info-container"; +import { pokemonSummary } from "./pokemon-summary"; import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler"; import { splashMessages } from "./splash-messages"; import { starterSelectUiHandler } from "./starter-select-ui-handler"; @@ -49,8 +54,11 @@ import { modifierSelectUiHandler } from "./modifier-select-ui-handler"; export const frConfig = { ability: ability, abilityTriggers: abilityTriggers, + arenaFlyout: arenaFlyout, battle: battle, + battleInfo: battleInfo, battleMessageUiHandler: battleMessageUiHandler, + battlerTags: battlerTags, berry: berry, bgmName: bgmName, biome: biome, @@ -80,8 +88,10 @@ export const frConfig = { nature: nature, pokeball: pokeball, pokemon: pokemon, + pokemonForm: pokemonForm, pokemonInfo: pokemonInfo, pokemonInfoContainer: pokemonInfoContainer, + pokemonSummary: pokemonSummary, saveSlotSelectUiHandler: saveSlotSelectUiHandler, settings: settings, splashMessages: splashMessages, diff --git a/src/locales/fr/menu-ui-handler.ts b/src/locales/fr/menu-ui-handler.ts index 3eabc132f6b..70cf05fe984 100644 --- a/src/locales/fr/menu-ui-handler.ts +++ b/src/locales/fr/menu-ui-handler.ts @@ -18,6 +18,10 @@ export const menuUiHandler: SimpleTranslationEntries = { "exportSlotSelect": "Sélectionnez l’emplacement depuis lequel exporter les données.", "importData": "Importer données", "exportData": "Exporter données", + "linkDiscord": "Link Discord", + "unlinkDiscord": "Unlink Discord", + "linkGoogle": "Link Google", + "unlinkGoogle": "Unlink Google", "cancel": "Retour", "losingProgressionWarning": "Vous allez perdre votre progression depuis le début du combat. Continuer ?", "noEggs": "Vous ne faites actuellement\néclore aucun Œuf !" diff --git a/src/locales/fr/menu.ts b/src/locales/fr/menu.ts index 3aee5c42103..41927f83b1c 100644 --- a/src/locales/fr/menu.ts +++ b/src/locales/fr/menu.ts @@ -12,6 +12,7 @@ export const menu: SimpleTranslationEntries = { "username": "Nom d’utilisateur", "password": "Mot de passe", "login": "Connexion", + "orUse": "Ou utilisez", "register": "S’inscrire", "emptyUsername": "Le nom d’utilisateur est manquant", "invalidLoginUsername": "Le nom d’utilisateur n’est pas valide", @@ -48,5 +49,9 @@ export const menu: SimpleTranslationEntries = { "no":"Non", "disclaimer": "AVERTISSEMENT", "disclaimerDescription": "Ce jeu n’est pas un produit fini et peut contenir des problèmes de jouabilité, dont de possibles pertes de sauvegardes,\ndes modifications sans avertissement et pourrait ou non encore être mis à jour ou terminé.", + "choosePokemon": "Sélectionnez un Pokémon.", + "renamePokemon": "Renommer Pokémon", + "rename": "Renommer", + "nickname": "Surnom", "errorServerDown": "Oupsi ! Un problème de connexion au serveur est survenu.\n\nVous pouvez garder cette fenêtre ouverte,\nle jeu se reconnectera automatiquement.", } as const; diff --git a/src/locales/fr/modifier-type.ts b/src/locales/fr/modifier-type.ts index 498b064de75..671a122f992 100644 --- a/src/locales/fr/modifier-type.ts +++ b/src/locales/fr/modifier-type.ts @@ -58,10 +58,10 @@ export const modifierType: ModifierTypeTranslationEntries = { description: "Augmente de 20% la puissance des capacités de type {{moveType}} d’un Pokémon.", }, "PokemonLevelIncrementModifierType": { - description: "Fait monter un Pokémon d’un niveau.", + description: "Fait monter un Pokémon de {{levels}} niveau·x.", }, "AllPokemonLevelIncrementModifierType": { - description: "Fait monter toute l’équipe d’un niveau.", + description: "Fait monter toute l’équipe de {{levels}} niveau·x.", }, "PokemonBaseStatBoosterModifierType": { description: "Augmente de 10% {{statName}} de base de son porteur. Plus les IV sont hauts, plus il peut en porter.", @@ -153,6 +153,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "REVIVER_SEED": { name: "Résugraine", description: "Réanime et restaure la moitié des PV de son porteur s’il est mis K.O. par une capacité directe." }, + "WHITE_HERB": { name: "White Herb", description: "An item to be held by a Pokémon. It will restore any lowered stat in battle." }, + "ETHER": { name: "Huile" }, "MAX_ETHER": { name: "Huile Max" }, @@ -182,6 +184,9 @@ export const modifierType: ModifierTypeTranslationEntries = { "SOOTHE_BELL": { name: "Grelot Zen" }, + "SCOPE_LENS": { name: "Lentilscope", description: "Une lentille qui augmente le taux de critiques du porteur." }, + "LEEK": { name: "Poireau", description: "Objet à faire tenir à Canarticho. Un poireau très long et solide qui augmente son taux de critiques." }, + "EVIOLITE": { name: "Évoluroc", description: "Un étrange concentré d’évolution qui augmente la Défense et la Défense Spéciale d’un Pokémon pouvant évoluer." }, "SOUL_DEW": { name: "Rosée Âme", description: "Augmente de 10% l’influence de la nature d’un Pokémon sur ses statistiques (cumulatif)." }, diff --git a/src/locales/fr/modifier.ts b/src/locales/fr/modifier.ts index f215e258a76..3cc72600f91 100644 --- a/src/locales/fr/modifier.ts +++ b/src/locales/fr/modifier.ts @@ -5,6 +5,7 @@ export const modifier: SimpleTranslationEntries = { "turnHealApply": "Les PV de {{pokemonNameWithAffix}}\nsont un peu restaurés par les {{typeName}} !", "hitHealApply": "Les PV de {{pokemonNameWithAffix}}\nsont un peu restaurés par le {{typeName}} !", "pokemonInstantReviveApply": "{{pokemonNameWithAffix}} a repris connaissance\navec sa {{typeName}} et est prêt à se battre de nouveau !", + "pokemonResetNegativeStatStageApply": "{{pokemonNameWithAffix}}'s lowered stats were restored\nby its {{typeName}}!", "moneyInterestApply": "La {{typeName}} vous rapporte\n{{moneyAmount}} ₽ d’intérêts !", "turnHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} est absorbé·e\npar le {{typeName}} de {{pokemonName}} !", "contactHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} est volé·e\npar l’{{typeName}} de {{pokemonName}} !", diff --git a/src/locales/fr/move.ts b/src/locales/fr/move.ts index 3fea8995694..425d9226d57 100644 --- a/src/locales/fr/move.ts +++ b/src/locales/fr/move.ts @@ -2975,7 +2975,7 @@ export const move: MoveTranslationEntries = { }, "dynamaxCannon": { name: "Canon Dynamax", - effect: "Le lanceur attaque en émettant un laser depuis son noyau. Cette capacité inflige deux fois plus de dégâts si l’adversaire est level 200." + effect: "Le lanceur attaque en libérant l’énergie concentrée dans son noyau. Inflige jusqu’à deux fois plus de dégâts si l’adversaire a un niveau très élevé." }, "snipeShot": { name: "Tir de Précision", diff --git a/src/locales/fr/party-ui-handler.ts b/src/locales/fr/party-ui-handler.ts index b1324f52398..158a6e8416a 100644 --- a/src/locales/fr/party-ui-handler.ts +++ b/src/locales/fr/party-ui-handler.ts @@ -16,6 +16,7 @@ export const partyUiHandler: SimpleTranslationEntries = { "PASS_BATON": "Relais", "UNPAUSE_EVOLUTION": "Réactiver Évolution", "REVIVE": "Ranimer", + "RENAME": "Renommer", "choosePokemon": "Sélectionnez un Pokémon.", "doWhatWithThisPokemon": "Que faire avec ce Pokémon ?", diff --git a/src/locales/fr/pokemon-form.ts b/src/locales/fr/pokemon-form.ts new file mode 100644 index 00000000000..09714f80f3b --- /dev/null +++ b/src/locales/fr/pokemon-form.ts @@ -0,0 +1,190 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const pokemonForm: SimpleTranslationEntries = { + // Battle forms + "mega": "Méga-{{pokemonName}}", + "mega-x": "Méga-{{pokemonName}} X", + "mega-y": "Méga-{{pokemonName}} Y", + "primal": "Primo-{{pokemonName}}", + "gigantamax": "{{pokemonName}} Gigamax", + "eternamax": "{{pokemonName}} Infinimax", + + // Starters forms + // 1G + "pikachuCosplay": "Cosplayeur", + "pikachuCoolCosplay": "Cosplay Rockeur", + "pikachuBeautyCosplay": "Cosplay Lady", + "pikachuCuteCosplay": "Cosplay Star", + "pikachuSmartCosplay": "Cosplay Docteur", + "pikachuToughCosplay": "Cosplay Catcheur", + "pikachuPartner": "Partenaire", + "eeveePartner": "Partenaire", + // 2G + "pichuSpiky": "Troizépi", + "unownA": "A", + "unownB": "B", + "unownC": "C", + "unownD": "D", + "unownE": "E", + "unownF": "F", + "unownG": "G", + "unownH": "H", + "unownI": "I", + "unownJ": "J", + "unownK": "K", + "unownL": "L", + "unownM": "M", + "unownN": "N", + "unownO": "O", + "unownP": "P", + "unownQ": "Q", + "unownR": "R", + "unownS": "S", + "unownT": "T", + "unownU": "U", + "unownV": "V", + "unownW": "W", + "unownX": "X", + "unownY": "Y", + "unownZ": "Z", + "unownExclamation": "!", + "unownQuestion": "?", + // 3G + "castformSunny": "Solaire", + "castformRainy": "Eau de Pluie", + "castformSnowy": "Blizzard", + "deoxysNormal": "Normal", + // 4G + "burmyPlant": "Plante", + "burmySandy": "Sable", + "burmyTrash": "Déchet", + "shellosEast": "Orient", + "shellosWest": "Occident", + "rotomHeat": "Chaleur", + "rotomWash": "Lavage", + "rotomFrost": "Froid", + "rotomFan": "Hélice", + "rotomMow": "Tonte", + "giratinaAltered": "Alternatif", + "shayminLand": "Terrestre", + // 5G + "basculinRedStriped": "Motif Rouge", + "basculinBlueStriped": "Motif Bleu", + "basculinWhiteStriped": "Motif Blanc", + "deerlingSpring": "Printemps", + "deerlingSummer": "Été", + "deerlingAutumn": "Automne", + "deerlingWinter": "Hiver", + "tornadusIncarnate": "Avatar", + "thundurusIncarnate": "Avatar", + "landorusIncarnate": "Avatar", + "keldeoOrdinary": "Normal", + "meloettaAria": "Chant", + // 6G + "froakieBattleBond": "Synergie", + "scatterbugMeadow": "Floraison", + "scatterbugIcySnow": "Blizzard", + "scatterbugPolar": "Banquise", + "scatterbugTundra": "Glace", + "scatterbugContinental": "Continent", + "scatterbugGarden": "Verdure", + "scatterbugElegant": "Monarchie", + "scatterbugModern": "Métropole", + "scatterbugMarine": "Rivage", + "scatterbugArchipelago": "Archipel", + "scatterbugHighPlains": "Sécheresse", + "scatterbugSandstorm": "Sable", + "scatterbugRiver": "Delta", + "scatterbugMonsoon": "Cyclone", + "scatterbugSavanna": "Mangrove", + "scatterbugSun": "Zénith", + "scatterbugOcean": "Levant", + "scatterbugJungle": "Jungle", + "scatterbugFancy": "Fantaisie", + "scatterbugPokeBall": "Poké Ball", + "flabebeRed": "Rouge", + "flabebeYellow": "Jaune", + "flabebeOrange": "Orange", + "flabebeBlue": "Bleu", + "flabebeWhite": "Blanc", + "furfrouHeart": "Cœur", + "furfrouStar": "Étoile", + "furfrouDiamond": "Diamant", + "furfrouDebutante": "Demoiselle", + "furfrouMatron": "Madame", + "furfrouDandy": "Monsieur", + "furfrouLaReine": "Reine", + "furfrouKabuki": "Kabuki", + "furfrouPharaoh": "Pharaon", + "pumpkabooSmall": "Mini", + "pumpkabooLarge": "Maxi", + "pumpkabooSuper": "Ultra", + "xerneasNeutral": "Paisible", + "xerneasActive": "Déchaîné", + "zygarde50": "Forme 50%", + "zygarde10": "Forme 10%", + "zygarde50Pc": "Rassemblement Forme 50%", + "zygarde10Pc": "Rassemblement Forme 10%", + "zygardeComplete": "Parfait", + // 7G + "oricorioBaile": "Flamenco", + "oricorioPompom": "Pom-Pom", + "oricorioPau": "Hula", + "oricorioSensu": "Buyō", + "rockruffOwnTempo": "Tempo Perso", + "miniorRedMeteor": "Météore Rouge", + "miniorOrangeMeteor": "Météore Orange", + "miniorYellowMeteor": "Météore Jaune", + "miniorGreenMeteor": "Météore Vert", + "miniorBlueMeteor": "Météore Bleu", + "miniorIndigoMeteor": "Météore Indigo", + "miniorVioletMeteor": "Météore Violet", + "miniorRed": "Rouge", + "miniorOrange": "Orange", + "miniorYellow": "Jaune", + "miniorGreen": "Vert", + "miniorBlue": "Bleu", + "miniorIndigo": "Indigo", + "miniorViolet": "Violet", + "mimikyuDisguised": "Déguisé", + "mimikyuBusted": "Démasqué", + "magearnaOriginal": "Couleur du Passé", + "marshadowZenith": "Zénith", + // 8G + "sinisteaPhony": "Contrefaçon", + "sinisteaAntique": "Authentique", + "eiscueNoIce": "Tête Dégel", + "indeedeeMale": "Mâle", + "indeedeeFemale": "Femelle", + "morpekoFullBelly": "Rassasié", + "zacianHeroOfManyBattles": "Héros Aguerri", + "zamazentaHeroOfManyBattles": "Héros Aguerri", + "zarudeDada": "Papa", + "enamorusIncarnate": "Avatar", + // 9G + "squawkabillyGreenPlumage": "Plumage Vert", + "squawkabillyBluePlumage": "Plumage Bleu", + "squawkabillyYellowPlumage": "Plumage Jaune", + "squawkabillyWhitePlumage": "Plumage Blanc", + "tatsugiriCurly": "Courbé", + "tatsugiriDroopy": "Affalé", + "tatsugiriStretchy": "Raide", + "gimmighoulChest": "Coffre", + "gimmighoulRoaming": "Marche", + "koraidonApexBuild": "Final", + "koraidonLimitedBuild":"Limité", + "koraidonSprintingBuild":"Course", + "koraidonSwimmingBuild":"Nage", + "koraidonGlidingBuild":"Vol", + "miraidonUltimateMode":"Ultime", + "miraidonLowPowerMode":"Bridé", + "miraidonDriveMode":"Terrestre", + "miraidonAquaticMode":"Aquatique", + "miraidonGlideMode":"Aérien", + "poltchageistCounterfeit": "Imitation", + "poltchageistArtisan": "Onéreux", + "paldeaTaurosCombat": "Combatif", + "paldeaTaurosBlaze": "Flamboyant", + "paldeaTaurosAqua": "Aquatique", + +} as const; diff --git a/src/locales/fr/pokemon-summary.ts b/src/locales/fr/pokemon-summary.ts new file mode 100644 index 00000000000..8f21a942c36 --- /dev/null +++ b/src/locales/fr/pokemon-summary.ts @@ -0,0 +1,20 @@ +import { TranslationEntries } from "#app/interfaces/locales"; + +export const pokemonSummary: TranslationEntries = { + "pokemonInfo": "Info Pokémon", + "status": "Statut", + "powerAccuracyCategory": "Puissance\nPrécision\nCatégorie", + "type": "Type", + "unknownTrainer": "Inconnu", + "ot": "D.O.", + "nature": "de nature", + "expPoints": "Points Exp.", + "nextLv": "N. suivant", + "cancel": "Annuler", + + "memoString": "{{natureFragment}} de nature,\n{{metFragment}}", + "metFragment": { + "normal": "rencontré au N.{{level}},\n{{biome}}.", + "apparently": "apparemment rencontré au N.{{level}},\n{{biome}}.", + }, +} as const; diff --git a/src/locales/fr/settings.ts b/src/locales/fr/settings.ts index cd85b0f8cb9..9e3bd04923a 100644 --- a/src/locales/fr/settings.ts +++ b/src/locales/fr/settings.ts @@ -95,5 +95,6 @@ export const settings: SimpleTranslationEntries = { "mute": "Muet", "controller": "Controller", "gamepadSupport": "Gamepad Support", - "showBgmBar": "Montrer titre de la musique", + "showBgmBar": "Titre de la musique", + "shopOverlayOpacity": "Opacité boutique" } as const; diff --git a/src/locales/fr/splash-messages.ts b/src/locales/fr/splash-messages.ts index 13de7f28116..1ee76ab9a13 100644 --- a/src/locales/fr/splash-messages.ts +++ b/src/locales/fr/splash-messages.ts @@ -34,4 +34,5 @@ export const splashMessages: SimpleTranslationEntries = { "alsoTryRadicalRed": "Essaye aussi Radical Red !", "eeveeExpo": "Eevee Expo !", "ynoproject": "YNOproject !", + "breedersInSpace": "Des Éleveurs dans l’espace !", } as const; diff --git a/src/locales/fr/starter-select-ui-handler.ts b/src/locales/fr/starter-select-ui-handler.ts index bddc740681e..fa45624c0f0 100644 --- a/src/locales/fr/starter-select-ui-handler.ts +++ b/src/locales/fr/starter-select-ui-handler.ts @@ -6,7 +6,8 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; * account interactions, descriptive text, etc. */ export const starterSelectUiHandler: SimpleTranslationEntries = { - "confirmStartTeam":"Commencer avec ces Pokémon ?", + "confirmStartTeam": "Commencer avec ces Pokémon ?", + "invalidParty": "This is not a valid starting party!", "gen1": "1G", "gen2": "2G", "gen3": "3G", diff --git a/src/locales/it/ability-trigger.ts b/src/locales/it/ability-trigger.ts index fd18147ac5a..4e965eacf32 100644 --- a/src/locales/it/ability-trigger.ts +++ b/src/locales/it/ability-trigger.ts @@ -5,7 +5,58 @@ export const abilityTriggers: SimpleTranslationEntries = { "badDreams": "{{pokemonName}} è tormentato dagli incubi!", "costar": "{{pokemonName}} ha copiato le modifiche alle statistiche\ndel suo alleato {{allyName}}!", "iceFaceAvoidedDamage": "{{pokemonName}} ha evitato\ni danni grazie a {{abilityName}}!", + "perishBody": "{{abilityName}} di {{pokemonName}}\nmanderà KO entrambi i Pokémon dopo 3 turni!", + "poisonHeal": "{{pokemonName}} recupera alcuni PS\ncon {{abilityName}}!", "trace": "L'abilità {{abilityName}} di {{targetName}}\nviene copiata da {{pokemonName}} con Traccia!", "windPowerCharged": "Venire colpito da {{moveName}} ha caricato {{pokemonName}}!", "quickDraw":"{{pokemonName}} agisce più rapidamente del normale grazie a Colpolesto!", + "blockItemTheft": "{{abilityName}} di {{pokemonNameWithAffix}}\nlo rende immune ai furti!", + "typeImmunityHeal": "{{pokemonName}} recupera alcuni PS\ncon {{abilityName}}!", + "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} evita il colpo\ncon {{abilityName}}!", + "postDefendDisguise": "{{pokemonNameWithAffix}} è stato smascherato!", + "moveImmunity": "Non ha effetto su {{pokemonNameWithAffix}}!", + "reverseDrain": "{{pokemonNameWithAffix}} ha assorbito la melma!", + "postDefendTypeChange": "{{abilityName}} di {{pokemonNameWithAffix}}\nlo ha reso di tipo {{typeName}}!", + "postDefendContactDamage": "{{abilityName}} di {{pokemonNameWithAffix}} ha\ndanneggiato il Pokémon che l'ha attaccato!", + "postDefendAbilitySwap": "{{pokemonNameWithAffix}} scambia\nla sua abilità con il bersaglio", + "postDefendAbilityGive": "{{abilityName}} di {{pokemonNameWithAffix}}\nviene ceduta al bersaglio!", + "postDefendMoveDisable": "La mossa {{moveName}} di {{pokemonNameWithAffix}}\nè stata bloccata!", + "pokemonTypeChange": "{{pokemonNameWithAffix}} è diventato di tipo {{moveType}}!", + "postAttackStealHeldItem": "{{pokemonNameWithAffix}} ruba\n{{stolenItemType}} di {{defenderName}}!", + "postDefendStealHeldItem": "{{pokemonNameWithAffix}} ruba\n{{stolenItemType}} di {{attackerName}}!", + "copyFaintedAllyAbility": "L'abilità {{abilityName}} di {{pokemonNameWithAffix}} è passata all'alleato!", + "intimidateImmunity": "{{pokemonNameWithAffix}}'s {{abilityName}} prevented it from being Intimidated!", + "postSummonAllyHeal": "{{pokemonNameWithAffix}} drank down all the\nmatcha that {{pokemonName}} made!", + "postSummonClearAllyStats": "{{pokemonNameWithAffix}}'s stat changes\nwere removed!", + "postSummonTransform": "{{pokemonNameWithAffix}} transformed\ninto {{targetName}}!", + "protectStat": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents lowering its {{statName}}!", + "statusEffectImmunityWithName": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents {{statusEffectName}}!", + "statusEffectImmunity": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents status problems!", + "battlerTagImmunity": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents {{battlerTagName}}!", + "forewarn": "{{pokemonNameWithAffix}} was forewarned about {{moveName}}!", + "frisk": "{{pokemonNameWithAffix}} frisked {{opponentName}}'s {{opponentAbilityName}}!", + "postWeatherLapseHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!", + "postWeatherLapseDamage": "{{pokemonNameWithAffix}} is hurt\nby its {{abilityName}}!", + "postTurnLootCreateEatenBerry": "{{pokemonNameWithAffix}} harvested one {{berryName}}!", + "postTurnHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!", + "fetchBall": "{{pokemonNameWithAffix}} found a\n{{pokeballName}}!", + "healFromBerryUse": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP!", + "arenaTrap": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents switching!", + "postBattleLoot": "{{pokemonNameWithAffix}} picked up\n{{itemName}}!", + "postFaintContactDamage": "{{pokemonNameWithAffix}}'s {{abilityName}}\nhurt its attacker!", + "postFaintHpDamage": "{{pokemonNameWithAffix}}'s {{abilityName}}\nhurt its attacker!", + "postSummonPressure": "{{pokemonNameWithAffix}} is exerting its Pressure!", + "postSummonMoldBreaker": "{{pokemonNameWithAffix}} breaks the mold!", + "postSummonAnticipation": "{{pokemonNameWithAffix}} shuddered!", + "postSummonTurboblaze": "{{pokemonNameWithAffix}} is radiating a blazing aura!", + "postSummonTeravolt": "{{pokemonNameWithAffix}} is radiating a bursting aura!", + "postSummonDarkAura": "{{pokemonNameWithAffix}} is radiating a Dark Aura!", + "postSummonFairyAura": "{{pokemonNameWithAffix}} is radiating a Fairy Aura!", + "postSummonNeutralizingGas": "{{pokemonNameWithAffix}}'s Neutralizing Gas filled the area!", + "postSummonAsOneGlastrier": "{{pokemonNameWithAffix}} has two Abilities!", + "postSummonAsOneSpectrier": "{{pokemonNameWithAffix}} has two Abilities!", + "postSummonVesselOfRuin": "{{pokemonNameWithAffix}}'s Vessel of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", + "postSummonSwordOfRuin": "{{pokemonNameWithAffix}}'s Sword of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", + "postSummonTabletsOfRuin": "{{pokemonNameWithAffix}}'s Tablets of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", + "postSummonBeadsOfRuin": "{{pokemonNameWithAffix}}'s Beads of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", } as const; diff --git a/src/locales/it/arena-flyout.ts b/src/locales/it/arena-flyout.ts new file mode 100644 index 00000000000..9e1e55226ea --- /dev/null +++ b/src/locales/it/arena-flyout.ts @@ -0,0 +1,49 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const arenaFlyout: SimpleTranslationEntries = { + // Title + "activeBattleEffects": "Effetti attivi in campo", + "player": "Giocatore", + "neutral": "Neutrali", + "enemy": "Nemico", + + // WeatherType + "sunny": "Sole", + "rain": "Pioggia", + "sandstorm": "Tempesta di sabbia", + "hail": "Grandine", + "snow": "Neve", + "fog": "Nebbia", + "heavyRain": "Acquazzone", + "harshSun": "Luce accecante", + "strongWinds": "Corrente d'aria misteriosa", + + // TerrainType + "misty": "Campo Nebbioso", + "electric": "Campo Elettrico", + "grassy": "Campo Erboso", + "psychic": "Campo Psichico", + + // ArenaTagType + "mudSport": "Fangata", + "waterSport": "Docciascudo", + "spikes": "Punte", + "toxicSpikes": "Fielepunte", + "mist": "Nebbia", + "futureSight": "Divinazione", + "doomDesire": "Desiderio Fatale", + "wish": "Desiderio", + "stealthRock": "Levitoroccia", + "stickyWeb": "Rete Vischiosa", + "trickRoom": "Distortozona", + "gravity": "Gravità", + "reflect": "Riflesso", + "lightScreen": "Schermoluce", + "auroraVeil": "Velaurora", + "quickGuard": "Anticipo", + "wideGuard": "Bodyguard", + "matBlock": "Ribaltappeto", + "craftyShield": "Truccodifesa", + "tailwind": "Ventoincoda", + "happyHour": "Cuccagna", +}; diff --git a/src/locales/it/battle-info.ts b/src/locales/it/battle-info.ts new file mode 100644 index 00000000000..195ad0616e0 --- /dev/null +++ b/src/locales/it/battle-info.ts @@ -0,0 +1,5 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battleInfo: SimpleTranslationEntries = { + "generation": "Generazione {{generation}}", +} as const; diff --git a/src/locales/it/battle.ts b/src/locales/it/battle.ts index 787888e333b..d728e624ae3 100644 --- a/src/locales/it/battle.ts +++ b/src/locales/it/battle.ts @@ -57,27 +57,44 @@ export const battle: SimpleTranslationEntries = { "escapeVerbSwitch": "cambiando", "escapeVerbFlee": "fuggendo", "notDisabled": "{{moveName}} di {{pokemonName}} non è più\ndisabilitata!", - "turnEndHpRestore": "{{pokemonName}}'s HP was restored.", - "hpIsFull": "{{pokemonName}}'s\nHP is full!", + "turnEndHpRestore": "{{pokemonName}} ha recuperato dei PS.", + "hpIsFull": "{{pokemonName}} ha già\ntutti i PS!", "skipItemQuestion": "Sei sicuro di non voler prendere nessun oggetto?", "eggHatching": "Oh?", "ivScannerUseQuestion": "Vuoi usare lo scanner di IV su {{pokemonName}}?", - "stealEatBerry": "{{pokemonName}} stole and ate\n{{targetName}}'s {{berryName}}!", + "stealEatBerry": "{{pokemonName}} ha rubato e mangiato\nla {{berryName}} di {{targetName}}!", + "ppHealBerry": "{{pokemonNameWithAffix}} recupera i PP della mossa {{moveName}}\ncon la sua {{berryName}}!", + "hpHealBerry": "{{pokemonNameWithAffix}} ristabilisce la sua salute\ncon la sua {{berryName}}!", "wildPokemonWithAffix": "{{pokemonName}} selvatico", "foePokemonWithAffix": "{{pokemonName}} avversario", "useMove": "{{pokemonNameWithAffix}} usa {{moveName}}!", "drainMessage": "Viene prelevata energia\n da{{pokemonName}}!", "regainHealth": "{{pokemonName}} ha rigenerato\npunti salute!", "fainted": "{{pokemonNameWithAffix}} non è più in\ngrado di combattere!", - "statRose": "{{pokemonNameWithAffix}}'s {{stats}} è aumentato/a!", - "statSharplyRose": "{{pokemonNameWithAffix}}'s {{stats}} è aumentato/a molto!", - "statRoseDrastically": "{{pokemonNameWithAffix}}'s {{stats}} è aumentato/a drasticamente!", - "statWontGoAnyHigher": "{{pokemonNameWithAffix}}'s {{stats}} non può aumentare più di così!", - "statFell": "{{pokemonNameWithAffix}}'s {{stats}} è diminuito/a!", - "statHarshlyFell": "{{pokemonNameWithAffix}}'s {{stats}} è diminuito/a molto!", - "statSeverelyFell": "{{pokemonNameWithAffix}}'s {{stats}} è diminuito/a drasticamente!", - "statWontGoAnyLower": "{{pokemonNameWithAffix}}'s {{stats}} non può diminuire più di così!", - "ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!", + "statsAnd": "and", + "stats": "Stats", + "statRose_one": "{{pokemonNameWithAffix}}'s {{stats}} è aumentato/a!", + "statRose_other": "{{pokemonNameWithAffix}}'s {{stats}} rose!", + "statSharplyRose_one": "{{pokemonNameWithAffix}}'s {{stats}} è aumentato/a molto!", + "statSharplyRose_other": "{{pokemonNameWithAffix}}'s {{stats}} sharply rose!", + "statRoseDrastically_one": "{{pokemonNameWithAffix}}'s {{stats}} è aumentato/a drasticamente!", + "statRoseDrastically_other": "{{pokemonNameWithAffix}}'s {{stats}} rose drastically!", + "statWontGoAnyHigher_one": "{{pokemonNameWithAffix}}'s {{stats}} non può aumentare più di così!", + "statWontGoAnyHigher_other": "{{pokemonNameWithAffix}}'s {{stats}} won't go any higher!", + "statFell_one": "{{pokemonNameWithAffix}}'s {{stats}} è diminuito/a!", + "statFell_other": "{{pokemonNameWithAffix}}'s {{stats}} fell!", + "statHarshlyFell_one": "{{pokemonNameWithAffix}}'s {{stats}} è diminuito/a molto!", + "statHarshlyFell_other": "{{pokemonNameWithAffix}}'s {{stats}} harshly fell!", + "statSeverelyFell_one": "{{pokemonNameWithAffix}}'s {{stats}} è diminuito/a drasticamente!", + "statSeverelyFell_other": "{{pokemonNameWithAffix}}'s {{stats}} severely fell!", + "statWontGoAnyLower_one": "{{pokemonNameWithAffix}}'s {{stats}} non può diminuire più di così!", + "statWontGoAnyLower_other": "{{pokemonNameWithAffix}}'s {{stats}} won't go any lower!", + "transformedIntoType": "{{pokemonName}} transformed\ninto the {{type}} type!", + "retryBattle": "Vuoi riprovare dall'inizio della lotta?", + "unlockedSomething": "{{unlockedThing}}\nè stato/a sbloccato/a.", + "congratulations": "Congratulazioni!", + "beatModeFirstTime": "{{speciesName}} ha completato la modalità {{gameMode}} per la prima volta!\nHai ricevuto {{newModifier}}!", + "ppReduced": "I PP della mossa {{moveName}} di\n{{targetName}} sono stati ridotti di {{reduction}}!", "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} deve\nricaricarsi!", "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} non può\npiù fuggire!", "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} è stato liberato\nda {{moveName}}", @@ -124,15 +141,19 @@ export const battle: SimpleTranslationEntries = { "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}} resiste\nal colpo!", "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}} ha resistito\ngrazie a Vigore!", "battlerTagsPerishSongLapse": "Il conto alla rovescia di Ultimocanto per {{pokemonNameWithAffix}} scende a {{turnCount}}.", + "battlerTagsCenterOfAttentionOnAdd": "{{pokemonNameWithAffix}} became the center\nof attention!", "battlerTagsTruantLapse": "{{pokemonNameWithAffix}} sta\nciondolando!", "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}} non\ningrana!", "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}} ritrova\nlo slancio!", "battlerTagsHighestStatBoostOnAdd": "{{statName}} di {{pokemonNameWithAffix}}\nviene aumentato/a!", "battlerTagsHighestStatBoostOnRemove": "Gli effetti di {{abilityName}}\ndi {{pokemonNameWithAffix}} sono cessati!", + "battlerTagsMagnetRisenOnAdd": "{{pokemonNameWithAffix}} levitated with electromagnetism!", + "battlerTagsMagnetRisenOnRemove": "{{pokemonNameWithAffix}}'s electromagnetism wore off!", "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}} si prepara\nalla lotta!", "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}} si è rilassato.", "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} è stato messo sotto sale!", "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} viene colpito da {{moveName}}!", "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}} ha sacrificato metà dei suoi PS per\nlanciare una maledizione su {{pokemonName}}!", - "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} subisce la maledizione!" + "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} subisce la maledizione!", + "battlerTagsStockpilingOnAdd": "{{pokemonNameWithAffix}} stockpiled {{stockpiledCount}}!" } as const; diff --git a/src/locales/it/battler-tags.ts b/src/locales/it/battler-tags.ts new file mode 100644 index 00000000000..1d897c70f3d --- /dev/null +++ b/src/locales/it/battler-tags.ts @@ -0,0 +1,12 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battlerTags: SimpleTranslationEntries = { + "trappedDesc": "trapping", + "flinchedDesc": "flinching", + "confusedDesc": "confusion", + "infatuatedDesc": "infatuation", + "seedDesc": "seeding", + "nightmareDesc": "nightmares", + "ingrainDesc": "roots", + "drowsyDesc": "drowsiness", +} as const; diff --git a/src/locales/it/bgm-name.ts b/src/locales/it/bgm-name.ts index 87d90dabc9d..01fb86b281d 100644 --- a/src/locales/it/bgm-name.ts +++ b/src/locales/it/bgm-name.ts @@ -110,9 +110,9 @@ export const bgmName: SimpleTranslationEntries = { "plains": "PMD EoS Sky Peak Prairie", "power_plant": "PMD EoS Far Amp Plains", "ruins": "PMD EoS Deep Sealed Ruin", - "sea": "PMD EoS Brine Cave", + "sea": "Andr06 - Marine Mystique", // Name defined by the composer "seabed": "Firel - Seabed", // The composer thinks about a more creative name - "slum": "PMD EoS Sky Peak Coast", + "slum": "Andr06 - Sneaky Snom", // Name defined by the composer "snowy_forest": "PMD EoS Sky Peak Snowfield", "space": "Firel - Aether", "swamp": "PMD EoS Surrounded Sea", diff --git a/src/locales/it/config.ts b/src/locales/it/config.ts index 5b370b00e4b..c22ab87949e 100644 --- a/src/locales/it/config.ts +++ b/src/locales/it/config.ts @@ -1,8 +1,11 @@ import { ability } from "./ability"; import { abilityTriggers } from "./ability-trigger"; +import { arenaFlyout } from "./arena-flyout"; import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; +import { battleInfo } from "./battle-info"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; +import { battlerTags } from "./battler-tags"; import { berry } from "./berry"; import { bgmName } from "./bgm-name"; import { biome } from "./biome"; @@ -31,8 +34,10 @@ import { move } from "./move"; import { nature } from "./nature"; import { pokeball } from "./pokeball"; import { pokemon } from "./pokemon"; +import { pokemonForm } from "./pokemon-form"; import { pokemonInfo } from "./pokemon-info"; import { pokemonInfoContainer } from "./pokemon-info-container"; +import { pokemonSummary } from "./pokemon-summary"; import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler"; import { splashMessages } from "./splash-messages"; import { starterSelectUiHandler } from "./starter-select-ui-handler"; @@ -49,8 +54,11 @@ import { modifierSelectUiHandler } from "./modifier-select-ui-handler"; export const itConfig = { ability: ability, abilityTriggers: abilityTriggers, + arenaFlyout: arenaFlyout, battle: battle, + battleInfo: battleInfo, battleMessageUiHandler: battleMessageUiHandler, + battlerTags: battlerTags, berry: berry, bgmName: bgmName, biome: biome, @@ -80,8 +88,10 @@ export const itConfig = { nature: nature, pokeball: pokeball, pokemon: pokemon, + pokemonForm: pokemonForm, pokemonInfo: pokemonInfo, pokemonInfoContainer: pokemonInfoContainer, + pokemonSummary: pokemonSummary, saveSlotSelectUiHandler: saveSlotSelectUiHandler, settings: settings, splashMessages: splashMessages, diff --git a/src/locales/it/egg.ts b/src/locales/it/egg.ts index c51f12065a1..5e5ddee2e2f 100644 --- a/src/locales/it/egg.ts +++ b/src/locales/it/egg.ts @@ -16,13 +16,13 @@ export const egg: SimpleTranslationEntries = { "selectMachine": "Seleziona un macchinario.", "notEnoughVouchers": "Non hai abbastanza biglietti!", "tooManyEggs": "Hai troppe uova!", - "pull": "Estrazione", - "pulls": "Estrazioni", - "sameSpeciesEgg": "{{species}} will hatch from this egg!", + "pull": "tiro", + "pulls": "tiri", + "sameSpeciesEgg": "{{species}} si schiuderà da quest'uovo!", "hatchFromTheEgg": "Dall’Uovo è nato {{pokemonName}}!", - "eggMoveUnlock": "Egg Move unlocked: {{moveName}}", - "rareEggMoveUnlock": "Rare Egg Move unlocked: {{moveName}}", - "moveUPGacha": "Move UP!", - "shinyUPGacha": "Shiny UP!", - "legendaryUPGacha": "UP!", + "eggMoveUnlock": "Mossa da uovo sbloccata: {{moveName}}", + "rareEggMoveUnlock": "Mossa da uovo rara sbloccata: {{moveName}}", + "moveUPGacha": "Mossa +", + "shinyUPGacha": "Shiny +", + "legendaryUPGacha": "+", } as const; diff --git a/src/locales/it/game-stats-ui-handler.ts b/src/locales/it/game-stats-ui-handler.ts index f4b5f80e23b..904acbf610d 100644 --- a/src/locales/it/game-stats-ui-handler.ts +++ b/src/locales/it/game-stats-ui-handler.ts @@ -9,13 +9,13 @@ export const gameStatsUiHandler: SimpleTranslationEntries = { "speciesSeen": "Specie viste", "speciesCaught": "Specie catturate", "ribbonsOwned": "Fiocchi ottenuti", - "classicRuns": "Run in modalità classica", - "classicWins": "Vittorie in modalità classica", + "classicRuns": "Totale run (classica)", + "classicWins": "Totale Vittorie (classica)", "dailyRunAttempts": "Tentativi di run giornaliere", "dailyRunWins": "Run giornaliere vinte", "endlessRuns": "Run in modalità infinita", - "highestWaveEndless": "Orda più alta raggiunta (Infinita)", - "highestMoney": "Patrimonio maggiore posseduto", + "highestWaveEndless": "Orda più alta (Infinita)", + "highestMoney": "Miglior patrimonio", "highestDamage": "Danni maggiori inflitti", "highestHPHealed": "PS maggiori rigenerati", "pokemonEncountered": "Pokémon incontrati", diff --git a/src/locales/it/menu-ui-handler.ts b/src/locales/it/menu-ui-handler.ts index 5bd845448aa..58e48574476 100644 --- a/src/locales/it/menu-ui-handler.ts +++ b/src/locales/it/menu-ui-handler.ts @@ -16,6 +16,10 @@ export const menuUiHandler: SimpleTranslationEntries = { "importSlotSelect": "Seleziona uno slot in cui importare.", "exportSession": "Esporta sessione", "exportSlotSelect": "Seleziona uno slot da cui esportare.", + "linkDiscord": "Link Discord", + "unlinkDiscord": "Unlink Discord", + "linkGoogle": "Link Google", + "unlinkGoogle": "Unlink Google", "importData": "Importa dati", "exportData": "Esporta dati", "cancel": "Annulla", diff --git a/src/locales/it/menu.ts b/src/locales/it/menu.ts index 3e083d3d374..9766708f7ae 100644 --- a/src/locales/it/menu.ts +++ b/src/locales/it/menu.ts @@ -17,6 +17,7 @@ export const menu: SimpleTranslationEntries = { "username": "Nome utente", "password": "Password", "login": "Accedi", + "orUse": "Or use", "register": "Registrati", "emptyUsername": "Nome utente mancante!", "invalidLoginUsername": "Nome utente non valido!", @@ -53,5 +54,9 @@ export const menu: SimpleTranslationEntries = { "no":"No", "disclaimer": "DISCLAIMER", "disclaimerDescription": "Questo gioco è un prodotto incompleto; si potrebbero riscontrare errori (inclusa la perdita dei dati di salvataggio),\ncambiamenti impercettibili, e non è detto che venga aggiornato nel tempo o mai completato del tutto.", - "errorServerDown": "Oops! There was an issue contacting the server.\n\nYou may leave this window open,\nthe game will automatically reconnect.", + "choosePokemon": "Scegli un Pokémon.", + "renamePokemon": "Rinomina un Pokémon", + "rename": "Rinomina", + "nickname": "Nickname", + "errorServerDown": "Poffarbacco! C'è stato un errore nella comunicazione col server.\n\nPuoi lasciare questa finestra aperta,\nil gioco si riconnetterà automaticamente.", } as const; diff --git a/src/locales/it/modifier-type.ts b/src/locales/it/modifier-type.ts index 1d8b0232e70..618d19395e5 100644 --- a/src/locales/it/modifier-type.ts +++ b/src/locales/it/modifier-type.ts @@ -58,10 +58,10 @@ export const modifierType: ModifierTypeTranslationEntries = { description: "Aumenta la potenza delle mosse di tipo {{moveType}} del 20% per un Pokémon.", }, "PokemonLevelIncrementModifierType": { - description: "Fa salire un Pokémon di un livello.", + description: "Aumenta il livello di un Pokémon di {{levels}}.", }, "AllPokemonLevelIncrementModifierType": { - description: "Aumenta il livello di tutti i Pokémon nel gruppo di 1.", + description: "Aumenta i livell di tutti i Pokémon della squadra di {{levels}}.", }, "PokemonBaseStatBoosterModifierType": { description: "Aumenta {{statName}} di base del possessore del 10%.", @@ -153,6 +153,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "REVIVER_SEED": { name: "Revitalseme", description: "Il possessore recupera 1/2 di PS in caso di KO causato da un colpo diretto." }, + "WHITE_HERB": { name: "Erbachiara", description: "An item to be held by a Pokémon. It will restore any lowered stat in battle." }, + "ETHER": { name: "Etere" }, "MAX_ETHER": { name: "Etere max" }, @@ -181,6 +183,10 @@ export const modifierType: ModifierTypeTranslationEntries = { "GOLDEN_EGG": { name: "Uovo dorato" }, "SOOTHE_BELL": { name: "Calmanella" }, + + "SCOPE_LENS": { name: "Mirino", description: "Lente che aumenta la probabilità di sferrare brutti colpi." }, + "LEEK": { name: "Porro", description: "Strumento da dare a Farfetch'd. Lungo gambo di porro che aumenta la probabilità di sferrare brutti colpi." }, + "EVIOLITE": { name: "Evolcondensa", description: "Misteriosa materia evolutiva. Aumenta la Difesa e la Difesa Speciale di un Pokémon che può ancora evolversi." }, "SOUL_DEW": { name: "Cuorugiada", description: "Aumenta del 10% l'influenza della natura di un Pokémon sulle sue statistiche (cumulativo)." }, diff --git a/src/locales/it/modifier.ts b/src/locales/it/modifier.ts index d3da4c2150b..85098cdaaec 100644 --- a/src/locales/it/modifier.ts +++ b/src/locales/it/modifier.ts @@ -5,6 +5,7 @@ export const modifier: SimpleTranslationEntries = { "turnHealApply": "{{pokemonNameWithAffix}} restored a little HP using\nits {{typeName}}!", "hitHealApply": "{{pokemonNameWithAffix}} restored a little HP using\nits {{typeName}}!", "pokemonInstantReviveApply": "{{pokemonNameWithAffix}} was revived\nby its {{typeName}}!", + "pokemonResetNegativeStatStageApply": "{{pokemonNameWithAffix}}'s lowered stats were restored\nby its {{typeName}}!", "moneyInterestApply": "You received interest of ₽{{moneyAmount}}\nfrom the {{typeName}}!", "turnHeldItemTransferApply": "{{pokemonNameWithAffix}}'s {{itemName}} was absorbed\nby {{pokemonName}}'s {{typeName}}!", "contactHeldItemTransferApply": "{{pokemonNameWithAffix}}'s {{itemName}} was snatched\nby {{pokemonName}}'s {{typeName}}!", diff --git a/src/locales/it/move.ts b/src/locales/it/move.ts index a7ebd605f18..a2c99218cec 100644 --- a/src/locales/it/move.ts +++ b/src/locales/it/move.ts @@ -2975,7 +2975,7 @@ export const move: MoveTranslationEntries = { }, dynamaxCannon: { name: "Cannone Dynamax", - effect: "Il Pokémon attacca emettendo dal suo nucleo l'energia concentrata nel corpo.", + effect: "Il Pokémon attacca emettendo dal suo nucleo l'energia concentrata nel corpo. Se il bersaglio è overlivellato, i danni inflitti aumentano.", }, snipeShot: { name: "Tiromirato", diff --git a/src/locales/it/party-ui-handler.ts b/src/locales/it/party-ui-handler.ts index 86966a6e7f9..979e04f3ea1 100644 --- a/src/locales/it/party-ui-handler.ts +++ b/src/locales/it/party-ui-handler.ts @@ -16,6 +16,7 @@ export const partyUiHandler: SimpleTranslationEntries = { "PASS_BATON": "Pass Baton", "UNPAUSE_EVOLUTION": "Unpause Evolution", "REVIVE": "Revive", + "RENAME": "Rinomina", "choosePokemon": "Choose a Pokémon.", "doWhatWithThisPokemon": "Do what with this Pokémon?", diff --git a/src/locales/it/pokemon-form.ts b/src/locales/it/pokemon-form.ts new file mode 100644 index 00000000000..1831e1f600e --- /dev/null +++ b/src/locales/it/pokemon-form.ts @@ -0,0 +1,190 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const pokemonForm: SimpleTranslationEntries = { + // Battle forms + "mega": "Mega {{pokemonName}}", + "mega-x": "Mega {{pokemonName}} X", + "mega-y": "Mega {{pokemonName}} Y", + "primal": "Archeo {{pokemonName}}", + "gigantamax": "GigaMax {{pokemonName}}", + "eternamax": "EternaMax {{pokemonName}}", + + // Starters forms + // 1G + "pikachuCosplay": "Cosplay", + "pikachuCoolCosplay": "Cosplay classe", + "pikachuBeautyCosplay": "Cosplay bellezza", + "pikachuCuteCosplay": "Cosplay grazie", + "pikachuSmartCosplay": "Cosplay acume", + "pikachuToughCosplay": "Cosplay grinta", + "pikachuPartner": "Compagno", + "eeveePartner": "Compagno", + // 2G + "pichuSpiky": "Spunzorek", + "unownA": "A", + "unownB": "B", + "unownC": "C", + "unownD": "D", + "unownE": "E", + "unownF": "F", + "unownG": "G", + "unownH": "H", + "unownI": "I", + "unownJ": "J", + "unownK": "K", + "unownL": "L", + "unownM": "M", + "unownN": "N", + "unownO": "O", + "unownP": "P", + "unownQ": "Q", + "unownR": "R", + "unownS": "S", + "unownT": "T", + "unownU": "U", + "unownV": "V", + "unownW": "W", + "unownX": "X", + "unownY": "Y", + "unownZ": "Z", + "unownExclamation": "!", + "unownQuestion": "?", + // 3G + "castformSunny": "Sole", + "castformRainy": "Pioggia", + "castformSnowy": "Nuvola di neve", + "deoxysNormal": "Normale", + // 4G + "burmyPlant": "Pianta", + "burmySandy": "Sabbia", + "burmyTrash": "Scarti", + "shellosEast": "Est", + "shellosWest": "Ovest", + "rotomHeat": "Calore", + "rotomWash": "Lavaggio", + "rotomFrost": "Gelo", + "rotomFan": "Vortice", + "rotomMow": "Taglio", + "giratinaAltered": "Alterata", + "shayminLand": "Terra", + // 5G + "basculinRedStriped": "Linearossa", + "basculinBlueStriped": "Lineablu", + "basculinWhiteStriped": "Lineabianca", + "deerlingSpring": "Primavera", + "deerlingSummer": "Estate", + "deerlingAutumn": "Autunno", + "deerlingWinter": "Inverno", + "tornadusIncarnate": "Incarnazione", + "thundurusIncarnate": "Incarnazione", + "landorusIncarnate": "Incarnazione", + "keldeoOrdinary": "Normale", + "meloettaAria": "Canto", + // 6G + "froakieBattleBond": "Morfosintonia", + "scatterbugMeadow": "Giardinfiore", + "scatterbugIcySnow": "Nevi perenni", + "scatterbugPolar": "Nordico", + "scatterbugTundra": "Manto di neve", + "scatterbugContinental": "Continentale", + "scatterbugGarden": "Prato", + "scatterbugElegant": "Eleganza", + "scatterbugModern": "Trendy", + "scatterbugMarine": "Marino", + "scatterbugArchipelago": "Arcipelago", + "scatterbugHighPlains": "Deserto", + "scatterbugSandstorm": "Sabbia", + "scatterbugRiver": "Fluviale", + "scatterbugMonsoon": "Pluviale", + "scatterbugSavanna": "Savana", + "scatterbugSun": "Solare", + "scatterbugOcean": "Oceanico", + "scatterbugJungle": "Giungla", + "scatterbugFancy": "Sbarazzino", + "scatterbugPokeBall": "Poké Ball", + "flabebeRed": "Rosso", + "flabebeYellow": "Giallo", + "flabebeOrange": "Arancione", + "flabebeBlue": "Blu", + "flabebeWhite": "Bianco", + "furfrouHeart": "Cuore", + "furfrouStar": "Stella", + "furfrouDiamond": "Diamante", + "furfrouDebutante": "Signorina", + "furfrouMatron": "Gentildonna", + "furfrouDandy": "Gentiluomo", + "furfrouLaReine": "Regina", + "furfrouKabuki": "Kabuki", + "furfrouPharaoh": "Faraone", + "pumpkabooSmall": "Mini", + "pumpkabooLarge": "Grande", + "pumpkabooSuper": "Maxi", + "xerneasNeutral": "Relax", + "xerneasActive": "Attivo", + "zygarde50": "Forma 50%", + "zygarde10": "Forma 10%", + "zygarde50Pc": "Forma 50% Sciamefusione", + "zygarde10Pc": "Forma 10% Sciamefusione", + "zygardeComplete": "Forma perfetta", + // 7G + "oricorioBaile": "Flamenco", + "oricorioPompom": "Cheerdance", + "oricorioPau": "Hula", + "oricorioSensu": "Buyō", + "rockruffOwnTempo": "Mentelocale", + "miniorRedMeteor": "Nucleo Rosso", + "miniorOrangeMeteor": "Nucleo Arancione", + "miniorYellowMeteor": "Nucleo Giallo", + "miniorGreenMeteor": "Nucleo Verde", + "miniorBlueMeteor": "Nucleo Azzurro", + "miniorIndigoMeteor": "Nucleo Indaco", + "miniorVioletMeteor": "Nucleo Violetto", + "miniorRed": "Rosso", + "miniorOrange": "Arancione", + "miniorYellow": "Giallo", + "miniorGreen": "Verde", + "miniorBlue": "Azzurro", + "miniorIndigo": "Indaco", + "miniorViolet": "Violetto", + "mimikyuDisguised": "Mascherata", + "mimikyuBusted": "Smascherata", + "magearnaOriginal": "Colore Antico", + "marshadowZenith": "Zenith", + // 8G + "sinisteaPhony": "Contraffatta", + "sinisteaAntique": "Autentica", + "eiscueNoIce": "Liquefaccia", + "indeedeeMale": "Maschio", + "indeedeeFemale": "Femmina", + "morpekoFullBelly": "Panciapiena", + "zacianHeroOfManyBattles": "Eroe di Mille Lotte", + "zamazentaHeroOfManyBattles": "Eroe di Mille Lotte", + "zarudeDada": "Papà", + "enamorusIncarnate": "Incarnazione", + // 9G + "squawkabillyGreenPlumage": "Piume Verdi", + "squawkabillyBluePlumage": "Piume Azzurre", + "squawkabillyYellowPlumage": "Piume Gialle", + "squawkabillyWhitePlumage": "Piume Bianche", + "tatsugiriCurly": "Arcuata", + "tatsugiriDroopy": "Adagiata", + "tatsugiriStretchy": "Tesa", + "gimmighoulChest": "Scrigno", + "gimmighoulRoaming": "Ambulante", + "koraidonApexBuild": "Foggia Integrale", + "koraidonLimitedBuild":"Foggia Parziale", + "koraidonSprintingBuild":"Foggia Scattante", + "koraidonSwimmingBuild":"Foggia Nautica", + "koraidonGlidingBuild":"Foggia Librata", + "miraidonUltimateMode":"Assetto Completo", + "miraidonLowPowerMode":"Assetto Limitato", + "miraidonDriveMode":"Assetto Sprint", + "miraidonAquaticMode":"Assetto Nuoto", + "miraidonGlideMode":"Assetto Planata", + "poltchageistCounterfeit": "Taroccata", + "poltchageistArtisan": "Pregiata", + "paldeaTaurosCombat": "Combattiva", + "paldeaTaurosBlaze": "Infuocata", + "paldeaTaurosAqua": "Acquatica", + +} as const; diff --git a/src/locales/it/pokemon-summary.ts b/src/locales/it/pokemon-summary.ts new file mode 100644 index 00000000000..7f17440b16c --- /dev/null +++ b/src/locales/it/pokemon-summary.ts @@ -0,0 +1,20 @@ +import { TranslationEntries } from "#app/interfaces/locales"; + +export const pokemonSummary: TranslationEntries = { + "pokemonInfo": "Info Pokémon", + "status": "Stato", + "powerAccuracyCategory": "Potenza\nPrecisione\nCategoria", + "type": "Tipo", + "unknownTrainer": "Sconosciuto", + "ot": "AO", + "nature": "natura", + "expPoints": "Punti Esp.", + "nextLv": "Prossimo Lv.", + "cancel": "Annulla", + + "memoString": "Natura {{natureFragment}},\n{{metFragment}}", + "metFragment": { + "normal": "incontrato al Lv.{{level}},\n{{biome}}.", + "apparently": "apparentemente incontrato al Lv.{{level}},\n{{biome}}.", + }, +} as const; diff --git a/src/locales/it/settings.ts b/src/locales/it/settings.ts index af48368aeeb..07cbe6b7f46 100644 --- a/src/locales/it/settings.ts +++ b/src/locales/it/settings.ts @@ -3,7 +3,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales.js"; export const settings: SimpleTranslationEntries = { "boy": "Ragazzo", "girl": "Ragazza", - "general": "General", + "general": "Generale", "display": "Display", "audio": "Audio", "gamepad": "Gamepad", @@ -94,6 +94,7 @@ export const settings: SimpleTranslationEntries = { "alt": " (Alt)", "mute": "Mute", "controller": "Controller", - "gamepadSupport": "Gamepad Support", - "showBgmBar": "Show Music Names", + "gamepadSupport": "Supporto Gamepad", + "showBgmBar": "Mostra Nomi Musica", + "shopOverlayOpacity": "Opacità Finestra Negozio" } as const; diff --git a/src/locales/it/splash-messages.ts b/src/locales/it/splash-messages.ts index eeb71842094..dbbb0a5bcea 100644 --- a/src/locales/it/splash-messages.ts +++ b/src/locales/it/splash-messages.ts @@ -34,4 +34,5 @@ export const splashMessages: SimpleTranslationEntries = { "alsoTryRadicalRed": "Prova anche Radical Red!", "eeveeExpo": "Eevee Expo!", "ynoproject": "YNOproject!", + "breedersInSpace": "Allevapokémon nello spazio!", } as const; diff --git a/src/locales/it/starter-select-ui-handler.ts b/src/locales/it/starter-select-ui-handler.ts index c84334fcd6a..8b42a0db8de 100644 --- a/src/locales/it/starter-select-ui-handler.ts +++ b/src/locales/it/starter-select-ui-handler.ts @@ -6,7 +6,8 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; * account interactions, descriptive text, etc. */ export const starterSelectUiHandler: SimpleTranslationEntries = { - "confirmStartTeam":"Vuoi iniziare con questi Pokémon?", + "confirmStartTeam": "Vuoi iniziare con questi Pokémon?", + "invalidParty": "This is not a valid starting party!", "gen1": "1ª", "gen2": "2ª", "gen3": "3ª", diff --git a/src/locales/ko/ability-trigger.ts b/src/locales/ko/ability-trigger.ts index 58ba7bf9aa6..2c28704fc24 100644 --- a/src/locales/ko/ability-trigger.ts +++ b/src/locales/ko/ability-trigger.ts @@ -3,11 +3,60 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const abilityTriggers: SimpleTranslationEntries = { "blockRecoilDamage" : "{{pokemonName}}[[는]] {{abilityName}} 때문에\n반동 데미지를 받지 않는다!", "badDreams": "{{pokemonName}}[[는]]\n나이트메어 때문에 시달리고 있다!", - "costar": "{{pokemonName}} copied {{allyName}}'s stat changes!", + "costar": "{{pokemonName}}[[는]] {{allyName}}의\n능력 변화를 복사했다!", "iceFaceAvoidedDamage": "{{pokemonName}}[[는]] {{abilityName}} 때문에\n데미지를 받지 않는다!", "perishBody": "{{pokemonName}}의 {{abilityName}} 때문에\n양쪽 포켓몬 모두는 3턴 후에 쓰러져 버린다!", "poisonHeal": "{{pokemonName}}[[는]] {{abilityName}}[[로]]인해\n조금 회복했다.", - "trace": "{{pokemonName}} copied {{targetName}}'s\n{{abilityName}}!", + "trace": "{{pokemonName}}[[는]] 상대 {{targetName}}의 \n{{abilityName}}[[를]] 트레이스했다!", "windPowerCharged": "{{pokemonName}}[[는]]\n{{moveName}}에 맞아 충전되었다!", "quickDraw": "{{pokemonName}}[[는]]\n퀵드로에 의해 행동이 빨라졌다!", + "blockItemTheft": "{{pokemonNameWithAffix}}의 {{abilityName}}에 의해\n도구를 빼앗기지 않는다!", + "typeImmunityHeal": "{{pokemonNameWithAffix}}[[는]]\n{{abilityName}}[[로]] 체력이 회복되었다!", + "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}}[[는]] {{abilityName}} 때문에\n데미지를 입지 않는다!", + "postDefendDisguise": "{{pokemonNameWithAffix}}의\n정체가 드러났다!", + "moveImmunity": "{{pokemonNameWithAffix}}에게는\n효과가 없는 것 같다...", + "reverseDrain": "{{pokemonNameWithAffix}}[[는]]\n해감액을 흡수했다!", + "postDefendTypeChange": "{{pokemonNameWithAffix}}[[는]] {{abilityName}}[[로]] 인해\n{{typeName}}타입이 됐다!", + "postDefendContactDamage": "{{pokemonNameWithAffix}}[[는]] {{abilityName}}[[로]]\n상대를 상처입혔다!", + "postDefendAbilitySwap": "{{pokemonNameWithAffix}}[[는]]\n서로의 특성을 교체했다!", + "postDefendAbilityGive": "{{pokemonNameWithAffix}}[[는]]\n특성이 {{abilityName}}[[가]] 되어 버렸다!", + "postDefendMoveDisable": "{{pokemonNameWithAffix}}의\n{{moveName}}[[를]] 봉인했다!", + "pokemonTypeChange": "{{pokemonNameWithAffix}}[[는]]\n{{moveType}}타입이 됐다!", + "postAttackStealHeldItem": "{{pokemonNameWithAffix}}[[는]] {{defenderName}}[[로]]부터\n{{stolenItemType}}[[를]] 빼앗았다!", + "postDefendStealHeldItem": "{{pokemonNameWithAffix}}[[는]] {{attackerName}}[[로]]부터\n{{stolenItemType}}[[를]] 빼앗았다!", + "copyFaintedAllyAbility": "{{pokemonNameWithAffix}}의\n{{abilityName}}[[를]] 이어받았다!", + "intimidateImmunity": "{{pokemonNameWithAffix}}[[는]]\n{{abilityName}}의 효과로 능력이 떨어지지 않는다!", + "postSummonAllyHeal": "{{pokemonNameWithAffix}}[[가]] 내온 차를\n{{pokemonName}}[[가]] 모두 비웠다!", + "postSummonClearAllyStats": "{{pokemonNameWithAffix}}의\n능력 변화가 원래대로 되돌아왔다!", + "postSummonTransform": "{{pokemonNameWithAffix}}[[는]]\n{{targetName}}[[로]] 변신했다!!", + "protectStat": "{{pokemonNameWithAffix}}[[는]] {{abilityName}}의 효과로\n{{statName}}[[가]] 떨어지지 않는다!", + "statusEffectImmunityWithName": "{{pokemonNameWithAffix}}[[는]] {{abilityName}} 때문에\{{statusEffectName}}에 걸리지 않는다!", + "statusEffectImmunity": "{{pokemonNameWithAffix}}[[는]] {{abilityName}} 때문에\n상태 이상이 되지 않는다!", + "battlerTagImmunity": "{{pokemonNameWithAffix}}[[는]] {{abilityName}}[[로]]\n{{battlerTagName}}[[를]] 무시했다!", + "forewarn": "{{pokemonNameWithAffix}}의\n{{moveName}}[[를]] 간파했다!", + "frisk": "{{pokemonNameWithAffix}}[[는]] {{opponentName}}의\n{{opponentAbilityName}}[[를]] 통찰했다!", + "postWeatherLapseHeal": "{{pokemonNameWithAffix}}[[는]]\n{{abilityName}}[[로]] 체력이 회복되었다!", + "postWeatherLapseDamage": "{{pokemonNameWithAffix}}[[는]]\n{{abilityName}}에 의한 데미지를 입었다!", + "postTurnLootCreateEatenBerry": "{{pokemonNameWithAffix}}[[는]]\n{{berryName}}[[를]] 수확했다!", + "postTurnHeal": "{{pokemonNameWithAffix}}[[는]]\n{{abilityName}}[[로]] 체력이 회복되었다!", + "fetchBall": "{{pokemonNameWithAffix}}[[는]]\n{{pokeballName}}[[를]] 주워 왔다!", + "healFromBerryUse": "{{pokemonNameWithAffix}}[[는]]\n{{abilityName}}[[로]] 체력이 회복되었다!", + "arenaTrap": "{{pokemonNameWithAffix}}의 {{abilityName}} 때문에\n바꿀 수 없다!", + "postBattleLoot": "{{pokemonNameWithAffix}}[[는]]\n{{itemName}}[[를]] 주웠다!", + "postFaintContactDamage": "{{pokemonNameWithAffix}}[[는]] {{abilityName}}[[로]]\n상대에게 데미지를 입혔다!", + "postFaintHpDamage": "{{pokemonNameWithAffix}}[[는]] {{abilityName}}[[로]]\n상대에게 데미지를 입혔다!", + "postSummonPressure": "{{pokemonNameWithAffix}}[[는]]\n프레셔를 발산하고 있다!", + "postSummonMoldBreaker": "{{pokemonNameWithAffix}}의\n틀깨기!", + "postSummonAnticipation": "{{pokemonNameWithAffix}}[[는]]\n몸을 떨었다!", + "postSummonTurboblaze": "{{pokemonNameWithAffix}}[[는]]\n활활 타오르는 오라를 발산하고 있다!", + "postSummonTeravolt": "{{pokemonNameWithAffix}}[[는]]\n세차게 튀는 오라를 발산하고 있다!", + "postSummonDarkAura": "{{pokemonNameWithAffix}}[[는]]\n다크오라를 발산하고 있다!", + "postSummonFairyAura": "{{pokemonNameWithAffix}}[[는]]\n페어리오라를 발산하고 있다!", + "postSummonNeutralizingGas": "주위가 화학변화가스로 가득 찼다!", + "postSummonAsOneGlastrier": "{{pokemonNameWithAffix}}[[는]]\n두 가지 특성을 겸비한다!", + "postSummonAsOneSpectrier": "{{pokemonNameWithAffix}}[[는]]\n두 가지 특성을 겸비한다!", + "postSummonVesselOfRuin": "{{pokemonNameWithAffix}}의 재앙의그릇에 의해\n주위의 {{statName}}[[가]] 약해졌다!", + "postSummonSwordOfRuin": "{{pokemonNameWithAffix}}의 재앙의검에 의해\n주위의 {{statName}}[[가]] 약해졌다!", + "postSummonTabletsOfRuin": "{{pokemonNameWithAffix}}의 재앙의목간에 의해\n주위의 {{statName}}[[가]] 약해졌다!", + "postSummonBeadsOfRuin": "{{pokemonNameWithAffix}}의 재앙의구슬에 의해\n주위의 {{statName}}[[가]] 약해졌다!", } as const; diff --git a/src/locales/ko/arena-flyout.ts b/src/locales/ko/arena-flyout.ts new file mode 100644 index 00000000000..33d9596af2c --- /dev/null +++ b/src/locales/ko/arena-flyout.ts @@ -0,0 +1,49 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const arenaFlyout: SimpleTranslationEntries = { + // Title + "activeBattleEffects": "배틀 효과 상태", + "player": "플레이어", + "neutral": "공통", + "enemy": "상대", + + // WeatherType + "sunny": "쾌청", + "rain": "비", + "sandstorm": "모래바람", + "hail": "싸라기눈", + "snow": "눈", + "fog": "안개", + "heavyRain": "강한 비", + "harshSun": "강한 쾌청", + "strongWinds": "난기류", + + // TerrainType + "misty": "미스트필드", + "electric": "일렉트릭필드", + "grassy": "그래스필드", + "psychic": "사이코필드", + + // ArenaTagType + "mudSport": "흙놀이", + "waterSport": "물놀이", + "spikes": "압정", + "toxicSpikes": "독압정", + "mist": "흰안개", + "futureSight": "미래예지", + "doomDesire": "파멸의소원", + "wish": "희망사항", + "stealthRock": "스텔스록", + "stickyWeb": "끈적끈적네트", + "trickRoom": "트릭룸", + "gravity": "중력", + "reflect": "리플렉터", + "lightScreen": "빛의장막", + "auroraVeil": "오로라베일", + "quickGuard": "패스트가드", + "wideGuard": "와이드가드", + "matBlock": "마룻바닥세워막기", + "craftyShield": "트릭가드", + "tailwind": "순풍", + "happyHour": "해피타임", +}; diff --git a/src/locales/ko/battle-info.ts b/src/locales/ko/battle-info.ts new file mode 100644 index 00000000000..4386f7814b4 --- /dev/null +++ b/src/locales/ko/battle-info.ts @@ -0,0 +1,5 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battleInfo: SimpleTranslationEntries = { + "generation": "{{generation}}세대", +} as const; diff --git a/src/locales/ko/battle.ts b/src/locales/ko/battle.ts index dbb425da63f..10f3e1b5853 100644 --- a/src/locales/ko/battle.ts +++ b/src/locales/ko/battle.ts @@ -67,16 +67,33 @@ export const battle: SimpleTranslationEntries = { "useMove": "{{pokemonNameWithAffix}}의 {{moveName}}!", "drainMessage": "{{pokemonName}}[[로]]부터\n체력을 흡수했다!", "stealEatBerry": "{{pokemonName}}[[가]]\n{{targetName}}의 {{berryName}}[[를]] 빼앗아 먹었다!", + "ppHealBerry": "{{pokemonNameWithAffix}}[[는]] {{berryName}}[[로]]\n{{moveName}}의 PP를 회복했다!", + "hpHealBerry": "{{pokemonNameWithAffix}}[[는]] {{berryName}}[[로]]\n체력을 회복했다!", "regainHealth": "{{pokemonName}}[[는]]\n체력을 회복했다!", "fainted": "{{pokemonNameWithAffix}}[[는]] 쓰러졌다!", - "statRose": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 올라갔다!", - "statSharplyRose": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 크게 올라갔다!", - "statRoseDrastically": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 매우 크게 올라갔다!", - "statWontGoAnyHigher": "{{pokemonNameWithAffix}}의\n{{stats}}[[는]] 더 올라가지 않는다!", - "statFell": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 떨어졌다!", - "statHarshlyFell": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 크게 떨어졌다!", - "statSeverelyFell": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 매우 크게 떨어졌다!", - "statWontGoAnyLower": "{{pokemonNameWithAffix}}의\n{{stats}}[[는]] 더 떨어지지 않는다!", + "statsAnd": "그리고", + "stats": "스테이터스", + "statRose_one": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 올라갔다!", + "statRose_other": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 올라갔다!", + "statSharplyRose_one": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 크게 올라갔다!", + "statSharplyRose_other": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 크게 올라갔다!", + "statRoseDrastically_one": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 매우 크게 올라갔다!", + "statRoseDrastically_other": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 매우 크게 올라갔다!", + "statWontGoAnyHigher_one": "{{pokemonNameWithAffix}}의\n{{stats}}[[는]] 더 올라가지 않는다!", + "statWontGoAnyHigher_other": "{{pokemonNameWithAffix}}의\n{{stats}}[[는]] 더 올라가지 않는다!", + "statFell_one": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 떨어졌다!", + "statFell_other": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 떨어졌다!", + "statHarshlyFell_one": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 크게 떨어졌다!", + "statHarshlyFell_other": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 크게 떨어졌다!", + "statSeverelyFell_one": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 매우 크게 떨어졌다!", + "statSeverelyFell_other": "{{pokemonNameWithAffix}}의\n{{stats}}[[가]] 매우 크게 떨어졌다!", + "statWontGoAnyLower_one": "{{pokemonNameWithAffix}}의\n{{stats}}[[는]] 더 떨어지지 않는다!", + "statWontGoAnyLower_other": "{{pokemonNameWithAffix}}의\n{{stats}}[[는]] 더 떨어지지 않는다!", + "transformedIntoType": "{{pokemonName}} transformed\ninto the {{type}} type!", + "retryBattle": "이 배틀의 처음부터 재도전하시겠습니까?", + "unlockedSomething": "{{unlockedThing}}[[가]]\n해금되었다.", + "congratulations": "축하합니다!", + "beatModeFirstTime": "{{speciesName}}[[가]] {{gameMode}} 모드를 처음으로 클리어했다!\n{{newModifier}}[[를]] 손에 넣었다!", "ppReduced": "{{targetName}}의\n{{moveName}}[[를]] {{reduction}} 깎았다!", "battlerTagsRechargingLapse": "공격의 반동으로\n{{pokemonNameWithAffix}}[[는]] 움직일 수 없다!", "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}}[[는]]\n이제 도망칠 수 없다!", @@ -106,7 +123,7 @@ export const battle: SimpleTranslationEntries = { "battlerTagsIngrainLapse": "{{pokemonNameWithAffix}}[[는]] 뿌리로부터\n양분을 흡수했다!", "battlerTagsIngrainOnTrap": "{{pokemonNameWithAffix}}[[는]] 뿌리를 뻗었다!", "battlerTagsAquaRingOnAdd": "{{pokemonNameWithAffix}}[[는]]\n물의 베일을 둘러썼다!", - "battlerTagsAquaRingLapse": "{{moveName}} 효과로 \n{{pokemonName}}[[는]] HP를 회복했다!", + "battlerTagsAquaRingLapse": "{{moveName}} 효과로\n{{pokemonName}}[[는]] HP를 회복했다!", "battlerTagsDrowsyOnAdd": "{{pokemonNameWithAffix}}의\n졸음을 유도했다!", "battlerTagsDamagingTrapLapse": "{{pokemonNameWithAffix}}[[는]] {{moveName}}의\n데미지를 입고 있다!", "battlerTagsBindOnTrap": "{{pokemonNameWithAffix}}[[는]] {{sourcePokemonName}}에게\n{{moveName}}[[를]] 당했다!", @@ -124,15 +141,19 @@ export const battle: SimpleTranslationEntries = { "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}}[[는]]\n공격을 버텼다!", "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}}[[는]]\n공격을 버텼다!", "battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}}의 멸망의\n카운트가 {{turnCount}}[[가]] 되었다!", + "battlerTagsCenterOfAttentionOnAdd": "{{pokemonNameWithAffix}}[[는]]\n주목의 대상이 되었다!", "battlerTagsTruantLapse": "{{pokemonNameWithAffix}}[[는]] 게으름을 피우고 있다!", "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}}[[는]] 컨디션이\n좋아지지 않는다!", "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}} 는 마침내\n컨디션을 회복했다!", "battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}의\n{{statName}}[[가]] 올라갔다!", - "battlerTagsHighestStatBoostOnRemove": "The effects of {{pokemonNameWithAffix}}'s\n{{abilityName}} wore off!", + "battlerTagsHighestStatBoostOnRemove": "{{pokemonNameWithAffix}}의\n{{abilityName}} 효과가 사라졌다!", + "battlerTagsMagnetRisenOnAdd": "{{pokemonNameWithAffix}}[[는]]\n전자력으로 떠올랐다!", + "battlerTagsMagnetRisenOnRemove": "{{pokemonNameWithAffix}}의\n전자력이 없어졌다!", "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}}[[는]]\n의욕이 넘치고 있다!", "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}}[[는]] 평소로 돌아왔다.", "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}}[[는]]\n소금에 절여졌다!", "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}}[[는]] 소금절이의\n데미지를 입고 있다.", - "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}}[[는]]\n자신의 체력을 깎아서\n{{pokemonName}}에게 저주를 걸었다!", + "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}}[[는]] 자신의 체력을 깎아서\n{{pokemonName}}에게 저주를 걸었다!", "battlerTagsCursedLapse": "{{pokemonNameWithAffix}}[[는]]\n저주받고 있다!", + "battlerTagsStockpilingOnAdd": "{{pokemonNameWithAffix}}[[는]]\n{{stockpiledCount}}개 비축했다!", } as const; diff --git a/src/locales/ko/battler-tags.ts b/src/locales/ko/battler-tags.ts new file mode 100644 index 00000000000..93a9106a8ce --- /dev/null +++ b/src/locales/ko/battler-tags.ts @@ -0,0 +1,12 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battlerTags: SimpleTranslationEntries = { + "trappedDesc": "함정", + "flinchedDesc": "풀죽음", + "confusedDesc": "혼란", + "infatuatedDesc": "헤롱헤롱", + "seedDesc": "씨뿌리기", + "nightmareDesc": "악몽", + "ingrainDesc": "뿌리", + "drowsyDesc": "졸음", +} as const; diff --git a/src/locales/ko/bgm-name.ts b/src/locales/ko/bgm-name.ts index 235d6a3320e..69697b07774 100644 --- a/src/locales/ko/bgm-name.ts +++ b/src/locales/ko/bgm-name.ts @@ -110,9 +110,9 @@ export const bgmName: SimpleTranslationEntries = { "plains": "불가사의 던전 하늘의 탐험대 하늘 꼭대기 초원", "power_plant": "불가사의 던전 하늘의 탐험대 일렉트릭 평원", "ruins": "불가사의 던전 하늘의 탐험대 봉인의 암반", - "sea": "불가사의 던전 하늘의 탐험대 바닷가 동굴", + "sea": "Andr06 - Marine Mystique", // Name defined by the composer "seabed": "Firel - Seabed", // The composer thinks about a more creative name - "slum": "불가사의 던전 하늘의 탐험대 하늘 꼭대기 해변", + "slum": "Andr06 - Sneaky Snom", // Name defined by the composer "snowy_forest": "불가사의 던전 하늘의 탐험대 하늘 꼭대기 설원", "space": "Firel - Aether", "swamp": "불가사의 던전 하늘의 탐험대 폐쇄되어진 바다", diff --git a/src/locales/ko/config.ts b/src/locales/ko/config.ts index 5b29a46c044..4ec47cec036 100644 --- a/src/locales/ko/config.ts +++ b/src/locales/ko/config.ts @@ -1,8 +1,12 @@ +import { pokemonForm } from "./pokemon-form"; import { ability } from "./ability"; import { abilityTriggers } from "./ability-trigger"; +import { arenaFlyout } from "./arena-flyout"; import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; +import { battleInfo } from "./battle-info"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; +import { battlerTags } from "./battler-tags"; import { berry } from "./berry"; import { bgmName } from "./bgm-name"; import { biome } from "./biome"; @@ -33,6 +37,7 @@ import { pokeball } from "./pokeball"; import { pokemon } from "./pokemon"; import { pokemonInfo } from "./pokemon-info"; import { pokemonInfoContainer } from "./pokemon-info-container"; +import { pokemonSummary } from "./pokemon-summary"; import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler"; import { splashMessages } from "./splash-messages"; import { starterSelectUiHandler } from "./starter-select-ui-handler"; @@ -49,8 +54,11 @@ import { modifierSelectUiHandler } from "./modifier-select-ui-handler"; export const koConfig = { ability: ability, abilityTriggers: abilityTriggers, + arenaFlyout: arenaFlyout, battle: battle, + battleInfo: battleInfo, battleMessageUiHandler: battleMessageUiHandler, + battlerTags: battlerTags, berry: berry, bgmName: bgmName, biome: biome, @@ -80,8 +88,10 @@ export const koConfig = { nature: nature, pokeball: pokeball, pokemon: pokemon, + pokemonForm: pokemonForm, pokemonInfo: pokemonInfo, pokemonInfoContainer: pokemonInfoContainer, + pokemonSummary: pokemonSummary, saveSlotSelectUiHandler: saveSlotSelectUiHandler, settings: settings, splashMessages: splashMessages, diff --git a/src/locales/ko/dialogue.ts b/src/locales/ko/dialogue.ts index a98b31a7c61..719b738778d 100644 --- a/src/locales/ko/dialogue.ts +++ b/src/locales/ko/dialogue.ts @@ -1433,7 +1433,7 @@ export const PGMdialogue: DialogueTranslationEntries = { }, "victory": { 1: `좋아! 꼬마야, 정말로, 인상적이었단다. - $Y네 포켓몬은 너를 믿고 승리를 위해 최선을 다했구나. + $네 포켓몬은 너를 믿고 승리를 위해 최선을 다했구나. $비록 내가 졌지만, 좋아서 바보같이 웃음이 나오는구나!`, }, "defeat": { diff --git a/src/locales/ko/menu-ui-handler.ts b/src/locales/ko/menu-ui-handler.ts index 3bd412bc5ea..2e036f49b4d 100644 --- a/src/locales/ko/menu-ui-handler.ts +++ b/src/locales/ko/menu-ui-handler.ts @@ -18,6 +18,10 @@ export const menuUiHandler: SimpleTranslationEntries = { "exportSlotSelect": "내보낼 슬롯을 골라주세요.", "importData": "데이터 불러오기", "exportData": "데이터 내보내기", + "linkDiscord": "디스코드 연동", + "unlinkDiscord": "디스코드 연동해제", + "linkGoogle": "구글 연동", + "unlinkGoogle": "구글 연동해제", "cancel": "취소", "losingProgressionWarning": "전투 시작으로부터의 진행 상황을 잃게 됩니다. 계속하시겠습니까?", "noEggs": "부화중인 알이 없습니다!" diff --git a/src/locales/ko/menu.ts b/src/locales/ko/menu.ts index 0e12b3bd15e..368627b0d5d 100644 --- a/src/locales/ko/menu.ts +++ b/src/locales/ko/menu.ts @@ -17,6 +17,7 @@ export const menu: SimpleTranslationEntries = { "username": "이름", "password": "비밀번호", "login": "로그인", + "orUse": "혹은", "register": "등록", "emptyUsername": "이름은 비워둘 수 없습니다", "invalidLoginUsername": "사용할 수 없는 이름입니다", @@ -53,5 +54,9 @@ export const menu: SimpleTranslationEntries = { "no":"아니오", "disclaimer": "면책 조항", "disclaimerDescription": "이 게임은 완전히 개발되지 않았습니다- (세이브 데이터 소실을 포함) 플레이에 지장을 주는 문제가 생길 수 있으며,\n공지 없이 업데이트가 진행 혹은 중지될 수 있습니다.", + "choosePokemon": "포켓몬을 선택하세요.", + "renamePokemon": "포켓몬의 닉네임은?", + "rename": "닉네임 바꾸기", + "nickname": "닉네임", "errorServerDown": "서버 연결 중 문제가 발생했습니다.\n\n이 창을 종료하지 않고 두면,\n게임은 자동으로 재접속됩니다.", } as const; diff --git a/src/locales/ko/modifier-type.ts b/src/locales/ko/modifier-type.ts index 4df6a397fa0..28df422645a 100644 --- a/src/locales/ko/modifier-type.ts +++ b/src/locales/ko/modifier-type.ts @@ -58,10 +58,10 @@ export const modifierType: ModifierTypeTranslationEntries = { description: "지니게 하면 {{moveType}}타입 기술의 위력이 20% 상승한다.", }, "PokemonLevelIncrementModifierType": { - description: "포켓몬 1마리의 레벨이 1만큼 상승한다.", + description: "포켓몬 1마리의 레벨이 기본 1만큼, 사탕단지의 개수에 따라 최대 {{levels}}까지 상승한다.", }, "AllPokemonLevelIncrementModifierType": { - description: "자신의 모든 포켓몬의 레벨이 1씩 상승한다.", + description: "자신의 모든 포켓몬의 레벨이 기본 1씩, 사탕단지의 개수에 따라 최대 {{levels}}까지 상승한다.", }, "PokemonBaseStatBoosterModifierType": { description: "지니게 하면 {{statName}} 종족값을 10% 올려준다. 개체값이 높을수록 더 많이 누적시킬 수 있다.", @@ -153,6 +153,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "REVIVER_SEED": { name: "부활의씨앗", description: "포켓몬이 공격을 받고 쓰러지려 할 때 HP를 절반 회복한다." }, + "WHITE_HERB": { name: "White Herb", description: "An item to be held by a Pokémon. It will restore any lowered stat in battle." }, + "ETHER": { name: "PP에이드" }, "MAX_ETHER": { name: "PP회복" }, @@ -182,6 +184,9 @@ export const modifierType: ModifierTypeTranslationEntries = { "SOOTHE_BELL": { name: "평온의방울" }, + "SCOPE_LENS": { name: "초점렌즈", description: "약점이 보이는 렌즈. 지니게 한 포켓몬의 기술이 급소에 맞기 쉬워진다." }, + "LEEK": { name: "대파", description: "매우 길고 단단한 줄기. 파오리에게 지니게 하면 기술이 급소에 맞기 쉬워진다." }, + "EVIOLITE": { name: "진화의휘석", description: "진화의 이상한 덩어리. 지니게 하면 진화 전 포켓몬의 방어와 특수방어가 올라간다." }, "SOUL_DEW": { name: "마음의물방울", description: "지닌 포켓몬의 성격의 효과가 10% 증가한다. (합연산)" }, diff --git a/src/locales/ko/modifier.ts b/src/locales/ko/modifier.ts index c61d2b3def0..71508f774c7 100644 --- a/src/locales/ko/modifier.ts +++ b/src/locales/ko/modifier.ts @@ -5,6 +5,7 @@ export const modifier: SimpleTranslationEntries = { "turnHealApply": "{{pokemonNameWithAffix}}[[는]]\n{{typeName}}[[로]] 인해 조금 회복했다.", "hitHealApply": "{{pokemonNameWithAffix}}[[는]]\n{{typeName}}[[로]] 인해 조금 회복했다.", "pokemonInstantReviveApply": "{{pokemonNameWithAffix}}[[는]] {{typeName}}[[로]]\n정신을 차려 싸울 수 있게 되었다!", + "pokemonResetNegativeStatStageApply": "{{pokemonNameWithAffix}}'s lowered stats were restored\nby its {{typeName}}!", "moneyInterestApply": "{{typeName}}[[로]]부터\n₽{{moneyAmount}}[[를]] 받았다!", "turnHeldItemTransferApply": "{{pokemonName}}의 {{typeName}}[[는]]\n{{pokemonNameWithAffix}}의 {{itemName}}[[를]] 흡수했다!", "contactHeldItemTransferApply": "{{pokemonName}}의 {{typeName}}[[는]]\n{{pokemonNameWithAffix}}의 {{itemName}}[[를]] 가로챘다!", diff --git a/src/locales/ko/move.ts b/src/locales/ko/move.ts index 3781725bc6f..bb9d4515ba8 100644 --- a/src/locales/ko/move.ts +++ b/src/locales/ko/move.ts @@ -2981,8 +2981,7 @@ export const move: MoveTranslationEntries = { }, dynamaxCannon: { name: "다이맥스포", - /* 다이맥스에서 200레벨로 조건 변경 */ - effect: "코어에서 빔을 발사해서 공격한다. 상대의 레벨이 200보다 크면 데미지가 2배가 된다." + effect: "코어에서 빔을 발사해서 공격한다. 상대가 웨이브 레벨 최대치를 초과했다면, 초과한 정도에 비례하여 데미지가 최대 2배가 된다." }, snipeShot: { name: "노려맞히기", diff --git a/src/locales/ko/party-ui-handler.ts b/src/locales/ko/party-ui-handler.ts index f0075809345..ff5d81eeb52 100644 --- a/src/locales/ko/party-ui-handler.ts +++ b/src/locales/ko/party-ui-handler.ts @@ -16,6 +16,7 @@ export const partyUiHandler: SimpleTranslationEntries = { "PASS_BATON": "배턴터치한다", "UNPAUSE_EVOLUTION": "진화 재개", "REVIVE": "되살린다", + "RENAME": "닉네임 바꾸기", "choosePokemon": "포켓몬을 선택하세요.", "doWhatWithThisPokemon": "포켓몬을 어떻게 하겠습니까?", diff --git a/src/locales/ko/pokemon-form.ts b/src/locales/ko/pokemon-form.ts new file mode 100644 index 00000000000..06bc743f1a1 --- /dev/null +++ b/src/locales/ko/pokemon-form.ts @@ -0,0 +1,190 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const pokemonForm: SimpleTranslationEntries = { + // Battle forms + "mega": "메가{{pokemonName}}", + "mega-x": "메가{{pokemonName}}X", + "mega-y": "메가{{pokemonName}}Y", + "primal": "원시{{pokemonName}}", + "gigantamax": "거다이맥스 {{pokemonName}}", + "eternamax": "무한다이맥스 {{pokemonName}}", + + // Starters forms + // 1G + "pikachuCosplay": "옷갈아입기", + "pikachuCoolCosplay": "하드록", + "pikachuBeautyCosplay": "마담", + "pikachuCuteCosplay": "아이돌", + "pikachuSmartCosplay": "닥터", + "pikachuToughCosplay": "마스크드", + "pikachuPartner": "파트너", + "eeveePartner": "파트너", + // 2G + "pichuSpiky": "삐쭉귀", + "unownA": "A", + "unownB": "B", + "unownC": "C", + "unownD": "D", + "unownE": "E", + "unownF": "F", + "unownG": "G", + "unownH": "H", + "unownI": "I", + "unownJ": "J", + "unownK": "K", + "unownL": "L", + "unownM": "M", + "unownN": "N", + "unownO": "O", + "unownP": "P", + "unownQ": "Q", + "unownR": "R", + "unownS": "S", + "unownT": "T", + "unownU": "U", + "unownV": "V", + "unownW": "W", + "unownX": "X", + "unownY": "Y", + "unownZ": "Z", + "unownExclamation": "!", + "unownQuestion": "?", + // 3G + "castformSunny": "태양의 모습", + "castformRainy": "빗방울의 모습", + "castformSnowy": "설운의 모습", + "deoxysNormal": "노말폼", + // 4G + "burmyPlant": "초목도롱", + "burmySandy": "모래땅도롱", + "burmyTrash": "슈레도롱", + "shellosEast": "동쪽바다의 모습", + "shellosWest": "서쪽바다의 모습", + "rotomHeat": "히트", + "rotomWash": "워시", + "rotomFrost": "프로스트", + "rotomFan": "스핀", + "rotomMow": "커트", + "giratinaAltered": "어나더폼", + "shayminLand": "랜드폼", + // 5G + "basculinRedStriped": "적색근의 모습", + "basculinBlueStriped": "청색근의 모습", + "basculinWhiteStriped": "백색근의 모습", + "deerlingSpring": "봄의 모습", + "deerlingSummer": "여름의 모습", + "deerlingAutumn": "가을의 모습", + "deerlingWinter": "겨울의 모습", + "tornadusIncarnate": "화신폼", + "thundurusIncarnate": "화신폼", + "landorusIncarnate": "화신폼", + "keldeoOrdinary": "평상시 모습", + "meloettaAria": "보이스폼", + // 6G + "froakieBattleBond": "유대변화", + "scatterbugMeadow": "화원의 모양", + "scatterbugIcySnow": "빙설의 모양", + "scatterbugPolar": "설국의 모양", + "scatterbugTundra": "설원의 모양", + "scatterbugContinental": "대륙의 모양", + "scatterbugGarden": "정원의 모양", + "scatterbugElegant": "우아한 모양", + "scatterbugModern": "모던한 모양", + "scatterbugMarine": "마린의 모양", + "scatterbugArchipelago": "군도의 모양", + "scatterbugHighPlains": "황야의 모양", + "scatterbugSandstorm": "사진의 모양", + "scatterbugRiver": "대하의 모양", + "scatterbugMonsoon": "스콜의 모양", + "scatterbugSavanna": "사바나의 모양", + "scatterbugSun": "태양의 모양", + "scatterbugOcean": "오션의 모양", + "scatterbugJungle": "정글의 모양", + "scatterbugFancy": "팬시한 모양", + "scatterbugPokeBall": "볼의 모양", + "flabebeRed": "빨간 꽃", + "flabebeYellow": "노란 꽃", + "flabebeOrange": "오렌지색 꽃", + "flabebeBlue": "파란 꽃", + "flabebeWhite": "하얀 꽃", + "furfrouHeart": "하트컷", + "furfrouStar": "스타컷", + "furfrouDiamond": "다이아컷", + "furfrouDebutante": "레이디컷", + "furfrouMatron": "마담컷", + "furfrouDandy": "젠틀컷", + "furfrouLaReine": "퀸컷", + "furfrouKabuki": "가부키컷", + "furfrouPharaoh": "킹덤컷", + "pumpkabooSmall": "작은 사이즈", + "pumpkabooLarge": "큰 사이즈", + "pumpkabooSuper": "특대 사이즈", + "xerneasNeutral": "릴랙스모드", + "xerneasActive": "액티브모드", + "zygarde50": "50%폼", + "zygarde10": "10%폼", + "zygarde50Pc": "스웜체인지 50%폼", + "zygarde10Pc": "스웜체인지 10%폼", + "zygardeComplete": "퍼펙트폼", + // 7G + "oricorioBaile": "이글이글스타일", + "oricorioPompom": "파칙파칙스타일", + "oricorioPau": "훌라훌라스타일", + "oricorioSensu": "하늘하늘스타일", + "rockruffOwnTempo": "마이페이스", + "miniorRedMeteor": "유성의 모습(빨강)", + "miniorOrangeMeteor": "유성의 모습(주황)", + "miniorYellowMeteor": "유성의 모습(노랑)", + "miniorGreenMeteor": "유성의 모습(초록)", + "miniorBlueMeteor": "유성의 모습(옥색)", + "miniorIndigoMeteor": "유성의 모습(파랑)", + "miniorVioletMeteor": "유성의 모습(보라)", + "miniorRed": "빨간색 코어", + "miniorOrange": "주황색 코어", + "miniorYellow": "노란색 코어", + "miniorGreen": "초록색 코어", + "miniorBlue": "옥색 코어", + "miniorIndigo": "파란색 코어", + "miniorViolet": "보라색 코어", + "mimikyuDisguised": "둔갑한 모습", + "mimikyuBusted": "들킨 모습", + "magearnaOriginal": "500년 전의 색", + "marshadowZenith": "투지를 불태운 마샤도", + // 8G + "sinisteaPhony": "위작품", + "sinisteaAntique": "진작품", + "eiscueNoIce": "나이스페이스", + "indeedeeMale": "수컷의 모습", + "indeedeeFemale": "암컷의 모습", + "morpekoFullBelly": "배부른 모양", + "zacianHeroOfManyBattles": "역전의 용사", + "zamazentaHeroOfManyBattles": "역전의 용사", + "zarudeDada": "아빠", + "enamorusIncarnate": "화신폼", + // 9G + "squawkabillyGreenPlumage": "그린 페더", + "squawkabillyBluePlumage": "블루 페더", + "squawkabillyYellowPlumage": "옐로 페더", + "squawkabillyWhitePlumage": "화이트 페더", + "tatsugiriCurly": "젖힌 모습", + "tatsugiriDroopy": "늘어진 모습", + "tatsugiriStretchy": "뻗은 모습", + "gimmighoulChest": "상자폼", + "gimmighoulRoaming": "도보폼", + "koraidonApexBuild": "완전형태", + "koraidonLimitedBuild":"제한형태", + "koraidonSprintingBuild":"질주형태", + "koraidonSwimmingBuild":"유영형태", + "koraidonGlidingBuild":"활공형태", + "miraidonUltimateMode":"컴플리트모드", + "miraidonLowPowerMode":"리미티드모드", + "miraidonDriveMode":"드라이브모드", + "miraidonAquaticMode":"플로트모드", + "miraidonGlideMode":"글라이드모드", + "poltchageistCounterfeit": "가짜배기의 모습", + "poltchageistArtisan": "알짜배기의 모습", + "paldeaTaurosCombat": "컴뱃종", + "paldeaTaurosBlaze": "블레이즈종", + "paldeaTaurosAqua": "워터종", + +} as const; diff --git a/src/locales/ko/pokemon-summary.ts b/src/locales/ko/pokemon-summary.ts new file mode 100644 index 00000000000..029588a7cf2 --- /dev/null +++ b/src/locales/ko/pokemon-summary.ts @@ -0,0 +1,47 @@ +import { TranslationEntries } from "#app/interfaces/locales"; + +export const pokemonSummary: TranslationEntries = { + "pokemonInfo": "스테이터스", + "status": "상태 이상", + "powerAccuracyCategory": "위력\n명중\n분류", + "type": "타입", + "unknownTrainer": "알수없음", + "ot": "어버이", + "nature": "성격", + "expPoints": "현재 경험치", + "nextLv": "다음 레벨까지", + "cancel": "그만둔다", + + "memoString": "{{natureFragment}}.\n{{metFragment}}", + "metFragment": { + "normal": "{{biome}}에서\nLv{{level}}일 때 만났다.", + "apparently": "{{biome}}에서\nLv{{level}}일 때 만난 것 같다.", + }, + "natureFragment": { + "Hardy": "{{nature}}하는 성격", + "Lonely": "{{nature}}을 타는 성격", + "Brave": "{{nature}}한 성격", + "Adamant": "{{nature}}스러운 성격", + "Naughty" : "{{nature}}같은 성격", + "Bold" : "{{nature}}한 성격", + "Docile" : "{{nature}}한 성격", + "Relaxed" : "{{nature}}한 성격", + "Impish" : "{{nature}}같은 성격", + "Lax" : "{{nature}}거리는 성격", + "Timid" : "{{nature}}같은 성격", + "Hasty" : "{{nature}}한 성격", + "Serious" : "{{nature}}한 성격", + "Jolly" : "{{nature}}한 성격", + "Naive" : "{{nature}}한 성격", + "Modest" : "{{nature}}스러운 성격", + "Mild" : "{{nature}}한 성격", + "Quiet" : "{{nature}}한 성격", + "Bashful" : "{{nature}}을 타는 성격", + "Rash" : "{{nature}}거리는 성격", + "Calm" : "{{nature}}한 성격", + "Gentle" : "{{nature}}한 성격", + "Sassy" : "{{nature}}진 성격", + "Careful" : "{{nature}}한 성격", + "Quirky": "{{nature}}스러운 성격", + }, +} as const; diff --git a/src/locales/ko/settings.ts b/src/locales/ko/settings.ts index 6514683cd94..40e9676b6da 100644 --- a/src/locales/ko/settings.ts +++ b/src/locales/ko/settings.ts @@ -96,4 +96,5 @@ export const settings: SimpleTranslationEntries = { "controller": "컨트롤러", "gamepadSupport": "게임패드 지원", "showBgmBar": "BGM 제목 보여주기", + "shopOverlayOpacity": "상점 오버레이 투명도" } as const; diff --git a/src/locales/ko/splash-messages.ts b/src/locales/ko/splash-messages.ts index b875e7b282f..1e364f9c098 100644 --- a/src/locales/ko/splash-messages.ts +++ b/src/locales/ko/splash-messages.ts @@ -34,4 +34,5 @@ export const splashMessages: SimpleTranslationEntries = { "alsoTryRadicalRed": "Radical Red도 해봐요!", "eeveeExpo": "Eevee Expo!", "ynoproject": "YNOproject!", + "breedersInSpace": "충격!우주에 브리더 진짜 계심ㄷㄷ", } as const; diff --git a/src/locales/ko/starter-select-ui-handler.ts b/src/locales/ko/starter-select-ui-handler.ts index d7f8ddbe3ed..a0c305b4266 100644 --- a/src/locales/ko/starter-select-ui-handler.ts +++ b/src/locales/ko/starter-select-ui-handler.ts @@ -7,6 +7,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; */ export const starterSelectUiHandler: SimpleTranslationEntries = { "confirmStartTeam": "이 포켓몬들로 시작하시겠습니까?", + "invalidParty": "This is not a valid starting party!", "gen1": "1세대", "gen2": "2세대", "gen3": "3세대", diff --git a/src/locales/pt_BR/ability-trigger.ts b/src/locales/pt_BR/ability-trigger.ts index 11cbaed182d..ab845a23d4a 100644 --- a/src/locales/pt_BR/ability-trigger.ts +++ b/src/locales/pt_BR/ability-trigger.ts @@ -10,4 +10,53 @@ export const abilityTriggers: SimpleTranslationEntries = { "trace": "{{pokemonName}} copiou {{abilityName}}\nde {{targetName}}!", "windPowerCharged": "Ser atingido por {{moveName}} carregou {{pokemonName}} com poder!", "quickDraw": "{{pokemonName}} pode agir mais rápido que o normal\ngraças ao seu Quick Draw!", + "blockItemTheft": "{{abilityName}} de {{pokemonNameWithAffix}}\nprevine o roubo de itens!", + "typeImmunityHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaurou um pouco de PS!", + "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} evitou dano\ncom {{abilityName}}!", + "postDefendDisguise": "O disfarce de {{pokemonNameWithAffix}} foi descoberto!", + "moveImmunity": "Isso não afeta {{pokemonNameWithAffix}}!", + "reverseDrain": "{{pokemonNameWithAffix}} absorveu a gosma líquida!", + "postDefendTypeChange": "{{abilityName}} de {{pokemonNameWithAffix}}\ntransformou-o no tipo {{typeName}}!", + "postDefendContactDamage": "{{abilityName}} de {{pokemonNameWithAffix}}\feriu seu adversário!", + "postDefendAbilitySwap": "{{pokemonNameWithAffix}} trocou\nde habilidades com seu alvo!", + "postDefendAbilityGive": "{{pokemonNameWithAffix}} deu a seu alvo\na habilidade {{abilityName}}!", + "postDefendMoveDisable": "{{moveName}} de {{pokemonNameWithAffix}}\nfoi desabilitado!", + "pokemonTypeChange": "{{pokemonNameWithAffix}} se transformou no tipo {{moveType}}!", + "postAttackStealHeldItem": "{{pokemonNameWithAffix}} roubou\n{{stolenItemType}} de {defenderName}}!", + "postDefendStealHeldItem": "{{pokemonNameWithAffix}} roubou\n{{stolenItemType}} de {{attackerName}}!", + "copyFaintedAllyAbility": "A habilidade {{abilityName}} de {{pokemonNameWithAffix}} foi tomada!", + "intimidateImmunity": "{{abilityName}} de {{pokemonNameWithAffix}} previniu-o(a) de ser intimidado(a)!", + "postSummonAllyHeal": "{{pokemonNameWithAffix}} bebeu todo o\nchá mate que {{pokemonName}} fez!", + "postSummonClearAllyStats": "As mudanças de atributo de {{pokemonNameWithAffix}}\nforam removidas!", + "postSummonTransform": "{{pokemonNameWithAffix}} se transformou\nem {{targetName}}!", + "protectStat": "{{abilityName}} de {{pokemonNameWithAffix}}\nprevine-o(a) de diminuir seu(sua) {{statName}}!", + "statusEffectImmunityWithName": "{{pokemonNameWithAffix}} de {{abilityName}}\nprevine {{statusEffectName}}!", + "statusEffectImmunity": "{{abilityName}} de {{pokemonNameWithAffix}}\nprevine condições de estado!", + "battlerTagImmunity": "{{abilityName}} de {{pokemonNameWithAffix}}\nprevine {{battlerTagName}}!", + "forewarn": "{{pokemonNameWithAffix}} foi avisado sobre {{moveName}}!", + "frisk": "{{pokemonNameWithAffix}} inspecionou a habilidade {{opponentAbilityName}} de {{opponentName}}!", + "postWeatherLapseHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaurou um pouco de PS!", + "postWeatherLapseDamage": "{{pokemonNameWithAffix}} foi ferido\npor seu(sua) {{abilityName}}!", + "postTurnLootCreateEatenBerry": "{{pokemonNameWithAffix}} colheu uma {{berryName}}!", + "postTurnHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaurou um pouco de PS!", + "fetchBall": "{{pokemonNameWithAffix}} encontrou uma\n{{pokeballName}}!", + "healFromBerryUse": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaurou PS!", + "arenaTrap": "{{abilityName}} de {{pokemonNameWithAffix}}\nprevine trocas!", + "postBattleLoot": "{{pokemonNameWithAffix}} pegou um(a)\n{{itemName}}!", + "postFaintContactDamage": "{{abilityName}} de {{pokemonNameWithAffix}}\nferiu seu adversário!", + "postFaintHpDamage": "{{abilityName}} de {{pokemonNameWithAffix}}\nferiu seu adversário!", + "postSummonPressure": "{{pokemonNameWithAffix}} está exercendo sua pressão!", + "postSummonMoldBreaker": "{{pokemonNameWithAffix}} quebra o molde!", + "postSummonAnticipation": "{{pokemonNameWithAffix}} se arrepiou!", + "postSummonTurboblaze": "{{pokemonNameWithAffix}} está irradiando uma aura ardente!", + "postSummonTeravolt": "{{pokemonNameWithAffix}} está irradiando uma aura explosiva!", + "postSummonDarkAura": "{{pokemonNameWithAffix}} está irradiando uma aura sombria!", + "postSummonFairyAura": "{{pokemonNameWithAffix}} está irradiando uma aura de fada!!", + "postSummonNeutralizingGas": "O Neutralizing Gas de {{pokemonNameWithAffix}} se espalhou pelo campo de batalha!", + "postSummonAsOneGlastrier": "{{pokemonNameWithAffix}} tem duas Habilidades!", + "postSummonAsOneSpectrier": "{{pokemonNameWithAffix}} tem duas Habilidades!", + "postSummonVesselOfRuin": "Vessel of Ruin de {{pokemonNameWithAffix}} reduziu o {{statName}}\nde todos os Pokémon em volta!", + "postSummonSwordOfRuin": "Sword of Ruin de {{pokemonNameWithAffix}} reduziu a {{statName}}\nde todos os Pokémon em volta!", + "postSummonTabletsOfRuin": "Tablets of Ruin de {{pokemonNameWithAffix}} reduziu o {{statName}}\nde todos os Pokémon em volta!", + "postSummonBeadsOfRuin": "Beads of Ruin de {{pokemonNameWithAffix}} reduziu a {{statName}}\nde todos os Pokémon em volta!", } as const; diff --git a/src/locales/pt_BR/arena-flyout.ts b/src/locales/pt_BR/arena-flyout.ts new file mode 100644 index 00000000000..97382aa2b2f --- /dev/null +++ b/src/locales/pt_BR/arena-flyout.ts @@ -0,0 +1,49 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const arenaFlyout: SimpleTranslationEntries = { + // Title + "activeBattleEffects": "Efeitos de Batalha Ativos", + "player": "Jogador", + "neutral": "Neutro", + "enemy": "Inimigo", + + // WeatherType + "sunny": "Ensolarado", + "rain": "Chuva", + "sandstorm": "Tempestade de Areia", + "hail": "Granizo", + "snow": "Neve", + "fog": "Névoa", + "heavyRain": "Chuva Forte", + "harshSun": "Sol Forte", + "strongWinds": "Ventos Fortes", + + // TerrainType + "misty": "Terreno Enevoado", + "electric": "Terreno Elétrico", + "grassy": "Terreno de Planta", + "psychic": "Terreno Psíquico", + + // ArenaTagType + "mudSport": "Mud Sport", + "waterSport": "Water Sport", + "spikes": "Spikes", + "toxicSpikes": "Toxic Spikes", + "mist": "Mist", + "futureSight": "Future Sight", + "doomDesire": "Doom Desire", + "wish": "Wish", + "stealthRock": "Stealth Rock", + "stickyWeb": "Sticky Web", + "trickRoom": "Trick Room", + "gravity": "Gravity", + "reflect": "Reflect", + "lightScreen": "Light Screen", + "auroraVeil": "Aurora Veil", + "quickGuard": "Quick Guard", + "wideGuard": "Wide Guard", + "matBlock": "Mat Block", + "craftyShield": "Crafty Shield", + "tailwind": "Tailwind", + "happyHour": "Happy Hour", +}; diff --git a/src/locales/pt_BR/battle-info.ts b/src/locales/pt_BR/battle-info.ts new file mode 100644 index 00000000000..37cb7cb1aeb --- /dev/null +++ b/src/locales/pt_BR/battle-info.ts @@ -0,0 +1,5 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battleInfo: SimpleTranslationEntries = { + "generation": "Geração {{generation}}", +} as const; diff --git a/src/locales/pt_BR/battle.ts b/src/locales/pt_BR/battle.ts index 8c97d2be6de..0e6831f9295 100644 --- a/src/locales/pt_BR/battle.ts +++ b/src/locales/pt_BR/battle.ts @@ -68,16 +68,33 @@ export const battle: SimpleTranslationEntries = { "drainMessage": "{{pokemonName}} teve sua\nenergia drenada!", "regainHealth": "{{pokemonName}} recuperou\npontos de saúde!", "stealEatBerry": "{{pokemonName}} stole and ate\n{{targetName}}'s {{berryName}}!", + "ppHealBerry": "{{pokemonNameWithAffix}} restaurou PP do movimento {{moveName}}\nusando sua {{berryName}}!", + "hpHealBerry": "{{pokemonNameWithAffix}} restarou sua saúde usando\nsua {{berryName}}!", "fainted": "{{pokemonNameWithAffix}} desmaiou!", - "statRose": "{{stats}} de {{pokemonNameWithAffix}} aumentou!", - "statSharplyRose": "{{stats}} de {{pokemonNameWithAffix}} aumentou bruscamente!", - "statRoseDrastically": "{{stats}} de {{pokemonNameWithAffix}} aumentou drasticamente!", - "statWontGoAnyHigher": "{{stats}} de {{pokemonNameWithAffix}} não vai mais aumentar!", - "statFell": "{{stats}} de {{pokemonNameWithAffix}} diminuiu!", - "statHarshlyFell": "{{stats}} de {{pokemonNameWithAffix}} diminuiu duramente!", - "statSeverelyFell": "{{stats}} de {{pokemonNameWithAffix}} diminuiu severamente!", - "statWontGoAnyLower": "{{stats}} de {{pokemonNameWithAffix}} não vai mais diminuir!", + "statsAnd": "e", + "stats": "Os atributos", + "statRose_one": "{{stats}} de {{pokemonNameWithAffix}} aumentou!", + "statRose_other": "{{stats}} de {{pokemonNameWithAffix}} aumentaram!", + "statSharplyRose_one": "{{stats}} de {{pokemonNameWithAffix}} aumentou bruscamente!", + "statSharplyRose_other": "{{stats}} de {{pokemonNameWithAffix}} aumentaram bruscamente!", + "statRoseDrastically_one": "{{stats}} de {{pokemonNameWithAffix}} aumentou drasticamente!", + "statRoseDrastically_other": "{{stats}} de {{pokemonNameWithAffix}} aumentaram drasticamente!", + "statWontGoAnyHigher_one": "{{stats}} de {{pokemonNameWithAffix}} não vai mais aumentar!", + "statWontGoAnyHigher_other": "{{stats}} de {{pokemonNameWithAffix}} não vão mais aumentar!", + "statFell_one": "{{stats}} de {{pokemonNameWithAffix}} diminuiu!", + "statFell_other": "{{stats}} de {{pokemonNameWithAffix}} diminuíram!", + "statHarshlyFell_one": "{{stats}} de {{pokemonNameWithAffix}} diminuiu duramente!", + "statHarshlyFell_other": "{{stats}} de {{pokemonNameWithAffix}} diminuíram duramente!", + "statSeverelyFell_one": "{{stats}} de {{pokemonNameWithAffix}} diminuiu severamente!", + "statSeverelyFell_other": "{{stats}} de {{pokemonNameWithAffix}} diminuíram severamente!", + "statWontGoAnyLower_one": "{{stats}} de {{pokemonNameWithAffix}} não vai mais diminuir!", + "statWontGoAnyLower_other": "{{stats}} de {{pokemonNameWithAffix}} não vão mais diminuir!", + "transformedIntoType": "{{pokemonName}} transformed\ninto the {{type}} type!", "ppReduced": "O PP do movimento {{moveName}} de\n{{targetName}} foi reduzido em {{reduction}}!", + "retryBattle": "Você gostaria de tentar novamente desde o início da batalha?", + "unlockedSomething": "{{unlockedThing}}\nfoi desbloqueado.", + "congratulations": "Parabéns!", + "beatModeFirstTime": "{{speciesName}} venceu o Modo {{gameMode}} pela primeira vez!\nVocê recebeu {{newModifier}}!", "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}} precisa\nrecarregar!", "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}} não pode\nmais escapar!", "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}} foi liberto\nde {{moveName}}!", @@ -124,15 +141,19 @@ export const battle: SimpleTranslationEntries = { "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}} suportou\no golpe!", "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}} suportou\no golpe!", "battlerTagsPerishSongLapse": "O tempo restante de {{pokemonNameWithAffix}} diminuiu para {{turnCount}}.", + "battlerTagsCenterOfAttentionOnAdd": "{{pokemonNameWithAffix}} virou o centro\ndas atenções!", "battlerTagsTruantLapse": "{{pokemonNameWithAffix}} está\nviajando na maionese!", "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}} não\nestá preparado!", "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}} finalmente\nconseguiu se recompor!", "battlerTagsHighestStatBoostOnAdd": "O atributo de {{statName}} de\n{{pokemonNameWithAffix}} aumentou!", "battlerTagsHighestStatBoostOnRemove": "Os efeitos do {{abilityName}} de\n{{pokemonNameWithAffix}} acabaram!", + "battlerTagsMagnetRisenOnAdd": "{{pokemonNameWithAffix}} levitou com eletromagnetismo!", + "battlerTagsMagnetRisenOnRemove": "O eletromagnetismo de {{pokemonNameWithAffix}} sumiu!", "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}} está ficando\nbombado!", "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}} relaxou.", "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} está sendo curado com sal!", "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} foi ferido pelo {{moveName}}!", "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}} cortou seus PS pela metade e amaldiçoou {{pokemonName}}!", - "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} foi ferido pelo Curse!" + "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} foi ferido pelo Curse!", + "battlerTagsStockpilingOnAdd": "{{pokemonNameWithAffix}} estocou {{stockpiledCount}}!", } as const; diff --git a/src/locales/pt_BR/battler-tags.ts b/src/locales/pt_BR/battler-tags.ts new file mode 100644 index 00000000000..de8be35f1aa --- /dev/null +++ b/src/locales/pt_BR/battler-tags.ts @@ -0,0 +1,12 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battlerTags: SimpleTranslationEntries = { + "trappedDesc": "o aprisionamento", + "flinchedDesc": "a hesitação", + "confusedDesc": "a confusão", + "infatuatedDesc": "a paixão", + "seedDesc": "sementes", + "nightmareDesc": "os pesadelos", + "ingrainDesc": "o enraizamento", + "drowsyDesc": "a sonolência", +} as const; diff --git a/src/locales/pt_BR/bgm-name.ts b/src/locales/pt_BR/bgm-name.ts index 87d90dabc9d..ae2756e74be 100644 --- a/src/locales/pt_BR/bgm-name.ts +++ b/src/locales/pt_BR/bgm-name.ts @@ -1,89 +1,89 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; export const bgmName: SimpleTranslationEntries = { - "music": "Music: ", - "missing_entries" : "{{name}}", - "battle_kanto_champion": "B2W2 Kanto Champion Battle", - "battle_johto_champion": "B2W2 Johto Champion Battle", - "battle_hoenn_champion": "B2W2 Hoenn Champion Battle", - "battle_sinnoh_champion": "B2W2 Sinnoh Champion Battle", - "battle_champion_alder": "BW Unova Champion Battle", - "battle_champion_iris": "B2W2 Unova Champion Battle", - "battle_kalos_champion": "XY Kalos Champion Battle", - "battle_alola_champion": "USUM Alola Champion Battle", - "battle_galar_champion": "SWSH Galar Champion Battle", - "battle_champion_geeta": "SV Champion Geeta Battle", - "battle_champion_nemona": "SV Champion Nemona Battle", - "battle_champion_kieran": "SV Champion Kieran Battle", - "battle_hoenn_elite": "ORAS Elite Four Battle", - "battle_unova_elite": "BW Elite Four Battle", - "battle_kalos_elite": "XY Elite Four Battle", - "battle_alola_elite": "SM Elite Four Battle", - "battle_galar_elite": "SWSH League Tournament Battle", - "battle_paldea_elite": "SV Elite Four Battle", - "battle_bb_elite": "SV BB League Elite Four Battle", - "battle_final_encounter": "PMD RTDX Rayquaza's Domain", - "battle_final": "BW Ghetsis Battle", - "battle_kanto_gym": "B2W2 Kanto Gym Battle", - "battle_johto_gym": "B2W2 Johto Gym Battle", - "battle_hoenn_gym": "B2W2 Hoenn Gym Battle", - "battle_sinnoh_gym": "B2W2 Sinnoh Gym Battle", - "battle_unova_gym": "BW Unova Gym Battle", - "battle_kalos_gym": "XY Kalos Gym Battle", - "battle_galar_gym": "SWSH Galar Gym Battle", - "battle_paldea_gym": "SV Paldea Gym Battle", - "battle_legendary_kanto": "XY Kanto Legendary Battle", - "battle_legendary_raikou": "HGSS Raikou Battle", - "battle_legendary_entei": "HGSS Entei Battle", - "battle_legendary_suicune": "HGSS Suicune Battle", - "battle_legendary_lugia": "HGSS Lugia Battle", - "battle_legendary_ho_oh": "HGSS Ho-oh Battle", - "battle_legendary_regis_g5": "B2W2 Legendary Titan Battle", - "battle_legendary_regis_g6": "ORAS Legendary Titan Battle", - "battle_legendary_gro_kyo": "ORAS Groudon & Kyogre Battle", - "battle_legendary_rayquaza": "ORAS Rayquaza Battle", - "battle_legendary_deoxys": "ORAS Deoxys Battle", - "battle_legendary_lake_trio": "ORAS Lake Guardians Battle", - "battle_legendary_sinnoh": "ORAS Sinnoh Legendary Battle", - "battle_legendary_dia_pal": "ORAS Dialga & Palkia Battle", - "battle_legendary_giratina": "ORAS Giratina Battle", - "battle_legendary_arceus": "HGSS Arceus Battle", - "battle_legendary_unova": "BW Unova Legendary Battle", - "battle_legendary_kyurem": "BW Kyurem Battle", - "battle_legendary_res_zek": "BW Reshiram & Zekrom Battle", - "battle_legendary_xern_yvel": "XY Xerneas & Yveltal Battle", - "battle_legendary_tapu": "SM Tapu Battle", - "battle_legendary_sol_lun": "SM Solgaleo & Lunala Battle", - "battle_legendary_ub": "SM Ultra Beast Battle", - "battle_legendary_dusk_dawn": "USUM Dusk Mane & Dawn Wings Necrozma Battle", - "battle_legendary_ultra_nec": "USUM Ultra Necrozma Battle", - "battle_legendary_zac_zam": "SWSH Zacian & Zamazenta Battle", - "battle_legendary_glas_spec": "SWSH Glastrier & Spectrier Battle", - "battle_legendary_calyrex": "SWSH Calyrex Battle", - "battle_legendary_birds_galar": "SWSH Galarian Legendary Birds Battle", - "battle_legendary_ruinous": "SV Treasures of Ruin Battle", - "battle_legendary_kor_mir": "SV Depths of Area Zero Battle", - "battle_legendary_loyal_three": "SV Loyal Three Battle", - "battle_legendary_ogerpon": "SV Ogerpon Battle", - "battle_legendary_terapagos": "SV Terapagos Battle", - "battle_legendary_pecharunt": "SV Pecharunt Battle", - "battle_rival": "BW Rival Battle", - "battle_rival_2": "BW N Battle", - "battle_rival_3": "BW Final N Battle", - "battle_trainer": "BW Trainer Battle", - "battle_wild": "BW Wild Battle", - "battle_wild_strong": "BW Strong Wild Battle", - "end_summit": "PMD RTDX Sky Tower Summit", - "battle_rocket_grunt": "HGSS Team Rocket Battle", - "battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle", - "battle_galactic_grunt": "BDSP Team Galactic Battle", - "battle_plasma_grunt": "BW Team Plasma Battle", - "battle_flare_grunt": "XY Team Flare Battle", - "battle_rocket_boss": "USUM Giovanni Battle", - "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle", - "battle_galactic_boss": "BDSP Cyrus Battle", - "battle_plasma_boss": "B2W2 Ghetsis Battle", - "battle_flare_boss": "XY Lysandre Battle", + "music": "Música: ", + "missing_entries": "{{name}}", + "battle_kanto_champion": "B2W2 Batalha do Campeão de Kanto", + "battle_johto_champion": "B2W2 Batalha do Campeão de Johto", + "battle_hoenn_champion": "B2W2 Batalha do Campeão de Hoenn", + "battle_sinnoh_champion": "B2W2 Batalha do Campeão de Sinnoh", + "battle_champion_alder": "BW Batalha do Campeão de Unova", + "battle_champion_iris": "B2W2 Batalha do Campeão de Unova", + "battle_kalos_champion": "XY Batalha do Campeão de Kalos", + "battle_alola_champion": "USUM Batalha do Campeão de Alola", + "battle_galar_champion": "SWSH Batalha do Campeão de Galar", + "battle_champion_geeta": "SV Batalha da Campeã Geeta", + "battle_champion_nemona": "SV Batalha da Campeã Nemona", + "battle_champion_kieran": "SV Batalha do Campeão Kieran", + "battle_hoenn_elite": "ORAS Batalha da Elite dos Quatro", + "battle_unova_elite": "BW Batalha da Elite dos Quatro", + "battle_kalos_elite": "XY Batalha da Elite dos Quatro", + "battle_alola_elite": "SM Batalha da Elite dos Quatro", + "battle_galar_elite": "SWSH Batalha da Liga Pokémon", + "battle_paldea_elite": "SV Batalha da Elite dos Quatro", + "battle_bb_elite": "SV Liga BB Batalha da Elite dos Quatro", + "battle_final_encounter": "PMD RTDX Domínio do Rayquaza", + "battle_final": "BW Batalha do Ghetsis", + "battle_kanto_gym": "B2W2 Batalha de Ginásio de Kanto", + "battle_johto_gym": "B2W2 Batalha de Ginásio de Johto", + "battle_hoenn_gym": "B2W2 Batalha de Ginásio de Hoenn", + "battle_sinnoh_gym": "B2W2 Batalha de Ginásio de Sinnoh", + "battle_unova_gym": "BW Batalha de Ginásio de Unova", + "battle_kalos_gym": "XY Batalha de Ginásio de Kalos", + "battle_galar_gym": "SWSH Batalha de Ginásio de Galar", + "battle_paldea_gym": "SV Batalha de Ginásio de Paldea", + "battle_legendary_kanto": "XY Batalha dos Lendários de Kanto", + "battle_legendary_raikou": "HGSS Batalha do Raikou", + "battle_legendary_entei": "HGSS Batalha do Entei", + "battle_legendary_suicune": "HGSS Batalha do Suicune", + "battle_legendary_lugia": "HGSS Batalha do Lugia", + "battle_legendary_ho_oh": "HGSS Batalha do Ho-Oh", + "battle_legendary_regis_g5": "B2W2 Batalha dos Titãs Lendários", + "battle_legendary_regis_g6": "ORAS Batalha dos Titãs Lendários", + "battle_legendary_gro_kyo": "ORAS Batalha do Groudon & Kyogre", + "battle_legendary_rayquaza": "ORAS Batalha do Rayquaza", + "battle_legendary_deoxys": "ORAS Batalha do Deoxys", + "battle_legendary_lake_trio": "ORAS Batalha do Trio dos Lagos", + "battle_legendary_sinnoh": "ORAS Batalha dos Lendários de Sinnoh", + "battle_legendary_dia_pal": "ORAS Batalha do Dialga & Palkia", + "battle_legendary_giratina": "ORAS Batalha do Giratina", + "battle_legendary_arceus": "HGSS Batalha do Arceus", + "battle_legendary_unova": "BW Batalha dos Lendários de Unova", + "battle_legendary_kyurem": "BW Batalha do Kyurem", + "battle_legendary_res_zek": "BW Batalha do Reshiram & Zekrom", + "battle_legendary_xern_yvel": "XY Batalha do Xerneas & Yveltal", + "battle_legendary_tapu": "SM Batalha dos Guardiões de Alola", + "battle_legendary_sol_lun": "SM Batalha do Solgaleo & Lunala", + "battle_legendary_ub": "SM Batalha das Ultracriaturas", + "battle_legendary_dusk_dawn": "USUM Batalha do Necrozma Crepúsculo & Alvorada", + "battle_legendary_ultra_nec": "USUM Batalha do Necrozma Ultra", + "battle_legendary_zac_zam": "SWSH Batalha do Zacian & Zamazenta", + "battle_legendary_glas_spec": "SWSH Batalha do Glastrier & Spectrier", + "battle_legendary_calyrex": "SWSH Batalha do Calyrex", + "battle_legendary_birds_galar": "SWSH Batalha dos Pássaros Lendários de Galar", + "battle_legendary_ruinous": "SV Batalha dos Lendários Ruinosos", + "battle_legendary_kor_mir": "SV Batalha das Cavernas da Área Zero", + "battle_legendary_loyal_three": "SV Batalha dos Três Leais", + "battle_legendary_ogerpon": "SV Batalha do Ogerpon", + "battle_legendary_terapagos": "SV Batalha do Terapagos", + "battle_legendary_pecharunt": "SV Batalha do Pecharunt", + "battle_rival": "BW Batalha do Rival", + "battle_rival_2": "BW Batalha do N", + "battle_rival_3": "BW Batalha Final do N", + "battle_trainer": "BW Batalha de Treinador", + "battle_wild": "BW Batalha de Pokémon Selvagem", + "battle_wild_strong": "BW Batalha de Pokémon Selvagem Forte", + "end_summit": "PMD RTDX Cume da Torre do Céu", + "battle_rocket_grunt": "HGSS Batalha da Equipe Rocket", + "battle_aqua_magma_grunt": "ORAS Batalha da Equipe Aqua & Magma", + "battle_galactic_grunt": "BDSP Batalha da Equipe Galáctica", + "battle_plasma_grunt": "BW Batalha da Equipe Plasma", + "battle_flare_grunt": "XY Batalha da Equipe Flare", + "battle_rocket_boss": "USUM Batalha do Giovanni", + "battle_aqua_magma_boss": "ORAS Batalha do Maxie & Archie", + "battle_galactic_boss": "BDSP Batalha do Cyrus", + "battle_plasma_boss": "B2W2 Batalha do Ghetsis", + "battle_flare_boss": "XY Batalha do Lysandre", // Biome Music "abyss": "PMD EoS Dark Crater", @@ -110,9 +110,9 @@ export const bgmName: SimpleTranslationEntries = { "plains": "PMD EoS Sky Peak Prairie", "power_plant": "PMD EoS Far Amp Plains", "ruins": "PMD EoS Deep Sealed Ruin", - "sea": "PMD EoS Brine Cave", + "sea": "Andr06 - Marine Mystique", // Name defined by the composer "seabed": "Firel - Seabed", // The composer thinks about a more creative name - "slum": "PMD EoS Sky Peak Coast", + "slum": "Andr06 - Sneaky Snom", // Name defined by the composer "snowy_forest": "PMD EoS Sky Peak Snowfield", "space": "Firel - Aether", "swamp": "PMD EoS Surrounded Sea", @@ -123,23 +123,23 @@ export const bgmName: SimpleTranslationEntries = { "wasteland": "PMD EoS Hidden Highland", // Encounter - "encounter_ace_trainer": "BW Trainers' Eyes Meet (Ace Trainer)", - "encounter_backpacker": "BW Trainers' Eyes Meet (Backpacker)", - "encounter_clerk": "BW Trainers' Eyes Meet (Clerk)", - "encounter_cyclist": "BW Trainers' Eyes Meet (Cyclist)", - "encounter_lass": "BW Trainers' Eyes Meet (Lass)", - "encounter_parasol_lady": "BW Trainers' Eyes Meet (Parasol Lady)", - "encounter_pokefan": "BW Trainers' Eyes Meet (Poke Fan)", - "encounter_psychic": "BW Trainers' Eyes Meet (Psychic)", - "encounter_rich": "BW Trainers' Eyes Meet (Gentleman)", + "encounter_ace_trainer": "BW Encontro com Treinador (Treinador Ás)", + "encounter_backpacker": "BW Encontro com Treinador (Mochileiro)", + "encounter_clerk": "BW Encontro com Treinador (Funcionário)", + "encounter_cyclist": "BW Encontro com Treinador (Ciclista)", + "encounter_lass": "BW Encontro com Treinador (Senhorita)", + "encounter_parasol_lady": "BW Encontro com Treinador (Moça de Sombrinha)", + "encounter_pokefan": "BW Encontro com Treinador (Pokéfã)", + "encounter_psychic": "BW Encontro com Treinador (Médium)", + "encounter_rich": "BW Encontro com Treinador (Cavalheiro)", "encounter_rival": "BW Cheren", - "encounter_roughneck": "BW Trainers' Eyes Meet (Roughneck)", - "encounter_scientist": "BW Trainers' Eyes Meet (Scientist)", - "encounter_twins": "BW Trainers' Eyes Meet (Twins)", - "encounter_youngster": "BW Trainers' Eyes Meet (Youngster)", + "encounter_roughneck": "BW Encontro com Treinador (Arruaceiro)", + "encounter_scientist": "BW Encontro com Treinador (Cientista)", + "encounter_twins": "BW Encontro com Treinador (Gêmeos)", + "encounter_youngster": "BW Encontro com Treinador (Jovem)", // Other - "heal": "BW Pokémon Heal", - "menu": "PMD EoS Welcome to the World of Pokémon!", - "title": "PMD EoS Top Menu Theme", + "heal": "BW Centro Pokémon", + "menu": "PMD EoS Bem-vindo ao Mundo dos Pokémon!", + "title": "PMD EoS Menu Principal", } as const; diff --git a/src/locales/pt_BR/config.ts b/src/locales/pt_BR/config.ts index c02da112770..0aee484e1ce 100644 --- a/src/locales/pt_BR/config.ts +++ b/src/locales/pt_BR/config.ts @@ -1,13 +1,17 @@ import { ability } from "./ability"; import { abilityTriggers } from "./ability-trigger"; import { PGFachv, PGMachv } from "./achv"; +import { arenaFlyout } from "./arena-flyout"; import { battle } from "./battle"; +import { battleInfo } from "./battle-info"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; +import { battlerTags } from "./battler-tags"; import { berry } from "./berry"; import { bgmName } from "./bgm-name"; import { biome } from "./biome"; import { challenges } from "./challenges"; import { commandUiHandler } from "./command-ui-handler"; +import { common } from "./common.js"; import { PGFbattleSpecDialogue, PGFdialogue, @@ -26,14 +30,19 @@ import { growth } from "./growth"; import { menu } from "./menu"; import { menuUiHandler } from "./menu-ui-handler"; import { modifier } from "./modifier"; +import { modifierSelectUiHandler } from "./modifier-select-ui-handler"; import { modifierType } from "./modifier-type"; import { move } from "./move"; import { nature } from "./nature"; +import { partyUiHandler } from "./party-ui-handler"; import { pokeball } from "./pokeball"; import { pokemon } from "./pokemon"; +import { pokemonForm } from "./pokemon-form"; import { pokemonInfo } from "./pokemon-info"; import { pokemonInfoContainer } from "./pokemon-info-container"; +import { pokemonSummary } from "./pokemon-summary"; import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler"; +import { settings } from "./settings.js"; import { splashMessages } from "./splash-messages"; import { starterSelectUiHandler } from "./starter-select-ui-handler"; import { statusEffect } from "./status-effect"; @@ -41,16 +50,15 @@ import { titles, trainerClasses, trainerNames } from "./trainers"; import { tutorial } from "./tutorial"; import { voucher } from "./voucher"; import { terrain, weather } from "./weather"; -import { partyUiHandler } from "./party-ui-handler"; -import { settings } from "./settings.js"; -import { common } from "./common.js"; -import { modifierSelectUiHandler } from "./modifier-select-ui-handler"; export const ptBrConfig = { ability: ability, abilityTriggers: abilityTriggers, + arenaFlyout: arenaFlyout, battle: battle, + battleInfo: battleInfo, battleMessageUiHandler: battleMessageUiHandler, + battlerTags: battlerTags, berry: berry, bgmName: bgmName, biome: biome, @@ -80,8 +88,10 @@ export const ptBrConfig = { nature: nature, pokeball: pokeball, pokemon: pokemon, + pokemonForm: pokemonForm, pokemonInfo: pokemonInfo, pokemonInfoContainer: pokemonInfoContainer, + pokemonSummary: pokemonSummary, saveSlotSelectUiHandler: saveSlotSelectUiHandler, statusEffect: statusEffect, terrain: terrain, diff --git a/src/locales/pt_BR/menu-ui-handler.ts b/src/locales/pt_BR/menu-ui-handler.ts index 75e5adcfd87..b874df7e23b 100644 --- a/src/locales/pt_BR/menu-ui-handler.ts +++ b/src/locales/pt_BR/menu-ui-handler.ts @@ -18,6 +18,10 @@ export const menuUiHandler: SimpleTranslationEntries = { "exportSlotSelect": "Selecione um slot para exportar.", "importData": "Importar dados", "exportData": "Exportar dados", + "linkDiscord": "Conectar Discord", + "unlinkDiscord": "Desconectar Discord", + "linkGoogle": "Conectar Google", + "unlinkGoogle": "Desconectar Google", "cancel": "Cancelar", "losingProgressionWarning": "Você vai perder todo o progresso desde o início da batalha. Confirmar?", "noEggs": "Você não está chocando\nnenhum ovo no momento!" diff --git a/src/locales/pt_BR/menu.ts b/src/locales/pt_BR/menu.ts index 1e097737b69..927ccce518b 100644 --- a/src/locales/pt_BR/menu.ts +++ b/src/locales/pt_BR/menu.ts @@ -17,6 +17,7 @@ export const menu: SimpleTranslationEntries = { "username": "Nome de Usuário", "password": "Senha", "login": "Iniciar sessão", + "orUse": "Ou use", "register": "Registrar-se", "emptyUsername": "Nome de usuário vazio", "invalidLoginUsername": "Nome de usuário inválido", @@ -53,5 +54,9 @@ export const menu: SimpleTranslationEntries = { "no": "Não", "disclaimer": "AVISO", "disclaimerDescription": "Este jogo é um produto inacabado; ele pode ter problemas de jogabilidade (incluindo possíveis\n perdas de dados salvos), sofrer alterações sem aviso prévio e pode ou não ser atualizado ou concluído.", + "choosePokemon": "Escolha um Pokémon.", + "renamePokemon": "Renomear Pokémon", + "rename": "Renomear", + "nickname": "Apelido", "errorServerDown": "Opa! Não foi possível conectar-se ao servidor.\n\nVocê pode deixar essa janela aberta,\npois o jogo irá se reconectar automaticamente.", } as const; diff --git a/src/locales/pt_BR/modifier-type.ts b/src/locales/pt_BR/modifier-type.ts index 408d2757f9b..a5cddaed235 100644 --- a/src/locales/pt_BR/modifier-type.ts +++ b/src/locales/pt_BR/modifier-type.ts @@ -58,10 +58,10 @@ export const modifierType: ModifierTypeTranslationEntries = { description: "Aumenta o poder dos ataques do tipo {{moveType}} de um Pokémon em 20%.", }, "PokemonLevelIncrementModifierType": { - description: "Aumenta em 1 o nível de um Pokémon.", + description: "Aumenta em {{levels}} o nível de um Pokémon.", }, "AllPokemonLevelIncrementModifierType": { - description: "Aumenta em 1 os níveis de todos os Pokémon.", + description: "Aumenta em {{levels}} o nível de todos os membros da equipe.", }, "PokemonBaseStatBoosterModifierType": { description: "Aumenta o atributo base de {{statName}} em 10%. Quanto maior os IVs, maior o limite de aumento.", @@ -153,6 +153,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "REVIVER_SEED": { name: "Semente Reanimadora", description: "Após desmaiar por um ataque direto, reanima com 50% de PS." }, + "WHITE_HERB": { name: "Erva Branca", description: "Restaura quaisquer atributos diminuídos em batalha." }, + "ETHER": { name: "Éter" }, "MAX_ETHER": { name: "Éter Máximo" }, @@ -182,6 +184,9 @@ export const modifierType: ModifierTypeTranslationEntries = { "SOOTHE_BELL": { name: "Guizo" }, + "SCOPE_LENS": { name: "Lentes de Mira", description: "Estas lentes facilitam o foco em pontos fracos. Aumenta a chance de acerto crítico de quem a segurar." }, + "LEEK": { name: "Alho-poró", description: "Esse talo de alho-poró muito longo e rígido aumenta a taxa de acerto crítico dos movimentos do Farfetch'd." }, + "EVIOLITE": { name: "Eviolita", description: "Esse misterioso caroço evolutivo aumenta os atributos de Defesa e Def. Esp. quando segurado por um Pokémon que ainda pode evoluir." }, "SOUL_DEW": { name: "Joia da Alma", description: "Aumenta a influência da natureza de um Pokémon em seus atributos em 10% (cumulativo)." }, diff --git a/src/locales/pt_BR/modifier.ts b/src/locales/pt_BR/modifier.ts index 7cc90df5caa..87682a55466 100644 --- a/src/locales/pt_BR/modifier.ts +++ b/src/locales/pt_BR/modifier.ts @@ -5,6 +5,7 @@ export const modifier: SimpleTranslationEntries = { "turnHealApply": "{{pokemonNameWithAffix}} restaurou um pouco de PS usando\nsuas {{typeName}}!", "hitHealApply": "{{pokemonNameWithAffix}} restaurou um pouco de PS usando\nsua {{typeName}}!", "pokemonInstantReviveApply": "{{pokemonNameWithAffix}} foi revivido\npor sua {{typeName}}!", + "pokemonResetNegativeStatStageApply": "Os atributos diminuídos de {{pokemonNameWithAffix}} foram\nrestaurados por seu(sua) {{typeName}}!", "moneyInterestApply": "Você recebeu um juros de ₽{{moneyAmount}}\nde sua {{typeName}}!", "turnHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} foi absorvido(a)\npelo {{typeName}} de {{pokemonName}}!", "contactHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} foi pego(a)\npela {{typeName}} de {{pokemonName}}!", diff --git a/src/locales/pt_BR/move.ts b/src/locales/pt_BR/move.ts index 0008cc55416..1748f726682 100644 --- a/src/locales/pt_BR/move.ts +++ b/src/locales/pt_BR/move.ts @@ -2281,8 +2281,8 @@ export const move: MoveTranslationEntries = { name: "Parabolic Charge", effect: "O usuário ataca tudo ao seu redor. Os PS do usuário são restaurados pela metade do dano recebido por aqueles que foram atingidos." }, - "forest’SCurse": { - name: "Forest’s Curse", + "forestsCurse": { + name: "Forest's Curse", effect: "O usuário conjura uma maldição da floresta no alvo. Isso adiciona o tipo Planta à tipagem do alvo." }, "petalBlizzard": { @@ -2349,8 +2349,8 @@ export const move: MoveTranslationEntries = { name: "Fairy Lock", effect: "Bloqueando o campo de batalha, o usuário previne que todos os Pokémon fujam durante o próximo turno." }, - "king’SShield": { - name: "King’s Shield", + "kingsShield": { + name: "King's Shield", effect: "O usuário assume uma posição defensiva enquanto protege a si mesmo de dano. Isto duramente diminui o Ataque de qualquer um que faça contato direto." }, "playNice": { @@ -2461,8 +2461,8 @@ export const move: MoveTranslationEntries = { name: "Thousand Waves", effect: "O usuário ataca com tremores que se dispersam pelo chão. Alvos atingidos não podem fugir da batalha." }, - "land’SWrath": { - name: "Land’s Wrath", + "landsWrath": { + name: "Land's Wrath", effect: "O usuário reúne a energia da terra e foca esse poder nos Pokémon oponentes para causar dano." }, "lightOfRuin": { @@ -2873,547 +2873,547 @@ export const move: MoveTranslationEntries = { name: "Multi-Attack", effect: "Se envolvendo em energia concentrada, o usuário acerta o alvo. A memória segurada determina o tipo do movimento." }, - "10,000,000VoltThunderbolt": { + "tenMillionVoltThunderbolt": { name: "10,000,000 Volt Thunderbolt", effect: "Usando seu Poder Z, o Pikachu de boné acumula eletricidade e despeja-a. Golpes críticos acertam mais facilmente." }, - mindBlown: { + "mindBlown": { name: "Mind Blown", effect: "O usuário ataca tudo ao seu redor fazendo sua própria cabeça explodir. Isso também causa dano ao usuário." }, - plasmaFists: { + "plasmaFists": { name: "Plasma Fists", effect: "O usuário ataca com punhos carregados eletricamente. Este movimento transforma movimentos do tipo Normal em movimentos do tipo Elétrico." }, - photonGeyser: { + "photonGeyser": { name: "Photon Geyser", effect: "O usuário ataca o alvo com um pilar de luz. Este movimento causa dano de Ataque ou Ataque Especial—o que for maior para o usuário." }, - lightThatBurnsTheSky: { + "lightThatBurnsTheSky": { name: "Light That Burns the Sky", effect: "Este ataque causa dano de Ataque ou Ataque Especial—o que for maior para o usuário, Necrozma. Este movimento ignora a Habilidade do alvo." }, - searingSunrazeSmash: { + "searingSunrazeSmash": { name: "Searing Sunraze Smash", effect: "Após obter o Z-Power, o usuário, Solgaleo, ataca o alvo com força total. Este movimento pode ignorar o efeito da Habilidade do alvo." }, - menacingMoonrazeMaelstrom: { + "menacingMoonrazeMaelstrom": { name: "Menacing Moonraze Maelstrom", effect: "Após obter o Z-Power, o usuário, Lunala, ataca o alvo com força total. Este movimento pode ignorar o efeito da Habilidade do alvo." }, - letsSnuggleForever: { + "letsSnuggleForever": { name: "Let's Snuggle Forever", effect: "Após obter o Z-Power, o usuário, Mimikyu, soca o alvo com força total." }, - splinteredStormshards: { + "splinteredStormshards": { name: "Splintered Stormshards", effect: "Após obter o Z-Power, o usuário, Lycanroc, ataca o alvo com força total. Este movimento nega o efeito no campo de batalha." }, - clangorousSoulblaze: { + "clangorousSoulblaze": { name: "Clangorous Soulblaze", effect: "Após obter o Z-Power, o usuário, Kommo-o, ataca os Pokémon adversários com força total. Este movimento aumenta os atributos do usuário." }, - zippyZap: { + "zippyZap": { name: "Zippy Zap", effect: "O usuário ataca o alvo com rajadas de eletricidade em alta velocidade. Esse movimento sempre vai primeiro e aumenta a Evasão do usuário." }, - splishySplash: { + "splishySplash": { name: "Splishy Splash", effect: "O usuário carrega uma onda enorme com eletricidade e atinge os Pokémon adversários com a onda. Isso também pode deixar os Pokémon adversários paralisados." }, - floatyFall: { + "floatyFall": { name: "Floaty Fall", effect: "O usuário flutua no ar e então mergulha em um ângulo íngreme para atacar o alvo. Isso também pode fazer o alvo hesitar." }, - pikaPapow: { + "pikaPapow": { name: "Pika Papow", effect: "Quanto mais o Pikachu ama seu Treinador, maior o poder do movimento. Nunca erra." }, - bouncyBubble: { + "bouncyBubble": { name: "Bouncy Bubble", effect: "O usuário ataca atirando bolhas de água no alvo. Em seguida, absorve água e restaura seu HP pelo mesmo valor de dano causado ao alvo." }, - buzzyBuzz: { + "buzzyBuzz": { name: "Buzzy Buzz", effect: "O usuário dispara um choque de eletricidade para atacar o alvo. Isso também deixa o alvo paralisado." }, - sizzlySlide: { + "sizzlySlide": { name: "Sizzly Slide", effect: "O usuário se envolve em fogo e carrega contra o alvo. Isso também deixa o alvo queimado." }, - glitzyGlow: { + "glitzyGlow": { name: "Glitzy Glow", effect: "O usuário bombardeia o alvo com força telecinética. Uma parede maravilhosa de luz é erguida para enfraquecer o poder dos movimentos especiais dos Pokémon adversários." }, - baddyBad: { + "baddyBad": { name: "Baddy Bad", effect: "O usuário age mal e ataca o alvo. Uma parede maravilhosa de luz é erguida para enfraquecer o poder dos movimentos físicos dos Pokémon adversários." }, - sappySeed: { + "sappySeed": { name: "Sappy Seed", effect: "O usuário cresce um caule gigantesco que espalha sementes para atacar o alvo. As sementes drenam o HP do alvo a cada turno." }, - freezyFrost: { + "freezyFrost": { name: "Freezy Frost", effect: "O usuário ataca com um cristal feito de névoa congelada fria. Isso elimina todas as mudanças de atributo entre todos os Pokémon envolvidos na batalha." }, - sparklySwirl: { + "sparklySwirl": { name: "Sparkly Swirl", effect: "O usuário ataca o alvo envolvendo-o com um redemoinho de um aroma esmagador. Isso também cura todas as condições de status do grupo do usuário." }, - veeveeVolley: { + "veeveeVolley": { name: "Veevee Volley", effect: "Quanto mais o Eevee ama seu Treinador, maior o poder do movimento. Nunca erra." }, - doubleIronBash: { + "doubleIronBash": { name: "Double Iron Bash", effect: "O usuário gira, centrando a porca hexagonal em seu peito e depois ataca com seus braços duas vezes seguidas. Isso também pode fazer o alvo hesitar." }, - maxGuard: { + "maxGuard": { name: "Max Guard", effect: "Este movimento permite ao usuário proteger-se de todos os ataques. Sua chance de falhar aumenta se for usado em sucessão." }, - dynamaxCannon: { + "dynamaxCannon": { name: "Dynamax Cannon", - effect: "O usuário libera um forte feixe de seu núcleo. Este movimento causa o dobro do dano se o alvo estiver acima do nível 200." + effect: "O usuário libera um forte feixe de seu núcleo. Este movimento causa até o dobro do dano se o alvo estiver com seu nível acima do limite." }, - snipeShot: { + "snipeShot": { name: "Snipe Shot", effect: "O usuário ignora os efeitos dos movimentos e Habilidades dos Pokémon adversários que atraem movimentos, permitindo que este movimento atinja o alvo escolhido." }, - jawLock: { + "jawLock": { name: "Jaw Lock", effect: "Este movimento impede o usuário e o alvo de trocarem de lugar até que um deles desmaie. O efeito desaparece se qualquer um dos Pokémon deixar o campo." }, - stuffCheeks: { + "stuffCheeks": { name: "Stuff Cheeks", effect: "O usuário come sua Fruta segurada, depois aumenta muito seu atributo de Defesa." }, - noRetreat: { + "noRetreat": { name: "No Retreat", effect: "Este movimento aumenta todos os atributos do usuário, mas impede o usuário de trocar de lugar ou fugir." }, - tarShot: { + "tarShot": { name: "Tar Shot", effect: "O usuário derrama alcatrão pegajoso sobre o alvo, diminuindo o atributo de Velocidade do alvo. O alvo se torna mais fraco contra movimentos do tipo Fogo." }, - magicPowder: { + "magicPowder": { name: "Magic Powder", effect: "O usuário espalha uma nuvem de pó mágico que muda o alvo para o tipo Psíquico." }, - dragonDarts: { + "dragonDarts": { name: "Dragon Darts", effect: "O usuário ataca duas vezes usando Dreepy. Se houver dois alvos, este movimento atinge cada alvo uma vez." }, - teatime: { + "teatime": { name: "Teatime", effect: "O usuário faz hora do chá com todos os Pokémon na batalha. Cada Pokémon come sua Fruta segurada." }, - octolock: { + "octolock": { name: "Octolock", effect: "O usuário prende o alvo e impede que ele fuja. Este movimento também diminui os atributos de Defesa e Def. Esp. do alvo a cada turno." }, - boltBeak: { + "boltBeak": { name: "Bolt Beak", effect: "O usuário fere o alvo com seu bico eletrificado. Se o usuário atacar antes do alvo, o poder deste movimento é dobrado." }, - fishiousRend: { + "fishiousRend": { name: "Fishious Rend", effect: "O usuário fere o alvo com suas brânquias duras. Se o usuário atacar antes do alvo, o poder deste movimento é dobrado." }, - courtChange: { + "courtChange": { name: "Court Change", effect: "Com seu poder misterioso, o usuário troca os efeitos de cada lado do campo." }, - maxFlare: { + "maxFlare": { name: "Max Flare", effect: "Este é um ataque do tipo Fogo que Pokémon Dynamax usam. O usuário intensifica o sol por cinco turnos." }, - maxFlutterby: { + "maxFlutterby": { name: "Max Flutterby", effect: "Este é um ataque do tipo Inseto que Pokémon Dynamax usam. Isso diminui o atributo de Atq. Esp. do alvo." }, - maxLightning: { + "maxLightning": { name: "Max Lightning", effect: "Este é um ataque do tipo Elétrico que Pokémon Dynamax usam. O usuário transforma o chão em Terreno Elétrico por cinco turnos." }, - maxStrike: { + "maxStrike": { name: "Max Strike", effect: "Este é um ataque do tipo Normal que Pokémon Dynamax usam. Isso diminui o atributo de Velocidade do alvo." }, - maxKnuckle: { + "maxKnuckle": { name: "Max Knuckle", effect: "Este é um ataque do tipo Lutador que Pokémon Dynamax usam. Isso aumenta os atributos de Ataque dos Pokémon aliados." }, - maxPhantasm: { + "maxPhantasm": { name: "Max Phantasm", effect: "Este é um ataque do tipo Fantasma que Pokémon Dynamax usam. Isso diminui o atributo de Defesa do alvo." }, - maxHailstorm: { + "maxHailstorm": { name: "Max Hailstorm", effect: "Este é um ataque do tipo Gelo que Pokémon Dynamax usam. O usuário convoca uma tempestade de granizo que dura cinco turnos." }, - maxOoze: { + "maxOoze": { name: "Max Ooze", effect: "Este é um ataque do tipo Veneno que Pokémon Dynamax usam. Isso aumenta os atributos de Atq. Esp. dos Pokémon aliados." }, - maxGeyser: { + "maxGeyser": { name: "Max Geyser", effect: "Este é um ataque do tipo Água que Pokémon Dynamax usam. O usuário convoca uma chuva pesada que cai por cinco turnos." }, - maxAirstream: { + "maxAirstream": { name: "Max Airstream", effect: "Este é um ataque do tipo Voador que Pokémon Dynamax usam. Isso aumenta os atributos de Velocidade dos Pokémon aliados." }, - maxStarfall: { + "maxStarfall": { name: "Max Starfall", effect: "Este é um ataque do tipo Fada que Pokémon Dynamax usam. O usuário transforma o chão em Terreno de Nevoeiro por cinco turnos." }, - maxWyrmwind: { + "maxWyrmwind": { name: "Max Wyrmwind", effect: "Este é um ataque do tipo Dragão que Pokémon Dynamax usam. Isso diminui o atributo de Ataque do alvo." }, - maxMindstorm: { + "maxMindstorm": { name: "Max Mindstorm", effect: "Este é um ataque do tipo Psíquico que Pokémon Dynamax usam. O usuário transforma o chão em Terreno Psíquico por cinco turnos." }, - maxRockfall: { + "maxRockfall": { name: "Max Rockfall", effect: "Este é um ataque do tipo Pedra que Pokémon Dynamax usam. O usuário convoca uma tempestade de areia que dura cinco turnos." }, - maxQuake: { + "maxQuake": { name: "Max Quake", effect: "Este é um ataque do tipo Terra que Pokémon Dynamax usam. Isso aumenta os atributos de Def. Esp. dos Pokémon aliados." }, - maxDarkness: { + "maxDarkness": { name: "Max Darkness", effect: "Este é um ataque do tipo Sombrio que Pokémon Dynamax usam. Isso diminui o atributo de Def. Esp. do alvo." }, - maxOvergrowth: { + "maxOvergrowth": { name: "Max Overgrowth", effect: "Este é um ataque do tipo Grama que Pokémon Dynamax usam. O usuário transforma o chão em Terreno de Grama por cinco turnos." }, - maxSteelspike: { + "maxSteelspike": { name: "Max Steelspike", effect: "Este é um ataque do tipo Aço que Pokémon Dynamax usam. Isso aumenta os atributos de Defesa dos Pokémon aliados." }, - clangorousSoul: { + "clangorousSoul": { name: "Clangorous Soul", effect: "O usuário aumenta todos os seus atributos usando um pouco de seu HP." }, - bodyPress: { + "bodyPress": { name: "Body Press", effect: "O usuário ataca pressionando seu corpo contra o alvo. Quanto maior a Defesa do usuário, mais dano pode infligir ao alvo." }, - decorate: { + "decorate": { name: "Decorate", effect: "O usuário aumenta muito os atributos de Ataque e Atq. Esp. do alvo decorando o alvo." }, - drumBeating: { + "drumBeating": { name: "Drum Beating", effect: "O usuário toca seu tambor, controlando as raízes do tambor para atacar o alvo. Isso também diminui o atributo de Velocidade do alvo." }, - snapTrap: { + "snapTrap": { name: "Snap Trap", effect: "O usuário prende o alvo em uma armadilha rápida por quatro ou cinco turnos." }, - pyroBall: { + "pyroBall": { name: "Pyro Ball", effect: "O usuário ataca acendendo uma pequena pedra e lançando-a como uma bola de fogo no alvo. Isso também pode deixar o alvo queimado." }, - behemothBlade: { + "behemothBlade": { name: "Behemoth Blade", effect: "O usuário empunha uma espada grande e poderosa usando todo o seu corpo e corta o alvo em um ataque vigoroso." }, - behemothBash: { + "behemothBash": { name: "Behemoth Bash", effect: "O corpo do usuário se torna um escudo firme e atinge o alvo com força." }, - auraWheel: { + "auraWheel": { name: "Aura Wheel", effect: "Morpeko ataca e aumenta sua Velocidade com a energia armazenada em suas bochechas. O tipo deste movimento muda dependendo da forma do usuário." }, - breakingSwipe: { + "breakingSwipe": { name: "Breaking Swipe", effect: "O usuário balança sua cauda dura violentamente e ataca os Pokémon adversários. Isso também diminui os atributos de Ataque deles." }, - branchPoke: { + "branchPoke": { name: "Branch Poke", effect: "O usuário ataca o alvo cutucando-o com um galho pontiagudo." }, - overdrive: { + "overdrive": { name: "Overdrive", effect: "O usuário ataca os Pokémon adversários vibrando uma guitarra ou baixo, causando um eco enorme e uma vibração forte." }, - appleAcid: { + "appleAcid": { name: "Apple Acid", effect: "O usuário ataca o alvo com um líquido ácido criado a partir de maçãs azedas. Isso também diminui o atributo de Def. Esp. do alvo." }, - gravApple: { + "gravApple": { name: "Grav Apple", effect: "O usuário inflige dano derrubando uma maçã de cima. Isso também diminui o atributo de Defesa do alvo." }, - spiritBreak: { + "spiritBreak": { name: "Spirit Break", effect: "O usuário ataca o alvo com tanta força que poderia quebrar o espírito do alvo. Isso também diminui o atributo de Atq. Esp. do alvo." }, - strangeSteam: { + "strangeSteam": { name: "Strange Steam", effect: "O usuário ataca o alvo emitindo vapor. Isso também pode deixar o alvo confuso." }, - lifeDew: { + "lifeDew": { name: "Life Dew", effect: "O usuário espalha água misteriosa ao redor e restaura o HP de si mesmo e de seus Pokémon aliados na batalha." }, - obstruct: { + "obstruct": { name: "Obstruct", effect: "Este movimento permite ao usuário proteger-se de todos os ataques. Sua chance de falhar aumenta se for usado em sucessão. Contato direto reduz severamente o atributo de Defesa do atacante." }, - falseSurrender: { + "falseSurrender": { name: "False Surrender", effect: "O usuário finge abaixar a cabeça, mas então esfaqueia o alvo com seus cabelos desgrenhados. Este ataque nunca erra." }, - meteorAssault: { + "meteorAssault": { name: "Meteor Assault", effect: "O usuário ataca selvagemente com seu alho-poró grosso. O usuário não pode se mover na próxima rodada, porque a força deste movimento o faz cambalear." }, - eternabeam: { + "eternabeam": { name: "Eternabeam", effect: "Este é o ataque mais poderoso de Eternatus em sua forma original. O usuário não pode se mover na próxima rodada." }, - steelBeam: { + "steelBeam": { name: "Steel Beam", effect: "O usuário dispara um feixe de aço que coletou de todo o seu corpo. Isso também causa dano ao usuário." }, - expandingForce: { + "expandingForce": { name: "Expanding Force", effect: "O usuário ataca o alvo com seu poder psíquico. O poder deste movimento aumenta e danifica todos os Pokémon adversários no Terreno Psíquico." }, - steelRoller: { + "steelRoller": { name: "Steel Roller", effect: "O usuário ataca enquanto destrói o terreno. Este movimento falha quando o chão não foi transformado em um terreno." }, - scaleShot: { + "scaleShot": { name: "Scale Shot", effect: "O usuário ataca atirando escamas de duas a cinco vezes seguidas. Este movimento aumenta o atributo de Velocidade do usuário, mas diminui seu atributo de Defesa." }, - meteorBeam: { + "meteorBeam": { name: "Meteor Beam", effect: "Neste ataque de dois turnos, o usuário reúne energia espacial e aumenta seu atributo de Atq. Esp., depois ataca o alvo no próximo turno." }, - shellSideArm: { + "shellSideArm": { name: "Shell Side Arm", effect: "Este movimento causa dano físico ou especial, o que for mais eficaz. Isso também pode envenenar o alvo." }, - mistyExplosion: { + "mistyExplosion": { name: "Misty Explosion", effect: "O usuário ataca tudo ao seu redor e desmaia ao usar este movimento. O poder deste movimento é aumentado no Terreno de Nevoeiro." }, - grassyGlide: { + "grassyGlide": { name: "Grassy Glide", effect: "Deslizando no chão, o usuário ataca o alvo. Este movimento sempre ataca primeiro no Terreno de Grama." }, - risingVoltage: { + "risingVoltage": { name: "Rising Voltage", effect: "O usuário ataca com a voltagem elétrica que sobe do chão. O poder deste movimento dobra quando o alvo está no Terreno Elétrico." }, - terrainPulse: { + "terrainPulse": { name: "Terrain Pulse", effect: "O usuário utiliza o poder do terreno para atacar. O tipo e o poder deste movimento mudam dependendo do terreno em que é usado." }, - skitterSmack: { + "skitterSmack": { name: "Skitter Smack", effect: "O usuário corre por trás do alvo para atacar. Isso também diminui o atributo de Atq. Esp. do alvo." }, - burningJealousy: { + "burningJealousy": { name: "Burning Jealousy", effect: "O usuário ataca com energia da inveja. Isso deixa todos os Pokémon adversários que tiveram seus atributos aumentados durante o turno com uma queimadura." }, - lashOut: { + "lashOut": { name: "Lash Out", effect: "O usuário ataca para desabafar sua frustração contra o alvo. Se os atributos do usuário foram diminuídos durante este turno, o poder deste movimento é dobrado." }, - poltergeist: { + "poltergeist": { name: "Poltergeist", effect: "O usuário ataca o alvo controlando o item do alvo. O movimento falha se o alvo não tiver um item." }, - corrosiveGas: { + "corrosiveGas": { name: "Corrosive Gas", effect: "O usuário envolve tudo ao seu redor com gás altamente ácido e derrete os itens que eles seguram." }, - coaching: { + "coaching": { name: "Coaching", effect: "O usuário treina adequadamente seus Pokémon aliados, aumentando seus atributos de Ataque e Defesa." }, - flipTurn: { + "flipTurn": { name: "Flip Turn", effect: "Após fazer seu ataque, o usuário corre para trocar de lugar com um Pokémon do grupo à espera." }, - tripleAxel: { + "tripleAxel": { name: "Triple Axel", effect: "Um ataque de três chutes consecutivos que se torna mais poderoso a cada acerto bem-sucedido." }, - dualWingbeat: { + "dualWingbeat": { name: "Dual Wingbeat", effect: "O usuário atinge o alvo com suas asas. O alvo é atingido duas vezes seguidas." }, - scorchingSands: { + "scorchingSands": { name: "Scorching Sands", effect: "O usuário joga areia escaldante no alvo para atacar. Isso também pode deixar o alvo queimado." }, - jungleHealing: { + "jungleHealing": { name: "Jungle Healing", effect: "O usuário se torna um com a selva, restaurando HP e curando quaisquer condições de status de si mesmo e de seus Pokémon aliados na batalha." }, - wickedBlow: { + "wickedBlow": { name: "Wicked Blow", effect: "O usuário, tendo dominado o estilo Sombrio, atinge o alvo com um golpe feroz. Este ataque sempre resulta em um acerto crítico." }, - surgingStrikes: { + "surgingStrikes": { name: "Surging Strikes", effect: "O usuário, tendo dominado o estilo Água, atinge o alvo com um movimento fluido três vezes seguidas. Estes ataques sempre resultam em acertos críticos." }, - thunderCage: { + "thunderCage": { name: "Thunder Cage", effect: "O usuário prende o alvo em uma gaiola de eletricidade cintilante por quatro ou cinco turnos." }, - dragonEnergy: { + "dragonEnergy": { name: "Dragon Energy", effect: "Convertendo sua força vital em poder, o usuário ataca os Pokémon adversários. Quanto menor o HP do usuário, menor o poder do movimento." }, - freezingGlare: { + "freezingGlare": { name: "Freezing Glare", effect: "O usuário dispara seu poder psíquico dos olhos para atacar. Isso também pode deixar o alvo congelado." }, - fieryWrath: { + "fieryWrath": { name: "Fiery Wrath", effect: "O usuário transforma sua ira em uma aura semelhante ao fogo para atacar. Isso também pode fazer os Pokémon adversários hesitarem." }, - thunderousKick: { + "thunderousKick": { name: "Thunderous Kick", effect: "O usuário oprime o alvo com movimento semelhante ao relâmpago antes de entregar um chute. Isso também diminui o atributo de Defesa do alvo." }, - glacialLance: { + "glacialLance": { name: "Glacial Lance", effect: "O usuário ataca lançando uma lança de gelo envolta em nevasca nos Pokémon adversários." }, - astralBarrage: { + "astralBarrage": { name: "Astral Barrage", effect: "O usuário ataca enviando uma quantidade assustadora de pequenos fantasmas nos Pokémon adversários." }, - eerieSpell: { + "eerieSpell": { name: "Eerie Spell", effect: "O usuário ataca com seu tremendo poder psíquico. Isso também remove 3 PP do último movimento usado pelo alvo." }, - direClaw: { + "direClaw": { name: "Dire Claw", effect: "O usuário ataca o alvo com garras destruidoras. Isso também pode deixar o alvo envenenado, paralisado ou adormecido." }, - psyshieldBash: { + "psyshieldBash": { name: "Psyshield Bash", effect: "Envoltando-se em energia psíquica, o usuário se choca contra o alvo. Isso também aumenta o atributo de Defesa do usuário." }, - powerShift: { + "powerShift": { name: "Power Shift", effect: "O usuário troca seus atributos de Ataque e Defesa." }, - stoneAxe: { + "stoneAxe": { name: "Stone Axe", effect: "O usuário balança seus machados de pedra no alvo. Fragmentos de pedra deixados para trás por este ataque flutuam ao redor do alvo." }, - springtideStorm: { + "springtideStorm": { name: "Springtide Storm", effect: "O usuário ataca envolvendo os Pokémon adversários em ventos ferozes repletos de amor e ódio. Isso também pode diminuir os atributos de Ataque deles." }, - mysticalPower: { + "mysticalPower": { name: "Mystical Power", effect: "O usuário ataca emitindo um poder misterioso. Isso também aumenta o atributo de Atq. Esp. do usuário." }, - ragingFury: { + "ragingFury": { name: "Raging Fury", effect: "O usuário se enfurece espalhando chamas por dois ou três turnos. O usuário então fica confuso." }, - waveCrash: { + "waveCrash": { name: "Wave Crash", effect: "O usuário se envolve em água e atinge o alvo com todo o corpo para infligir dano. Isso também causa muito dano ao usuário." }, - chloroblast: { + "chloroblast": { name: "Chloroblast", effect: "O usuário lança sua clorofila acumulada para infligir dano no alvo. Isso também causa dano ao usuário." }, - mountainGale: { + "mountainGale": { name: "Mountain Gale", effect: "O usuário arremessa pedaços gigantes de gelo no alvo para infligir dano. Isso também pode fazer o alvo hesitar." }, - victoryDance: { + "victoryDance": { name: "Victory Dance", effect: "O usuário realiza uma dança intensa para inaugurar a vitória, aumentando seus atributos de Ataque, Defesa e Velocidade." }, - headlongRush: { + "headlongRush": { name: "Headlong Rush", effect: "O usuário se choca contra o alvo em um ataque de corpo inteiro. Isso também diminui os atributos de Defesa e Def. Esp. do usuário." }, - barbBarrage: { + "barbBarrage": { name: "Barb Barrage", effect: "O usuário lança inúmeras barbas tóxicas para infligir dano. O poder deste movimento é dobrado se o alvo já estiver envenenado." }, - esperWing: { + "esperWing": { name: "Esper Wing", effect: "O usuário corta o alvo com asas enriquecidas com aura. Isso também aumenta o atributo de Velocidade do usuário. Este movimento tem uma chance aumentada de causar um acerto crítico." }, - bitterMalice: { + "bitterMalice": { name: "Bitter Malice", effect: "O usuário ataca o alvo com um ressentimento arrepiante. Isso também diminui o atributo de Ataque do alvo." }, - shelter: { + "shelter": { name: "Shelter", effect: "O usuário torna sua pele tão dura quanto um escudo de ferro, aumentando muito seu atributo de Defesa." }, - tripleArrows: { + "tripleArrows": { name: "Triple Arrows", effect: "O usuário chuta e depois dispara três flechas. Este movimento tem uma chance aumentada de causar um acerto crítico e também pode diminuir o atributo de Defesa do alvo ou fazê-lo hesitar." }, - infernalParade: { + "infernalParade": { name: "Infernal Parade", effect: "O usuário ataca com miríades de bolas de fogo. Isso também pode deixar o alvo queimado. O poder deste movimento é dobrado se o alvo tiver uma condição de status." }, - ceaselessEdge: { + "ceaselessEdge": { name: "Ceaseless Edge", effect: "O usuário corta sua lâmina de concha no alvo. Fragmentos de concha deixados para trás por este ataque permanecem espalhados sob o alvo como espinhos." }, - bleakwindStorm: { + "bleakwindStorm": { name: "Bleakwind Storm", effect: "O usuário ataca com ventos selvagemente frios que fazem tanto o corpo quanto o espírito tremerem. Isso também pode diminuir os atributos de Velocidade dos Pokémon adversários." }, - wildboltStorm: { + "wildboltStorm": { name: "Wildbolt Storm", effect: "O usuário invoca uma tempestade trovejante e ataca selvagemente com relâmpagos e vento. Isso também pode deixar os Pokémon adversários paralisados." }, - sandsearStorm: { + "sandsearStorm": { name: "Sandsear Storm", effect: "O usuário ataca envolvendo os Pokémon adversários em ventos ferozes e areia escaldante. Isso também pode deixá-los queimados." }, - lunarBlessing: { + "lunarBlessing": { name: "Lunar Blessing", effect: "O usuário recebe uma bênção do crescente lunar, restaurando HP e curando condições de status para si mesmo e seus Pokémon aliados atualmente na batalha." }, - takeHeart: { + "takeHeart": { name: "Take Heart", effect: "O usuário levanta o espírito, curando suas próprias condições de status e aumentando seus atributos de Atq. Esp. e Def. Esp." }, - gMaxWildfire: { + "gMaxWildfire": { name: "G-Max Wildfire", effect: "Um ataque do tipo Fogo que o Gigantamax Charizard usa. Este movimento continua causando dano aos oponentes por quatro turnos." }, - gMaxBefuddle: { + "gMaxBefuddle": { name: "G-Max Befuddle", effect: "Um ataque do tipo Inseto que o Gigantamax Butterfree usa. Este movimento inflige as condições de envenenado, paralisado ou adormecido nos oponentes." }, - gMaxVoltCrash: { + "gMaxVoltCrash": { name: "G-Max Volt Crash", effect: "Um ataque do tipo Elétrico que o Gigantamax Pikachu usa. Este movimento paralisa os oponentes." }, - gMaxGoldRush: { + "gMaxGoldRush": { name: "G-Max Gold Rush", effect: "Um ataque do tipo Normal que o Gigantamax Meowth usa. Este movimento confunde os oponentes e também ganha dinheiro extra." }, diff --git a/src/locales/pt_BR/party-ui-handler.ts b/src/locales/pt_BR/party-ui-handler.ts index aac9e56aefa..08132b4bfc0 100644 --- a/src/locales/pt_BR/party-ui-handler.ts +++ b/src/locales/pt_BR/party-ui-handler.ts @@ -16,6 +16,7 @@ export const partyUiHandler: SimpleTranslationEntries = { "PASS_BATON": "Passar Bastão", "UNPAUSE_EVOLUTION": "Ativar Evolução", "REVIVE": "Reviver", + "RENAME": "Renomear", "choosePokemon": "Escolha um Pokémon.", "doWhatWithThisPokemon": "O que você deseja fazer?", diff --git a/src/locales/pt_BR/pokemon-form.ts b/src/locales/pt_BR/pokemon-form.ts new file mode 100644 index 00000000000..04d362e7538 --- /dev/null +++ b/src/locales/pt_BR/pokemon-form.ts @@ -0,0 +1,190 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const pokemonForm: SimpleTranslationEntries = { + // Battle forms + "mega": "Mega {{pokemonName}}", + "mega-x": "Mega {{pokemonName}} X", + "mega-y": "Mega {{pokemonName}} Y", + "primal": "{{pokemonName}} Primordial", + "gigantamax": "G-Max {{pokemonName}}", + "eternamax": "E-Max {{pokemonName}}", + + // Starters forms + // 1G + "pikachuCosplay": "Cosplay", + "pikachuCoolCosplay": "Cosplay Legal", + "pikachuBeautyCosplay": "Cosplay Bonito", + "pikachuCuteCosplay": "Cosplay Fofo", + "pikachuSmartCosplay": "Cosplay Inteligente", + "pikachuToughCosplay": "Cosplay Forte", + "pikachuPartner": "Parceiro", + "eeveePartner": "Parceiro", + // 2G + "pichuSpiky": "Spiky", + "unownA": "A", + "unownB": "B", + "unownC": "C", + "unownD": "D", + "unownE": "E", + "unownF": "F", + "unownG": "G", + "unownH": "H", + "unownI": "I", + "unownJ": "J", + "unownK": "K", + "unownL": "L", + "unownM": "M", + "unownN": "N", + "unownO": "O", + "unownP": "P", + "unownQ": "Q", + "unownR": "R", + "unownS": "S", + "unownT": "T", + "unownU": "U", + "unownV": "V", + "unownW": "W", + "unownX": "X", + "unownY": "Y", + "unownZ": "Z", + "unownExclamation": "!", + "unownQuestion": "?", + // 3G + "castformSunny": "Ensolarado", + "castformRainy": "Chuvoso", + "castformSnowy": "Nevado", + "deoxysNormal": "Normal", + // 4G + "burmyPlant": "Vegetal", + "burmySandy": "Arenoso", + "burmyTrash": "Lixo", + "shellosEast": "Leste", + "shellosWest": "Oeste", + "rotomHeat": "Calor", + "rotomWash": "Lavagem", + "rotomFrost": "Congelante", + "rotomFan": "Ventilador", + "rotomMow": "Corte", + "giratinaAltered": "Altered", + "shayminLand": "Land", + // 5G + "basculinRedStriped": "Listras Vermelhas", + "basculinBlueStriped": "Listras Azuis", + "basculinWhiteStriped": "Listras Brancas", + "deerlingSpring": "Primavera", + "deerlingSummer": "Verão", + "deerlingAutumn": "Outono", + "deerlingWinter": "Inverno", + "tornadusIncarnate": "Incarnate", + "thundurusIncarnate": "Incarnate", + "landorusIncarnate": "Incarnate", + "keldeoOrdinary": "Ordinary", + "meloettaAria": "Aria", + // 6G + "froakieBattleBond": "Vínculo de Batalha", + "scatterbugMeadow": "Prado", + "scatterbugIcySnow": "Neve Congelada", + "scatterbugPolar": "Polar", + "scatterbugTundra": "Tundra", + "scatterbugContinental": "Continental", + "scatterbugGarden": "Jardim", + "scatterbugElegant": "Elegante", + "scatterbugModern": "Moderno", + "scatterbugMarine": "Marinho", + "scatterbugArchipelago": "Arquipélago", + "scatterbugHighPlains": "Planalto", + "scatterbugSandstorm": "Deserto", + "scatterbugRiver": "Rio", + "scatterbugMonsoon": "Monção", + "scatterbugSavanna": "Savana", + "scatterbugSun": "Solar", + "scatterbugOcean": "Oceano", + "scatterbugJungle": "Selva", + "scatterbugFancy": "Chique", + "scatterbugPokeBall": "Poké Bola", + "flabebeRed": "Vermelha", + "flabebeYellow": "Amarela", + "flabebeOrange": "Laranja", + "flabebeBlue": "Azul", + "flabebeWhite": "Branca", + "furfrouHeart": "Coração", + "furfrouStar": "Estrela", + "furfrouDiamond": "Diamante", + "furfrouDebutante": "Debutante", + "furfrouMatron": "Madame", + "furfrouDandy": "Cavalheiro", + "furfrouLaReine": "Aristocrático", + "furfrouKabuki": "Kabuki", + "furfrouPharaoh": "Faraó", + "pumpkabooSmall": "Pequeno", + "pumpkabooLarge": "Grande", + "pumpkabooSuper": "Extragrande", + "xerneasNeutral": "Relaxado", + "xerneasActive": "Ativo", + "zygarde50": "Forma 50%", + "zygarde10": "Forma 10%", + "zygarde50Pc": "Forma 50% Agrupada", + "zygarde10Pc": "Forma 10% Agrupada", + "zygardeComplete": "Forma Completa", + // 7G + "oricorioBaile": "Flamenco", + "oricorioPompom": "Pompom", + "oricorioPau": "Hula", + "oricorioSensu": "Leque", + "rockruffOwnTempo": "Próprio Tempo", + "miniorRedMeteor": "Meteoro Vermelho", + "miniorOrangeMeteor": "Meteoro Laranja", + "miniorYellowMeteor": "Meteoro Amarelo", + "miniorGreenMeteor": "Meteoro Verde", + "miniorBlueMeteor": "Meteoro Azul", + "miniorIndigoMeteor": "Meteoro Anil", + "miniorVioletMeteor": "Meteoro Violeta", + "miniorRed": "Vermelho", + "miniorOrange": "Laranja", + "miniorYellow": "Amarelo", + "miniorGreen": "Verde", + "miniorBlue": "Azul", + "miniorIndigo": "Anil", + "miniorViolet": "Violeta", + "mimikyuDisguised": "Disfarçado", + "mimikyuBusted": "Descoberto", + "magearnaOriginal": "Original", + "marshadowZenith": "Zênite", + // 8G + "sinisteaPhony": "Falsificado", + "sinisteaAntique": "Autêntico", + "eiscueNoIce": "Descongelado", + "indeedeeMale": "Macho", + "indeedeeFemale": "Fêmea", + "morpekoFullBelly": "Full Belly", + "zacianHeroOfManyBattles": "Hero Of Many Battles", + "zamazentaHeroOfManyBattles": "Hero Of Many Battles", + "zarudeDada": "Papa", + "enamorusIncarnate": "Incarnate", + // 9G + "squawkabillyGreenPlumage": "Plumas Verdes", + "squawkabillyBluePlumage": "Plumas Azuis", + "squawkabillyYellowPlumage": "Plumas Amarelas", + "squawkabillyWhitePlumage": "Plumas Brancas", + "tatsugiriCurly": "Curvado", + "tatsugiriDroopy": "Caído", + "tatsugiriStretchy": "Reto", + "gimmighoulChest": "Baú", + "gimmighoulRoaming": "Perambulante", + "koraidonApexBuild": "Apex Build", + "koraidonLimitedBuild":"Limited Build", + "koraidonSprintingBuild":"Sprinting Build", + "koraidonSwimmingBuild":"Swimming Build", + "koraidonGlidingBuild":"Gliding Build", + "miraidonUltimateMode":"Ultimate Mode", + "miraidonLowPowerMode":"Low Power Mode", + "miraidonDriveMode":"Drive Mode", + "miraidonAquaticMode":"Aquatic Mode", + "miraidonGlideMode":"Glide Mode", + "poltchageistCounterfeit": "Imitação", + "poltchageistArtisan": "Artesão", + "paldeaTaurosCombat": "Combate", + "paldeaTaurosBlaze": "Chamas", + "paldeaTaurosAqua": "Aquático", + +} as const; diff --git a/src/locales/pt_BR/pokemon-summary.ts b/src/locales/pt_BR/pokemon-summary.ts new file mode 100644 index 00000000000..a492e701c94 --- /dev/null +++ b/src/locales/pt_BR/pokemon-summary.ts @@ -0,0 +1,20 @@ +import { TranslationEntries } from "#app/interfaces/locales"; + +export const pokemonSummary: TranslationEntries = { + "pokemonInfo": "Info. Pokémon", + "status": "Status", + "powerAccuracyCategory": "Poder\nPrecisão\nCategoria", + "type": "Tipo", + "unknownTrainer": "Desconhecido", + "ot": "TO", + "nature": "natureza", + "expPoints": "Pontos EXP.", + "nextLv": "Próx. Nv.", + "cancel": "Cancelar", + + "memoString": "Natureza {{natureFragment}},\n{{metFragment}}", + "metFragment": { + "normal": "encontrado no Nv.{{level}},\n{{biome}}.", + "apparently": "aparentemente encontrado no Nv.{{level}},\n{{biome}}.", + }, +} as const; diff --git a/src/locales/pt_BR/settings.ts b/src/locales/pt_BR/settings.ts index 9d336cf0757..c3a077acc4a 100644 --- a/src/locales/pt_BR/settings.ts +++ b/src/locales/pt_BR/settings.ts @@ -95,5 +95,6 @@ export const settings: SimpleTranslationEntries = { "mute": "Mudo", "controller": "Controle", "gamepadSupport": "Suporte para Controle", - "showBgmBar": "Show Music Names", + "showBgmBar": "Exibir Nomes das Músicas", + "shopOverlayOpacity": "Opacidade da Loja" } as const; diff --git a/src/locales/pt_BR/splash-messages.ts b/src/locales/pt_BR/splash-messages.ts index d21945943a0..b621456a9ec 100644 --- a/src/locales/pt_BR/splash-messages.ts +++ b/src/locales/pt_BR/splash-messages.ts @@ -34,4 +34,5 @@ export const splashMessages: SimpleTranslationEntries = { "alsoTryRadicalRed": "Também Jogue Radical Red!", "eeveeExpo": "Eevee Expo!", "ynoproject": "YNOproject!", + "breedersInSpace": "Criadores Pokémon no Espaço!", } as const; diff --git a/src/locales/pt_BR/starter-select-ui-handler.ts b/src/locales/pt_BR/starter-select-ui-handler.ts index eb2709a0da8..bec408f4550 100644 --- a/src/locales/pt_BR/starter-select-ui-handler.ts +++ b/src/locales/pt_BR/starter-select-ui-handler.ts @@ -7,6 +7,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; */ export const starterSelectUiHandler: SimpleTranslationEntries = { "confirmStartTeam": "Começar com esses Pokémon?", + "invalidParty": "Essa equipe de iniciais não é válida!", "gen1": "G1", "gen2": "G2", "gen3": "G3", diff --git a/src/locales/pt_BR/weather.ts b/src/locales/pt_BR/weather.ts index 31e35657c7f..a99708afff4 100644 --- a/src/locales/pt_BR/weather.ts +++ b/src/locales/pt_BR/weather.ts @@ -40,7 +40,7 @@ export const weather: SimpleTranslationEntries = { "strongWindsStartMessage": "Ventos fortes apareceram!", "strongWindsLapseMessage": "Os ventos fortes continuam.", - "strongWindsEffectMessage": "The mysterious air current weakened the attack!", + "strongWindsEffectMessage": "A corrente de ar misteriosa enfraqueceu o ataque!", "strongWindsClearMessage": "Os ventos fortes diminuíram.", }; @@ -60,7 +60,7 @@ export const terrain: SimpleTranslationEntries = { "psychic": "Psíquico", "psychicStartMessage": "O campo de batalha ficou esquisito!", - "psychicClearMessage": "A esquisitice sumiu do campo de batalha", + "psychicClearMessage": "A esquisitice sumiu do campo de batalha!", "defaultBlockMessage": "{{pokemonNameWithAffix}} está protegido pelo Terreno {{terrainName}}!" }; diff --git a/src/locales/zh_CN/ability-trigger.ts b/src/locales/zh_CN/ability-trigger.ts index a9d7fa5b202..9cc1d94847b 100644 --- a/src/locales/zh_CN/ability-trigger.ts +++ b/src/locales/zh_CN/ability-trigger.ts @@ -5,7 +5,58 @@ export const abilityTriggers: SimpleTranslationEntries = { "badDreams": "{{pokemonName}}被折磨着!", "costar": "{{pokemonName}}复制了{{allyName}}的能力变化!", "iceFaceAvoidedDamage": "{{pokemonName}}因为{{abilityName}}\n避免了伤害!", + "perishBody": "因为{{pokemonName}}的{{abilityName}}\n双方将在3回合后灭亡!", + "poisonHeal": "{{pokemonName}}因{{abilityName}}\n回复了少许HP!", "trace": "{{pokemonName}}复制了{{targetName}}的\n{{abilityName}}!", "windPowerCharged": "受{{moveName}}的影响,{{pokemonName}}提升了能力!", "quickDraw":"因为速击效果发动,\n{{pokemonName}}比平常出招更快了!", + "blockItemTheft": "{{pokemonNameWithAffix}}的{{abilityName}}\n阻止了对方夺取道具!", + "typeImmunityHeal": "{{pokemonNameWithAffix}}因{{abilityName}}\n回复了少许HP!", + "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}}因{{abilityName}}\n避免了伤害!", + "postDefendDisguise": "{{pokemonNameWithAffix}}的\n画皮脱落了", + "moveImmunity": "对{{pokemonNameWithAffix}}没有效果!", + "reverseDrain": "{{pokemonNameWithAffix}}\n吸到了污泥浆!", + "postDefendTypeChange": "{{pokemonNameWithAffix}}因{{abilityName}}\n变成了{{typeName}}属性!", + "postDefendContactDamage": "{{pokemonNameWithAffix}}的{{abilityName}}\n使对方受到了伤害!", + "postDefendAbilitySwap": "{{pokemonNameWithAffix}}\n互换了各自的特性!", + "postDefendAbilityGive": "因为{{pokemonNameWithAffix}}\n对方的特性变成了{{abilityName}}!", + "postDefendMoveDisable": "封住了{{pokemonNameWithAffix}}的\n{{moveName}}!", + "pokemonTypeChange": "{{pokemonNameWithAffix}}\n变成了{{moveType}}属性!", + "postAttackStealHeldItem": "{{pokemonNameWithAffix}}从{{defenderName}}那里\n夺取了{{stolenItemType}}!", + "postDefendStealHeldItem": "{{pokemonNameWithAffix}}从{{attackerName}}那里\n夺取了{{stolenItemType}}!", + "copyFaintedAllyAbility": "继承了{{pokemonNameWithAffix}}的\n{{abilityName}}!", + "intimidateImmunity": "{{pokemonNameWithAffix}}因{{abilityName}}没有受到威吓!", + "postSummonAllyHeal": "{{pokemonNameWithAffix}}喝光了\n{{pokemonName}}泡的茶!", + "postSummonClearAllyStats": "{{pokemonNameWithAffix}}的\n能力变化消失了!", + "postSummonTransform": "{{pokemonNameWithAffix}}\n变身成了{{targetName}}!", + "protectStat": "因{{pokemonNameWithAffix}}的{{abilityName}}\n{{statName}}不会降低!", + "statusEffectImmunityWithName": "{{pokemonNameWithAffix}}因{{abilityName}}\n{{statusEffectName}}没有效果!", + "statusEffectImmunity": "{{pokemonNameWithAffix}}因{{abilityName}}\n异常状态没有效果!", + "battlerTagImmunity": "{{pokemonNameWithAffix}}因{{abilityName}}\n而不会{{battlerTagName}}!", + "forewarn": "{{pokemonNameWithAffix}}读取了\n{{moveName}}!", + "frisk": "{{pokemonNameWithAffix}}察觉到了\n{{opponentName}}的{{opponentAbilityName}}!", + "postWeatherLapseHeal": "{{pokemonNameWithAffix}}因{{abilityName}}\n回复了少许HP!", + "postWeatherLapseDamage": "{{pokemonNameWithAffix}}\n因{abilityName}}而受到了伤害!", + "postTurnLootCreateEatenBerry": "{{pokemonNameWithAffix}}\n收获了{{berryName}}!", + "postTurnHeal": "{{pokemonNameWithAffix}}因{{abilityName}}\n回复了少许HP!", + "fetchBall": "{{pokemonNameWithAffix}}\n捡回了{{pokeballName}}!", + "healFromBerryUse": "{{pokemonNameWithAffix}}因{{abilityName}}\n回复了HP!", + "arenaTrap": "因{{pokemonNameWithAffix}}的{{abilityName}}\n而无法进行替换!", + "postBattleLoot": "{{pokemonNameWithAffix}}捡到了\n{{itemName}}!", + "postFaintContactDamage": "{{pokemonNameWithAffix}}的{{abilityName}}\n使对方受到了伤害!", + "postFaintHpDamage": "{{pokemonNameWithAffix}}的{{abilityName}}\n使对方受到了伤害!", + "postSummonPressure": "从{{pokemonNameWithAffix}}的身上\n感到了一种压迫感!", + "postSummonMoldBreaker": "{{pokemonNameWithAffix}}\n打破了常规!", + "postSummonAnticipation": "{{pokemonNameWithAffix}}\n发抖了!", + "postSummonTurboblaze": "{{pokemonNameWithAffix}}\n正在释放炽焰气场!", + "postSummonTeravolt": "{{pokemonNameWithAffix}}\n正在释放溅射气场!", + "postSummonDarkAura": "{{pokemonNameWithAffix}}\n正在释放暗黑气场!", + "postSummonFairyAura": "{{pokemonNameWithAffix}}\n正在释放妖精气场!", + "postSummonNeutralizingGas": "周围充满了\n{{pokemonNameWithAffix}}的化学变化气体!", + "postSummonAsOneGlastrier": "{{pokemonNameWithAffix}}\n同时拥有了两种特性!", + "postSummonAsOneSpectrier": "{{pokemonNameWithAffix}}\n同时拥有了两种特性!", + "postSummonVesselOfRuin": "{{pokemonNameWithAffix}}的灾祸之鼎\n令周围的宝可梦的{{statName}}减弱了!", + "postSummonSwordOfRuin": "{{pokemonNameWithAffix}}的灾祸之剑\n令周围的宝可梦的{{statName}}减弱了!", + "postSummonTabletsOfRuin": "{{pokemonNameWithAffix}}的灾祸之简\n令周围的宝可梦的{{statName}}减弱了!", + "postSummonBeadsOfRuin": "{{pokemonNameWithAffix}}的灾祸之玉\n令周围的宝可梦的{{statName}}减弱了!", } as const; diff --git a/src/locales/zh_CN/arena-flyout.ts b/src/locales/zh_CN/arena-flyout.ts new file mode 100644 index 00000000000..e30642e7d21 --- /dev/null +++ b/src/locales/zh_CN/arena-flyout.ts @@ -0,0 +1,49 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const arenaFlyout: SimpleTranslationEntries = { + // Title + "activeBattleEffects": "当前战斗效果", + "player": "我方", + "neutral": "全局", + "enemy": "敌方", + + // WeatherType + "sunny": "大晴天", + "rain": "下雨", + "sandstorm": "沙暴", + "hail": "冰雹", + "snow": "下雪", + "fog": "起雾", + "heavyRain": "大雨", + "harshSun": "大日照", + "strongWinds": "乱流", + + // TerrainType + "misty": "薄雾场地", + "electric": "电气场地", + "grassy": "青草场地", + "psychic": "精神场地", + + // ArenaTagType + "mudSport": "玩泥巴", + "waterSport": "玩水", + "spikes": "撒菱", + "toxicSpikes": "毒菱", + "mist": "白雾", + "futureSight": "预知未来", + "doomDesire": "破灭之愿", + "wish": "祈愿", + "stealthRock": "隐形岩", + "stickyWeb": "黏黏网", + "trickRoom": "戏法空间", + "gravity": "重力", + "reflect": "反射壁", + "lightScreen": "光墙", + "auroraVeil": "极光幕", + "quickGuard": "快速防守", + "wideGuard": "广域防守", + "matBlock": "掀榻榻米", + "craftyShield": "戏法防守", + "tailwind": "顺风", + "happyHour": "快乐时光", +}; diff --git a/src/locales/zh_CN/battle-info.ts b/src/locales/zh_CN/battle-info.ts new file mode 100644 index 00000000000..684ce4bc26a --- /dev/null +++ b/src/locales/zh_CN/battle-info.ts @@ -0,0 +1,5 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battleInfo: SimpleTranslationEntries = { + "generation": "第{{generation}}世代", +} as const; diff --git a/src/locales/zh_CN/battle.ts b/src/locales/zh_CN/battle.ts index ff2e90a2c59..c3c9077b7f1 100644 --- a/src/locales/zh_CN/battle.ts +++ b/src/locales/zh_CN/battle.ts @@ -62,6 +62,8 @@ export const battle: SimpleTranslationEntries = { "skipItemQuestion": "你确定要跳过拾取道具吗?", "eggHatching": "咦?", "stealEatBerry": "{{pokemonName}} stole and ate\n{{targetName}}'s {{berryName}}!", + "ppHealBerry": "{{pokemonNameWithAffix}}用{{berryName}}\n回复了{{moveName}}的PP!", + "hpHealBerry": "{{pokemonNameWithAffix}}用{{berryName}}\n回复了体力!", "ivScannerUseQuestion": "对{{pokemonName}}使用个体值扫描仪?", "wildPokemonWithAffix": "野生的{{pokemonName}}", "foePokemonWithAffix": "对手 {{pokemonName}}", @@ -69,15 +71,22 @@ export const battle: SimpleTranslationEntries = { "drainMessage": "{{pokemonName}}\n吸取了体力!", "regainHealth": "{{pokemonName}}\n回复了体力!", "fainted": "{{pokemonNameWithAffix}}\n倒下了!", - "statRose": "{{pokemonNameWithAffix}}\n的{{stats}}提高了!", - "statSharplyRose": "{{pokemonNameWithAffix}}\n的{{stats}}大幅提高了!", - "statRoseDrastically": "{{pokemonNameWithAffix}}\n的{{stats}}极大幅提高了!", - "statWontGoAnyHigher": "{{pokemonNameWithAffix}}\n的{{stats}}已经无法再提高了!", - "statFell": "{{pokemonNameWithAffix}}\n的{{stats}}降低了!", - "statHarshlyFell": "{{pokemonNameWithAffix}}\n的{{stats}}大幅降低了!", - "statSeverelyFell": "{{pokemonNameWithAffix}}\n的{{stats}}极大幅降低了!", - "statWontGoAnyLower": "{{pokemonNameWithAffix}}\n的{{stats}}已经无法再降低了!", + "statsAnd": "and", + "stats": "Stats", + "statRose_other": "{{pokemonNameWithAffix}}的 {{stats}}提高了!", + "statSharplyRose_other": "{{pokemonNameWithAffix}}的 {{stats}}大幅提高了!", + "statRoseDrastically_other": "{{pokemonNameWithAffix}}的 {{stats}}极大幅提高了!", + "statWontGoAnyHigher_other": "{{pokemonNameWithAffix}}的 {{stats}}已经无法再提高了!", + "statFell_other": "{{pokemonNameWithAffix}}的 {{stats}}降低了!", + "statHarshlyFell_other": "{{pokemonNameWithAffix}}的 {{stats}}大幅降低了!", + "statSeverelyFell_other": "{{pokemonNameWithAffix}}的 {{stats}}极大幅降低了!", + "statWontGoAnyLower_other": "{{pokemonNameWithAffix}}的 {{stats}}已经无法再降低了!", + "transformedIntoType": "{{pokemonName}} transformed\ninto the {{type}} type!", "ppReduced": "降低了{{targetName}}的\n{{moveName}}的PP{{reduction}}点!", + "retryBattle": "你要从对战开始时重试么?", + "unlockedSomething": "{{unlockedThing}}\n已解锁。", + "congratulations": "恭喜!", + "beatModeFirstTime": "{{speciesName}}首次击败了{{gameMode}}!\n你获得了{{newModifier}}!", "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}}\n因攻击的反作用力而无法动弹!", "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}}不能逃跑!", "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}}\n摆脱了{{moveName}}!", @@ -124,15 +133,19 @@ export const battle: SimpleTranslationEntries = { "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}}\n挺住了攻击!", "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}}\n挺住了攻击!", "battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}}\n的灭亡计时变成{{turnCount}}了!", + "battlerTagsCenterOfAttentionOnAdd": "{{pokemonNameWithAffix}}\n变得万众瞩目了!", "battlerTagsTruantLapse": "{{pokemonNameWithAffix}}\n正在偷懒!", "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}}\n无法拿出平时的水平!", "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}}\n恢复了平时的水平!", "battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}的\n{{statName}}提高了!", "battlerTagsHighestStatBoostOnRemove": "{{pokemonNameWithAffix}}的\n{{abilityName}}效果解除了!", + "battlerTagsMagnetRisenOnAdd": "{{pokemonNameWithAffix}}\n因电磁力浮了起来!", + "battlerTagsMagnetRisenOnRemove": "{{pokemonNameWithAffix}}的\n电磁力消失了!", "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}}\n现在干劲十足!", "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}}\n如释重负似地放松了下来。", "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}}\n陷入了盐腌状态!", "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}}\n受到了{{moveName}}的伤害!", "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}}削减了自己的体力,\n并诅咒了{{pokemonName}}!", - "battlerTagsCursedLapse": "{{pokemonNameWithAffix}}\n正受到诅咒!" + "battlerTagsCursedLapse": "{{pokemonNameWithAffix}}\n正受到诅咒!", + "battlerTagsStockpilingOnAdd": "{{pokemonNameWithAffix}} stockpiled {{stockpiledCount}}!" } as const; diff --git a/src/locales/zh_CN/battler-tags.ts b/src/locales/zh_CN/battler-tags.ts new file mode 100644 index 00000000000..2a945809282 --- /dev/null +++ b/src/locales/zh_CN/battler-tags.ts @@ -0,0 +1,12 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battlerTags: SimpleTranslationEntries = { + "trappedDesc": "束缚", + "flinchedDesc": "畏缩", + "confusedDesc": "混乱", + "infatuatedDesc": "着迷", + "seedDesc": "寄生种子", + "nightmareDesc": "恶梦", + "ingrainDesc": "扎根", + "drowsyDesc": "瞌睡", +} as const; diff --git a/src/locales/zh_CN/bgm-name.ts b/src/locales/zh_CN/bgm-name.ts index b582bc6a2d0..71db565eb05 100644 --- a/src/locales/zh_CN/bgm-name.ts +++ b/src/locales/zh_CN/bgm-name.ts @@ -110,9 +110,9 @@ export const bgmName: SimpleTranslationEntries = { "plains": "空之探险队「天空顶端(草原)」", "power_plant": "空之探险队「电气平原 深处」", "ruins": "空之探险队「封印岩地 深处」", - "sea": "空之探险队「石滩洞窟」", + "sea": "Andr06 - Marine Mystique", // Name defined by the composer "seabed": "Firel - 海底", // The composer thinks about a more creative name - "slum": "空之探险队「天空顶端(岩场)」", + "slum": "Andr06 - Sneaky Snom", // Name defined by the composer "snowy_forest": "空之探险队「天空顶端(雪山)」", "space": "Firel - 太空", "swamp": "空之探险队「封闭之海」", diff --git a/src/locales/zh_CN/config.ts b/src/locales/zh_CN/config.ts index eaf7ba4cc09..84b74c1a20c 100644 --- a/src/locales/zh_CN/config.ts +++ b/src/locales/zh_CN/config.ts @@ -1,8 +1,11 @@ import { ability } from "./ability"; import { abilityTriggers } from "./ability-trigger"; +import { arenaFlyout } from "./arena-flyout"; import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; +import { battleInfo } from "./battle-info"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; +import { battlerTags } from "./battler-tags"; import { berry } from "./berry"; import { bgmName } from "./bgm-name"; import { biome } from "./biome"; @@ -31,8 +34,10 @@ import { move } from "./move"; import { nature } from "./nature"; import { pokeball } from "./pokeball"; import { pokemon } from "./pokemon"; +import { pokemonForm } from "./pokemon-form"; import { pokemonInfo } from "./pokemon-info"; import { pokemonInfoContainer } from "./pokemon-info-container"; +import { pokemonSummary } from "./pokemon-summary"; import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler"; import { splashMessages } from "./splash-messages"; import { starterSelectUiHandler } from "./starter-select-ui-handler"; @@ -49,8 +54,11 @@ import { modifierSelectUiHandler } from "./modifier-select-ui-handler"; export const zhCnConfig = { ability: ability, abilityTriggers: abilityTriggers, + arenaFlyout: arenaFlyout, battle: battle, + battleInfo: battleInfo, battleMessageUiHandler: battleMessageUiHandler, + battlerTags: battlerTags, berry: berry, bgmName: bgmName, biome: biome, @@ -80,8 +88,10 @@ export const zhCnConfig = { nature: nature, pokeball: pokeball, pokemon: pokemon, + pokemonForm: pokemonForm, pokemonInfo: pokemonInfo, pokemonInfoContainer: pokemonInfoContainer, + pokemonSummary: pokemonSummary, saveSlotSelectUiHandler: saveSlotSelectUiHandler, settings: settings, splashMessages: splashMessages, diff --git a/src/locales/zh_CN/menu-ui-handler.ts b/src/locales/zh_CN/menu-ui-handler.ts index 71d79472a45..461f5bb9956 100644 --- a/src/locales/zh_CN/menu-ui-handler.ts +++ b/src/locales/zh_CN/menu-ui-handler.ts @@ -18,6 +18,10 @@ export const menuUiHandler: SimpleTranslationEntries = { "exportSlotSelect": "选择要导出的存档位。", "importData": "导入数据", "exportData": "导出数据", + "linkDiscord": "Link Discord", + "unlinkDiscord": "Unlink Discord", + "linkGoogle": "Link Google", + "unlinkGoogle": "Unlink Google", "cancel": "取消", "losingProgressionWarning": "你将失去自战斗开始以来的所有进度。\n是否继续?", "noEggs": "当前没有任何蛋\n正在孵化中!" diff --git a/src/locales/zh_CN/menu.ts b/src/locales/zh_CN/menu.ts index 92a9d1bfbf4..4ff4ffc3128 100644 --- a/src/locales/zh_CN/menu.ts +++ b/src/locales/zh_CN/menu.ts @@ -17,6 +17,7 @@ export const menu: SimpleTranslationEntries = { "username": "用户名", "password": "密码", "login": "登录", + "Or use": "Or use", "register": "注册", "emptyUsername": "用户名不能为空", "invalidLoginUsername": "输入的用户名无效", @@ -53,5 +54,9 @@ export const menu: SimpleTranslationEntries = { "no": "否", "disclaimer": "免责声明", "disclaimerDescription": "这个游戏尚未完成; 可能存在游戏性问题(包括潜在的丢档风险)、\n 不经通知的调整、 未来可能会更新或完成更多内容", + "choosePokemon": "选择一只宝可梦。", + "renamePokemon": "给宝可梦起名", + "rename": "起名", + "nickname": "昵称", "errorServerDown": "糟糕!访问服务器时发生了错误。\n\n你可以保持页面开启,\n游戏会自动重新连接。", } as const; diff --git a/src/locales/zh_CN/modifier-type.ts b/src/locales/zh_CN/modifier-type.ts index 539062875f1..fcdaf9e8d9f 100644 --- a/src/locales/zh_CN/modifier-type.ts +++ b/src/locales/zh_CN/modifier-type.ts @@ -58,10 +58,10 @@ export const modifierType: ModifierTypeTranslationEntries = { description: "一只宝可梦的{{moveType}}系招式威力提升20%。", }, "PokemonLevelIncrementModifierType": { - description: "一只宝可梦等级提升1级。", + description: "使一只宝可梦的等级提升{{levels}}级。", }, "AllPokemonLevelIncrementModifierType": { - description: "所有成员宝可梦等级提升1级。", + description: "使一只寶可夢的等級提升{{levels}}級。", }, "PokemonBaseStatBoosterModifierType": { description: "增加10%持有者的{{statName}},\n个体值越高堆叠上限越高。", @@ -153,6 +153,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "REVIVER_SEED": { name: "复活种子", description: "受到技能攻击伤害濒死时,\n恢复该宝可梦的HP至1/2。" }, + "WHITE_HERB": { name: "White Herb", description: "An item to be held by a Pokémon. It will restore any lowered stat in battle." }, + "ETHER": { name: "PP单项小补剂" }, "MAX_ETHER": { name: "PP单项全补剂" }, @@ -182,6 +184,9 @@ export const modifierType: ModifierTypeTranslationEntries = { "SOOTHE_BELL": { name: "安抚之铃" }, + "SCOPE_LENS": { name: "焦点镜", description: "能看见弱点的镜片。携带它的宝可梦的招式 会变得容易击中要害。" }, + "LEEK": { name: "大葱", description: "非常长且坚硬的茎。让大葱鸭携带后,\n招式会变得容易击中要害。" }, + "EVIOLITE": { name: "进化奇石", description: "携带后,还能进化的宝可梦的\n防御和特防就会提高。" }, "SOUL_DEW": { name: "心之水滴", description: "增加10%宝可梦性格对数值的影响 (加算)。" }, diff --git a/src/locales/zh_CN/modifier.ts b/src/locales/zh_CN/modifier.ts index fabd17465b2..458931ed9b5 100644 --- a/src/locales/zh_CN/modifier.ts +++ b/src/locales/zh_CN/modifier.ts @@ -5,6 +5,7 @@ export const modifier: SimpleTranslationEntries = { "turnHealApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回复了体力!", "hitHealApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回复了体力!", "pokemonInstantReviveApply": "{{pokemonNameWithAffix}}用{{typeName}}\n恢复了活力!", + "pokemonResetNegativeStatStageApply": "{{pokemonNameWithAffix}}'s lowered stats were restored\nby its {{typeName}}!", "moneyInterestApply": "用{{typeName}}\n获得了 ₽{{moneyAmount}} 利息!", "turnHeldItemTransferApply": "{{pokemonNameWithAffix}}的{{itemName}}被\n{{pokemonName}}的{{typeName}}吸收了!", "contactHeldItemTransferApply": "{{pokemonNameWithAffix}}的{{itemName}}被\n{{pokemonName}}的{{typeName}}夺取了!", diff --git a/src/locales/zh_CN/move.ts b/src/locales/zh_CN/move.ts index 6513f3bcfc7..0c022559329 100644 --- a/src/locales/zh_CN/move.ts +++ b/src/locales/zh_CN/move.ts @@ -2975,7 +2975,7 @@ export const move: MoveTranslationEntries = { }, "dynamaxCannon": { name: "极巨炮", - effect: "将凝缩在体内的能量从核心放出进行攻击", + effect: "将凝缩在体内的能量从核心放出进行攻击,\n对手等级比当前波次的等级上限越高,造成的伤害越高,最多两倍。", }, "snipeShot": { name: "狙击", diff --git a/src/locales/zh_CN/party-ui-handler.ts b/src/locales/zh_CN/party-ui-handler.ts index 4cb2f816b2e..7d70ddd1503 100644 --- a/src/locales/zh_CN/party-ui-handler.ts +++ b/src/locales/zh_CN/party-ui-handler.ts @@ -16,6 +16,7 @@ export const partyUiHandler: SimpleTranslationEntries = { "PASS_BATON": "接棒", "UNPAUSE_EVOLUTION": "解除进化暂停", "REVIVE": "复活", + "RENAME": "起名", "choosePokemon": "选择一只宝可梦。", "doWhatWithThisPokemon": "要对宝可梦做什么?", diff --git a/src/locales/zh_CN/pokemon-form.ts b/src/locales/zh_CN/pokemon-form.ts new file mode 100644 index 00000000000..b8135cc78f1 --- /dev/null +++ b/src/locales/zh_CN/pokemon-form.ts @@ -0,0 +1,190 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const pokemonForm: SimpleTranslationEntries = { + // Battle forms + "mega": "Mega {{pokemonName}}", + "mega-x": "Mega {{pokemonName}} X", + "mega-y": "Mega {{pokemonName}} Y", + "primal": "原始回归{{pokemonName}}", + "gigantamax": "超极巨{{pokemonName}}", + "eternamax": "无极巨{{pokemonName}}", + + // Starters forms + // 1G + "pikachuCosplay": "服装", + "pikachuCoolCosplay": "摇滚巨星", + "pikachuBeautyCosplay": "贵妇", + "pikachuCuteCosplay": "流行偶像", + "pikachuSmartCosplay": "博士", + "pikachuToughCosplay": "面罩摔跤手", + "pikachuPartner": "搭档", + "eeveePartner": "搭档", + // 2G + "pichuSpiky": "刺刺耳", + "unownA": "A", + "unownB": "B", + "unownC": "C", + "unownD": "D", + "unownE": "E", + "unownF": "F", + "unownG": "G", + "unownH": "H", + "unownI": "I", + "unownJ": "J", + "unownK": "K", + "unownL": "L", + "unownM": "M", + "unownN": "N", + "unownO": "O", + "unownP": "P", + "unownQ": "Q", + "unownR": "R", + "unownS": "S", + "unownT": "T", + "unownU": "U", + "unownV": "V", + "unownW": "W", + "unownX": "X", + "unownY": "Y", + "unownZ": "Z", + "unownExclamation": "!", + "unownQuestion": "?", + // 3G + "castformSunny": "晴天", + "castformRainy": "雨天", + "castformSnowy": "雪天", + "deoxysNormal": "Normal", + // 4G + "burmyPlant": "草木蓑衣", + "burmySandy": "砂土蓑衣", + "burmyTrash": "垃圾蓑衣", + "shellosEast": "东海", + "shellosWest": "西海", + "rotomHeat": "加热", + "rotomWash": "清洗", + "rotomFrost": "结冰", + "rotomFan": "旋转", + "rotomMow": "切割", + "giratinaAltered": "Altered", + "shayminLand": "Land", + // 5G + "basculinRedStriped": "红条纹", + "basculinBlueStriped": "蓝条纹", + "basculinWhiteStriped": "白条纹", + "deerlingSpring": "春天", + "deerlingSummer": "夏天", + "deerlingAutumn": "秋天", + "deerlingWinter": "冬天", + "tornadusIncarnate": "Incarnate", + "thundurusIncarnate": "Incarnate", + "landorusIncarnate": "Incarnate", + "keldeoOrdinary": "Ordinary", + "meloettaAria": "Aria", + // 6G + "froakieBattleBond": "牵绊变身", + "scatterbugMeadow": "花园花纹", + "scatterbugIcySnow": "冰雪花纹", + "scatterbugPolar": "雪国花纹", + "scatterbugTundra": "雪原花纹", + "scatterbugContinental": "大陆花纹", + "scatterbugGarden": "庭园花纹", + "scatterbugElegant": "高雅花纹", + "scatterbugModern": "摩登花纹", + "scatterbugMarine": "大海花纹", + "scatterbugArchipelago": "群岛花纹", + "scatterbugHighPlains": "荒野花纹", + "scatterbugSandstorm": "沙尘花纹", + "scatterbugRiver": "大河花纹", + "scatterbugMonsoon": "骤雨花纹", + "scatterbugSavanna": "热带草原花纹", + "scatterbugSun": "太阳花纹", + "scatterbugOcean": "大洋花纹", + "scatterbugJungle": "热带雨林花纹", + "scatterbugFancy": "幻彩花纹", + "scatterbugPokeBall": "球球花纹", + "flabebeRed": "红花", + "flabebeYellow": "黄花", + "flabebeOrange": "橙花", + "flabebeBlue": "蓝花", + "flabebeWhite": "白花", + "furfrouHeart": "心形造型", + "furfrouStar": "星形造型", + "furfrouDiamond": "菱形造型", + "furfrouDebutante": "淑女造型", + "furfrouMatron": "贵妇造型", + "furfrouDandy": "绅士造型", + "furfrouLaReine": "女王造型", + "furfrouKabuki": "歌舞伎造型", + "furfrouPharaoh": "国王造型", + "pumpkabooSmall": "小尺寸", + "pumpkabooLarge": "大尺寸", + "pumpkabooSuper": "特大尺寸", + "xerneasNeutral": "放松模式", + "xerneasActive": "活跃模式", + "zygarde50": "50%形态", + "zygarde10": "10%形态", + "zygarde50Pc": "50%形态 群聚变形", + "zygarde10Pc": "10%形态 群聚变形", + "zygardeComplete": "完全体形态", + // 7G + "oricorioBaile": "热辣热辣风格", + "oricorioPompom": "啪滋啪滋风格", + "oricorioPau": "呼拉呼拉风格", + "oricorioSensu": "轻盈轻盈风格", + "rockruffOwnTempo": "特殊岩狗狗", + "miniorRedMeteor": "红色核心", + "miniorOrangeMeteor": "橙色核心", + "miniorYellowMeteor": "黄色核心", + "miniorGreenMeteor": "绿色核心", + "miniorBlueMeteor": "浅蓝色核心", + "miniorIndigoMeteor": "蓝色核心", + "miniorVioletMeteor": "紫色核心", + "miniorRed": "红色", + "miniorOrange": "橙色", + "miniorYellow": "黄色", + "miniorGreen": "绿色", + "miniorBlue": "浅蓝色", + "miniorIndigo": "蓝色", + "miniorViolet": "紫色", + "mimikyuDisguised": "化形", + "mimikyuBusted": "现形", + "magearnaOriginal": "500年前的颜色", + "marshadowZenith": "全力", + // 8G + "sinisteaPhony": "赝品", + "sinisteaAntique": "真品", + "eiscueNoIce": "解冻头", + "indeedeeMale": "雄性", + "indeedeeFemale": "雌性", + "morpekoFullBelly": "Full Belly", + "zacianHeroOfManyBattles": "Hero Of Many Battles", + "zamazentaHeroOfManyBattles": "Hero Of Many Battles", + "zarudeDada": "老爹", + "enamorusIncarnate": "Incarnate", + // 9G + "squawkabillyGreenPlumage": "绿羽毛", + "squawkabillyBluePlumage": "蓝羽毛", + "squawkabillyYellowPlumage": "黄羽毛", + "squawkabillyWhitePlumage": "白羽毛", + "tatsugiriCurly": "上弓姿势", + "tatsugiriDroopy": "下垂姿势", + "tatsugiriStretchy": "平挺姿势", + "gimmighoulChest": "宝箱形态", + "gimmighoulRoaming": "徒步形态", + "koraidonApexBuild": "Apex Build", + "koraidonLimitedBuild":"Limited Build", + "koraidonSprintingBuild":"Sprinting Build", + "koraidonSwimmingBuild":"Swimming Build", + "koraidonGlidingBuild":"Gliding Build", + "miraidonUltimateMode":"Ultimate Mode", + "miraidonLowPowerMode":"Low Power Mode", + "miraidonDriveMode":"Drive Mode", + "miraidonAquaticMode":"Aquatic Mode", + "miraidonGlideMode":"Glide Mode", + "poltchageistCounterfeit": "冒牌货", + "poltchageistArtisan": "高档货", + "paldeaTaurosCombat": "斗战种", + "paldeaTaurosBlaze": "火炽种", + "paldeaTaurosAqua": "水澜种", + +} as const; diff --git a/src/locales/zh_CN/pokemon-summary.ts b/src/locales/zh_CN/pokemon-summary.ts new file mode 100644 index 00000000000..24f0fbeed97 --- /dev/null +++ b/src/locales/zh_CN/pokemon-summary.ts @@ -0,0 +1,19 @@ +import { TranslationEntries } from "#app/interfaces/locales"; + +export const pokemonSummary: TranslationEntries = { + "pokemonInfo": "宝可梦信息", + "status": "状态", + "powerAccuracyCategory": "威力\n命中率\n类别", + "type": "属性", + "unknownTrainer": "未知", + "ot": "训练师", + "nature": "性格", + "expPoints": "经验值", + "nextLv": "下一级", + "cancel": "取消", + + "memoString": "{{natureFragment}} 性格,\n{{metFragment}}", + "metFragment": { + "apparently": "命中注定般地相遇于Lv.{{level}},\n{{biome}}。", + }, +} as const; diff --git a/src/locales/zh_CN/settings.ts b/src/locales/zh_CN/settings.ts index 3ca6cb435c6..92372deec42 100644 --- a/src/locales/zh_CN/settings.ts +++ b/src/locales/zh_CN/settings.ts @@ -96,4 +96,5 @@ export const settings: SimpleTranslationEntries = { "controller": "控制器", "gamepadSupport": "手柄支持", "showBgmBar": "显示音乐名称", + "shopOverlayOpacity": "商店显示不透明度" } as const; diff --git a/src/locales/zh_CN/splash-messages.ts b/src/locales/zh_CN/splash-messages.ts index 35551cf1163..01efb45cd5a 100644 --- a/src/locales/zh_CN/splash-messages.ts +++ b/src/locales/zh_CN/splash-messages.ts @@ -34,4 +34,5 @@ export const splashMessages: SimpleTranslationEntries = { "alsoTryRadicalRed": "也玩玩看激进红!", "eeveeExpo": "伊布博览会!", "ynoproject": "Yume Nikki 页游项目!", + "breedersInSpace": "饲养员也能上太空?", } as const; diff --git a/src/locales/zh_CN/starter-select-ui-handler.ts b/src/locales/zh_CN/starter-select-ui-handler.ts index 059358078f4..c23ceb66eb0 100644 --- a/src/locales/zh_CN/starter-select-ui-handler.ts +++ b/src/locales/zh_CN/starter-select-ui-handler.ts @@ -6,7 +6,8 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; * account interactions, descriptive text, etc. */ export const starterSelectUiHandler: SimpleTranslationEntries = { - "confirmStartTeam":"使用这些宝可梦开始游戏吗?", + "confirmStartTeam": "使用这些宝可梦开始游戏吗?", + "invalidParty": "This is not a valid starting party!", "gen1": "I", "gen2": "II", "gen3": "III", diff --git a/src/locales/zh_TW/ability-trigger.ts b/src/locales/zh_TW/ability-trigger.ts index c436e5021f7..c0b253933ca 100644 --- a/src/locales/zh_TW/ability-trigger.ts +++ b/src/locales/zh_TW/ability-trigger.ts @@ -5,7 +5,58 @@ export const abilityTriggers: SimpleTranslationEntries = { "badDreams": "{{pokemonName}} 被折磨着!", "costar": "{{pokemonName}} 複製了 {{allyName}} 的\n能力變化!", "iceFaceAvoidedDamage": "{{pokemonName}} 因爲 {{abilityName}}\n避免了傷害!", + "perishBody": "{{pokemonName}}'s {{abilityName}}\nwill faint both pokemon in 3 turns!", + "poisonHeal": "{{pokemonName}}'s {{abilityName}}\nrestored its HP a little!", "trace": "{{pokemonName}} 複製了 {{targetName}} 的\n{{abilityName}}!", "windPowerCharged": "受 {{moveName}} 的影響, {{pokemonName}} 提升了能力!", "quickDraw":"{{pokemonName}} can act faster than normal, thanks to its Quick Draw!", + "blockItemTheft": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents item theft!", + "typeImmunityHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!", + "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} avoided damage\nwith {{abilityName}}!", + "postDefendDisguise": "{{pokemonNameWithAffix}}'s disguise was busted!", + "moveImmunity": "It doesn't affect {{pokemonNameWithAffix}}!", + "reverseDrain": "{{pokemonNameWithAffix}} sucked up the liquid ooze!", + "postDefendTypeChange": "{{pokemonNameWithAffix}}'s {{abilityName}}\nmade it the {{typeName}} type!", + "postDefendContactDamage": "{{pokemonNameWithAffix}}'s {{abilityName}}\nhurt its attacker!", + "postDefendAbilitySwap": "{{pokemonNameWithAffix}} swapped\nabilities with its target!", + "postDefendAbilityGive": "{{pokemonNameWithAffix}} gave its target\n{{abilityName}}!", + "postDefendMoveDisable": "{{pokemonNameWithAffix}}'s {{moveName}}\nwas disabled!", + "pokemonTypeChange": "{{pokemonNameWithAffix}} transformed into the {{moveType}} type!", + "postAttackStealHeldItem": "{{pokemonNameWithAffix}} stole\n{{defenderName}}'s {{stolenItemType}}!", + "postDefendStealHeldItem": "{{pokemonNameWithAffix}} stole\n{{attackerName}}'s {{stolenItemType}}!", + "copyFaintedAllyAbility": "{{pokemonNameWithAffix}}'s {{abilityName}} was taken over!", + "intimidateImmunity": "{{pokemonNameWithAffix}}'s {{abilityName}} prevented it from being Intimidated!", + "postSummonAllyHeal": "{{pokemonNameWithAffix}} drank down all the\nmatcha that {{pokemonName}} made!", + "postSummonClearAllyStats": "{{pokemonNameWithAffix}}'s stat changes\nwere removed!", + "postSummonTransform": "{{pokemonNameWithAffix}} transformed\ninto {{targetName}}!", + "protectStat": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents lowering its {{statName}}!", + "statusEffectImmunityWithName": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents {{statusEffectName}}!", + "statusEffectImmunity": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents status problems!", + "battlerTagImmunity": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents {{battlerTagName}}!", + "forewarn": "{{pokemonNameWithAffix}} was forewarned about {{moveName}}!", + "frisk": "{{pokemonNameWithAffix}} frisked {{opponentName}}'s {{opponentAbilityName}}!", + "postWeatherLapseHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!", + "postWeatherLapseDamage": "{{pokemonNameWithAffix}} is hurt\nby its {{abilityName}}!", + "postTurnLootCreateEatenBerry": "{{pokemonNameWithAffix}} harvested one {{berryName}}!", + "postTurnHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!", + "fetchBall": "{{pokemonNameWithAffix}} found a\n{{pokeballName}}!", + "healFromBerryUse": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP!", + "arenaTrap": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents switching!", + "postBattleLoot": "{{pokemonNameWithAffix}} picked up\n{{itemName}}!", + "postFaintContactDamage": "{{pokemonNameWithAffix}}'s {{abilityName}}\nhurt its attacker!", + "postFaintHpDamage": "{{pokemonNameWithAffix}}'s {{abilityName}}\nhurt its attacker!", + "postSummonPressure": "{{pokemonNameWithAffix}} is exerting its Pressure!", + "postSummonMoldBreaker": "{{pokemonNameWithAffix}} breaks the mold!", + "postSummonAnticipation": "{{pokemonNameWithAffix}} shuddered!", + "postSummonTurboblaze": "{{pokemonNameWithAffix}} is radiating a blazing aura!", + "postSummonTeravolt": "{{pokemonNameWithAffix}} is radiating a bursting aura!", + "postSummonDarkAura": "{{pokemonNameWithAffix}} is radiating a Dark Aura!", + "postSummonFairyAura": "{{pokemonNameWithAffix}} is radiating a Fairy Aura!", + "postSummonNeutralizingGas": "{{pokemonNameWithAffix}}'s Neutralizing Gas filled the area!", + "postSummonAsOneGlastrier": "{{pokemonNameWithAffix}} has two Abilities!", + "postSummonAsOneSpectrier": "{{pokemonNameWithAffix}} has two Abilities!", + "postSummonVesselOfRuin": "{{pokemonNameWithAffix}}'s Vessel of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", + "postSummonSwordOfRuin": "{{pokemonNameWithAffix}}'s Sword of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", + "postSummonTabletsOfRuin": "{{pokemonNameWithAffix}}'s Tablets of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", + "postSummonBeadsOfRuin": "{{pokemonNameWithAffix}}'s Beads of Ruin lowered the {{statName}}\nof all surrounding Pokémon!", } as const; diff --git a/src/locales/zh_TW/arena-flyout.ts b/src/locales/zh_TW/arena-flyout.ts new file mode 100644 index 00000000000..8a31d37b10c --- /dev/null +++ b/src/locales/zh_TW/arena-flyout.ts @@ -0,0 +1,49 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const arenaFlyout: SimpleTranslationEntries = { + // Title + "activeBattleEffects": "Active Battle Effects", + "player": "Player", + "neutral": "Neutral", + "enemy": "Enemy", + + // WeatherType + "sunny": "Sunny", + "rain": "Rain", + "sandstorm": "Sandstorm", + "hail": "Hail", + "snow": "Snow", + "fog": "Fog", + "heavyRain": "Heavy Rain", + "harshSun": "Harsh Sun", + "strongWinds": "Strong Winds", + + // TerrainType + "misty": "Misty Terrain", + "electric": "Electric Terrain", + "grassy": "Grassy Terrain", + "psychic": "Psychic Terrain", + + // ArenaTagType + "mudSport": "Mud Sport", + "waterSport": "Water Sport", + "spikes": "Spikes", + "toxicSpikes": "Toxic Spikes", + "mist": "Mist", + "futureSight": "Future Sight", + "doomDesire": "Doom Desire", + "wish": "Wish", + "stealthRock": "Stealth Rock", + "stickyWeb": "Sticky Web", + "trickRoom": "Trick Room", + "gravity": "Gravity", + "reflect": "Reflect", + "lightScreen": "Light Screen", + "auroraVeil": "Aurora Veil", + "quickGuard": "Quick Guard", + "wideGuard": "Wide Guard", + "matBlock": "Mat Block", + "craftyShield": "Crafty Shield", + "tailwind": "Tailwind", + "happyHour": "Happy Hour", +}; diff --git a/src/locales/zh_TW/battle-info.ts b/src/locales/zh_TW/battle-info.ts new file mode 100644 index 00000000000..684ce4bc26a --- /dev/null +++ b/src/locales/zh_TW/battle-info.ts @@ -0,0 +1,5 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battleInfo: SimpleTranslationEntries = { + "generation": "第{{generation}}世代", +} as const; diff --git a/src/locales/zh_TW/battle.ts b/src/locales/zh_TW/battle.ts index bc7b712185a..4673474d313 100644 --- a/src/locales/zh_TW/battle.ts +++ b/src/locales/zh_TW/battle.ts @@ -54,6 +54,8 @@ export const battle: SimpleTranslationEntries = { "escapeVerbSwitch": "切換", "escapeVerbFlee": "逃跑", "stealEatBerry": "{{pokemonName}} stole and ate\n{{targetName}}'s {{berryName}}!", + "ppHealBerry": "{{pokemonNameWithAffix}}用{{berryName}}\n回復了{{moveName}}的PP!", + "hpHealBerry": "{{pokemonNameWithAffix}}用{{berryName}}\n回復了體力!", "notDisabled": "{{moveName}} 不再被禁用!", "turnEndHpRestore": "{{pokemonName}}'s HP was restored.", "hpIsFull": "{{pokemonName}}'s\nHP is full!", @@ -66,15 +68,22 @@ export const battle: SimpleTranslationEntries = { "drainMessage": "{{pokemonName}} 吸取了體力!", "regainHealth": "{{pokemonName}} 回復了體力!", "fainted": "{{pokemonNameWithAffix}} 倒下了!", - "statRose": "{{pokemonNameWithAffix}} 的 {{stats}} 提高了!", - "statSharplyRose": "{{pokemonNameWithAffix}} 的 {{stats}} 大幅提高了!", - "statRoseDrastically": "{{pokemonNameWithAffix}} 的 {{stats}} 極大幅提高了!", - "statWontGoAnyHigher": "{{pokemonNameWithAffix}} 的 {{stats}} 已經無法再提高了!", - "statFell": "{{pokemonNameWithAffix}} 的 {{stats}} 降低了!", - "statHarshlyFell": "{{pokemonNameWithAffix}} 的 {{stats}} 大幅降低了!", - "statSeverelyFell": "{{pokemonNameWithAffix}} 的 {{stats}} 極大幅降低了!", - "statWontGoAnyLower": "{{pokemonNameWithAffix}} 的 {{stats}} 已經無法再降低了!", + "statsAnd": "and", + "stats": "Stats", + "statRose_other": "{{pokemonNameWithAffix}}'s {{stats}} rose!", + "statSharplyRose_other": "{{pokemonNameWithAffix}}'s {{stats}} sharply rose!", + "statRoseDrastically_other": "{{pokemonNameWithAffix}}'s {{stats}} rose drastically!", + "statWontGoAnyHigher_other": "{{pokemonNameWithAffix}}'s {{stats}} won't go any higher!", + "statFell_other": "{{pokemonNameWithAffix}}'s {{stats}} fell!", + "statHarshlyFell_other": "{{pokemonNameWithAffix}}'s {{stats}} harshly fell!", + "statSeverelyFell_other": "{{pokemonNameWithAffix}}'s {{stats}} severely fell!", + "statWontGoAnyLower_other": "{{pokemonNameWithAffix}}'s {{stats}} won't go any lower!", + "transformedIntoType": "{{pokemonName}} transformed\ninto the {{type}} type!", "ppReduced": "降低了 {{targetName}} 的\n{{moveName}} 的PP{{reduction}}點!", + "retryBattle": "Would you like to retry from the start of the battle?", + "unlockedSomething": "{{unlockedThing}}\nhas been unlocked.", + "congratulations": "Congratulations!", + "beatModeFirstTime": "{{speciesName}} beat {{gameMode}} Mode for the first time!\nYou received {{newModifier}}!", "battlerTagsRechargingLapse": "{{pokemonNameWithAffix}}因攻擊的反作用力而無法動彈!", "battlerTagsTrappedOnAdd": "{{pokemonNameWithAffix}}不能逃跑!", "battlerTagsTrappedOnRemove": "{{pokemonNameWithAffix}}擺脫了{{moveName}}!", @@ -121,15 +130,19 @@ export const battle: SimpleTranslationEntries = { "battlerTagsEnduringLapse": "{{pokemonNameWithAffix}}挺住了攻擊!", "battlerTagsSturdyLapse": "{{pokemonNameWithAffix}}挺住了攻擊!", "battlerTagsPerishSongLapse": "{{pokemonNameWithAffix}} 的滅亡計時變成{{turnCount}}了!", + "battlerTagsCenterOfAttentionOnAdd": "{{pokemonNameWithAffix}}\n變得萬眾矚目了!", "battlerTagsTruantLapse": "{{pokemonNameWithAffix}}正在偷懶!", "battlerTagsSlowStartOnAdd": "{{pokemonNameWithAffix}}無法拿出平時的水平!", "battlerTagsSlowStartOnRemove": "{{pokemonNameWithAffix}}恢復了平時的水平!", "battlerTagsHighestStatBoostOnAdd": "{{pokemonNameWithAffix}}的{{statName}}升高了!", "battlerTagsHighestStatBoostOnRemove": "{{pokemonNameWithAffix}}的{{abilityName}}效果解除了!", + "battlerTagsMagnetRisenOnAdd": "{{pokemonNameWithAffix}}\n因電磁力浮了起來!", + "battlerTagsMagnetRisenOnRemove": "{{pokemonNameWithAffix}}的\n電磁力消失了!", "battlerTagsCritBoostOnAdd": "{{pokemonNameWithAffix}}現在幹勁十足!", "battlerTagsCritBoostOnRemove": "{{pokemonNameWithAffix}}如釋重負似地放鬆了下來。", "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} 陷入了鹽腌狀態!", "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} 受到了{{moveName}}的傷害!", "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}}削減了自己的體力,並詛咒了{{pokemonName}}!", "battlerTagsCursedLapse": "{{pokemonNameWithAffix}}正受到詛咒!", + "battlerTagsStockpilingOnAdd": "{{pokemonNameWithAffix}} stockpiled {{stockpiledCount}}!" } as const; diff --git a/src/locales/zh_TW/battler-tags.ts b/src/locales/zh_TW/battler-tags.ts new file mode 100644 index 00000000000..73747e51f61 --- /dev/null +++ b/src/locales/zh_TW/battler-tags.ts @@ -0,0 +1,12 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const battlerTags: SimpleTranslationEntries = { + "trappedDesc": "束縛", + "flinchedDesc": "畏縮", + "confusedDesc": "混亂", + "infatuatedDesc": "著迷", + "seedDesc": "寄生種子", + "nightmareDesc": "惡夢", + "ingrainDesc": "扎根", + "drowsyDesc": "瞌睡", +} as const; diff --git a/src/locales/zh_TW/bgm-name.ts b/src/locales/zh_TW/bgm-name.ts index 87d90dabc9d..01fb86b281d 100644 --- a/src/locales/zh_TW/bgm-name.ts +++ b/src/locales/zh_TW/bgm-name.ts @@ -110,9 +110,9 @@ export const bgmName: SimpleTranslationEntries = { "plains": "PMD EoS Sky Peak Prairie", "power_plant": "PMD EoS Far Amp Plains", "ruins": "PMD EoS Deep Sealed Ruin", - "sea": "PMD EoS Brine Cave", + "sea": "Andr06 - Marine Mystique", // Name defined by the composer "seabed": "Firel - Seabed", // The composer thinks about a more creative name - "slum": "PMD EoS Sky Peak Coast", + "slum": "Andr06 - Sneaky Snom", // Name defined by the composer "snowy_forest": "PMD EoS Sky Peak Snowfield", "space": "Firel - Aether", "swamp": "PMD EoS Surrounded Sea", diff --git a/src/locales/zh_TW/config.ts b/src/locales/zh_TW/config.ts index f19a6941a88..63887a1f3e3 100644 --- a/src/locales/zh_TW/config.ts +++ b/src/locales/zh_TW/config.ts @@ -1,8 +1,11 @@ import { ability } from "./ability"; import { abilityTriggers } from "./ability-trigger"; +import { arenaFlyout } from "./arena-flyout"; import { PGFachv, PGMachv } from "./achv"; import { battle } from "./battle"; +import { battleInfo } from "./battle-info"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; +import { battlerTags } from "./battler-tags"; import { berry } from "./berry"; import { bgmName } from "./bgm-name"; import { biome } from "./biome"; @@ -31,8 +34,10 @@ import { move } from "./move"; import { nature } from "./nature"; import { pokeball } from "./pokeball"; import { pokemon } from "./pokemon"; +import { pokemonForm } from "./pokemon-form"; import { pokemonInfo } from "./pokemon-info"; import { pokemonInfoContainer } from "./pokemon-info-container"; +import { pokemonSummary } from "./pokemon-summary"; import { saveSlotSelectUiHandler } from "./save-slot-select-ui-handler"; import { splashMessages } from "./splash-messages"; import { starterSelectUiHandler } from "./starter-select-ui-handler"; @@ -49,8 +54,11 @@ import { modifierSelectUiHandler } from "./modifier-select-ui-handler"; export const zhTwConfig = { ability: ability, abilityTriggers: abilityTriggers, + arenaFlyout: arenaFlyout, battle: battle, + battleInfo: battleInfo, battleMessageUiHandler: battleMessageUiHandler, + battlerTags: battlerTags, berry: berry, bgmName: bgmName, biome: biome, @@ -80,8 +88,10 @@ export const zhTwConfig = { nature: nature, pokeball: pokeball, pokemon: pokemon, + pokemonForm: pokemonForm, pokemonInfo: pokemonInfo, pokemonInfoContainer: pokemonInfoContainer, + pokemonSummary: pokemonSummary, saveSlotSelectUiHandler: saveSlotSelectUiHandler, settings: settings, splashMessages: splashMessages, diff --git a/src/locales/zh_TW/menu-ui-handler.ts b/src/locales/zh_TW/menu-ui-handler.ts index 21ba10ba30e..e3675b0571e 100644 --- a/src/locales/zh_TW/menu-ui-handler.ts +++ b/src/locales/zh_TW/menu-ui-handler.ts @@ -18,6 +18,10 @@ export const menuUiHandler: SimpleTranslationEntries = { "exportSlotSelect": "選擇要導出的存檔位。", "importData": "導入數據", "exportData": "導出數據", + "linkDiscord": "Link Discord", + "unlinkDiscord": "Unlink Discord", + "linkGoogle": "Link Google", + "unlinkGoogle": "Unlink Google", "cancel": "取消", "losingProgressionWarning": "你將失去自戰鬥開始以來的所有進度。是否\n繼續?", "noEggs": "You are not hatching\nany eggs at the moment!" diff --git a/src/locales/zh_TW/menu.ts b/src/locales/zh_TW/menu.ts index 564c20d5791..d46f3f172de 100644 --- a/src/locales/zh_TW/menu.ts +++ b/src/locales/zh_TW/menu.ts @@ -17,6 +17,7 @@ export const menu: SimpleTranslationEntries = { "username": "用戶名", "password": "密碼", "login": "登入", + "orUse": "Or use", "register": "注冊", "emptyUsername": "用戶名不能為空", "invalidLoginUsername": "提供的用戶名無效", @@ -53,5 +54,9 @@ export const menu: SimpleTranslationEntries = { "no":"否", "disclaimer": "DISCLAIMER", "disclaimerDescription": "This game is an unfinished product; it might have playability issues (including the potential loss of save data),\n change without notice, and may or may not be updated further or completed.", + "choosePokemon": "Choose a Pokémon.", + "renamePokemon": "Rename Pokémon", + "rename": "Rename", + "nickname": "Nickname", "errorServerDown": "Oops! There was an issue contacting the server.\n\nYou may leave this window open,\nthe game will automatically reconnect.", } as const; diff --git a/src/locales/zh_TW/modifier-type.ts b/src/locales/zh_TW/modifier-type.ts index bf2032a7feb..3d56deca3d7 100644 --- a/src/locales/zh_TW/modifier-type.ts +++ b/src/locales/zh_TW/modifier-type.ts @@ -59,10 +59,10 @@ export const modifierType: ModifierTypeTranslationEntries = { description: "一隻寶可夢的{{moveType}}系招式威力提升20%。", }, PokemonLevelIncrementModifierType: { - description: "一隻寶可夢等級提升1級。", + description: "Increases a Pokémon's level by {{levels}}.", }, AllPokemonLevelIncrementModifierType: { - description: "所有成員寶可夢等級提升1級。", + description: "Increases all party members' level by {{levels}}.", }, PokemonBaseStatBoosterModifierType: { description: @@ -155,6 +155,10 @@ export const modifierType: ModifierTypeTranslationEntries = { name: "復活種子", description: "受到技能攻擊傷害瀕死時,\n恢復該瀕死寶可夢的HP至1/2。", }, + WHITE_HERB: { + name: "White Herb", + description: "An item to be held by a Pokémon. It will restore any lowered stat in battle.", + }, ETHER: { name: "PP單項小補劑" }, MAX_ETHER: { name: "PP單項全補劑" }, ELIXIR: { name: "PP多項小補劑" }, @@ -187,6 +191,14 @@ export const modifierType: ModifierTypeTranslationEntries = { LUCKY_EGG: { name: "幸運蛋" }, GOLDEN_EGG: { name: "金蛋" }, SOOTHE_BELL: { name: "安撫之鈴" }, + SCOPE_LENS: { + name: "焦點鏡", + description: "能看見弱點的鏡片。攜帶它的寶可夢的招式 會變得容易擊中要害。" + }, + LEEK: { + name: "大蔥", + description: "非常長且堅硬的莖。讓大蔥鴨攜帶後,招式會 變得容易擊中要害。" + }, EVIOLITE: { name: "進化奇石", description: "進化的神奇石塊。攜帶後,還能進化的寶可夢的 防禦和特防就會提高。" diff --git a/src/locales/zh_TW/modifier.ts b/src/locales/zh_TW/modifier.ts index 01de87827c0..5174ae68362 100644 --- a/src/locales/zh_TW/modifier.ts +++ b/src/locales/zh_TW/modifier.ts @@ -5,6 +5,7 @@ export const modifier: SimpleTranslationEntries = { "turnHealApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回復了體力!", "hitHealApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回復了體力!", "pokemonInstantReviveApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回復了活力!", + "pokemonResetNegativeStatStageApply": "{{pokemonNameWithAffix}}'s lowered stats were restored\nby its {{typeName}}!", "moneyInterestApply": "用{{typeName}}\n獲得了 ₽{{moneyAmount}} 利息!", "turnHeldItemTransferApply": "{{pokemonNameWithAffix}}的{{itemName}}被\n{{pokemonName}}的{{typeName}}吸收了!", "contactHeldItemTransferApply": "{{pokemonNameWithAffix}}的{{itemName}}被\n{{pokemonName}}的{{typeName}}奪取了!", diff --git a/src/locales/zh_TW/move.ts b/src/locales/zh_TW/move.ts index 0a6321850db..92b70429cfd 100644 --- a/src/locales/zh_TW/move.ts +++ b/src/locales/zh_TW/move.ts @@ -2861,7 +2861,7 @@ export const move: MoveTranslationEntries = { }, dynamaxCannon: { name: "極巨炮", - effect: "將凝縮在體內的能量從核心\n放出進行攻擊", + effect: "將凝縮在體內的能量從核心放出進行攻擊,\n對手等級比當前波次的等級上限越高,造成的傷害越高,最多兩倍。", }, snipeShot: { name: "狙擊", diff --git a/src/locales/zh_TW/party-ui-handler.ts b/src/locales/zh_TW/party-ui-handler.ts index efa9b2c8dab..c981e41af0e 100644 --- a/src/locales/zh_TW/party-ui-handler.ts +++ b/src/locales/zh_TW/party-ui-handler.ts @@ -16,6 +16,7 @@ export const partyUiHandler: SimpleTranslationEntries = { "PASS_BATON": "Pass Baton", "UNPAUSE_EVOLUTION": "Unpause Evolution", "REVIVE": "Revive", + "RENAME": "Rename", "choosePokemon": "Choose a Pokémon.", "doWhatWithThisPokemon": "Do what with this Pokémon?", diff --git a/src/locales/zh_TW/pokemon-form.ts b/src/locales/zh_TW/pokemon-form.ts new file mode 100644 index 00000000000..2ab936b36da --- /dev/null +++ b/src/locales/zh_TW/pokemon-form.ts @@ -0,0 +1,190 @@ +import { SimpleTranslationEntries } from "#app/interfaces/locales"; + +export const pokemonForm: SimpleTranslationEntries = { + // Battle forms + "mega": "Mega {{pokemonName}}", + "mega-x": "Mega {{pokemonName}} X", + "mega-y": "Mega {{pokemonName}} Y", + "primal": "Primal {{pokemonName}}", + "gigantamax": "G-Max {{pokemonName}}", + "eternamax": "E-Max {{pokemonName}}", + + // Starters forms + // 1G + "pikachuCosplay": "Cosplay", + "pikachuCoolCosplay": "Cool Cosplay", + "pikachuBeautyCosplay": "Beauty Cosplay", + "pikachuCuteCosplay": "Cute Cosplay", + "pikachuSmartCosplay": "Smart Cosplay", + "pikachuToughCosplay": "Thoug Cosplay", + "pikachuPartner": "Partner", + "eeveePartner": "Partner", + // 2G + "pichuSpiky": "Spiky", + "unownA": "A", + "unownB": "B", + "unownC": "C", + "unownD": "D", + "unownE": "E", + "unownF": "F", + "unownG": "G", + "unownH": "H", + "unownI": "I", + "unownJ": "J", + "unownK": "K", + "unownL": "L", + "unownM": "M", + "unownN": "N", + "unownO": "O", + "unownP": "P", + "unownQ": "Q", + "unownR": "R", + "unownS": "S", + "unownT": "T", + "unownU": "U", + "unownV": "V", + "unownW": "W", + "unownX": "X", + "unownY": "Y", + "unownZ": "Z", + "unownExclamation": "!", + "unownQuestion": "?", + // 3G + "castformSunny": "Sunny", + "castformRainy": "Rainy", + "castformSnowy": "Snowy", + "deoxysNormal": "Normal", + // 4G + "burmyPlant": "Plant", + "burmySandy": "Sandy", + "burmyTrash": "Trash", + "shellosEast": "East", + "shellosWest": "West", + "rotomHeat": "Heat", + "rotomWash": "Wash", + "rotomFrost": "Frost", + "rotomFan": "Fan", + "rotomMow": "Mow", + "giratinaAltered": "Altered", + "shayminLand": "Land", + // 5G + "basculinRedStriped": "Red Striped", + "basculinBlueStriped": "Blue Striped", + "basculinWhiteStriped": "White Striped", + "deerlingSpring": "Spring", + "deerlingSummer": "Summer", + "deerlingAutumn": "Autumn", + "deerlingWinter": "Winter", + "tornadusIncarnate": "Incarnate", + "thundurusIncarnate": "Incarnate", + "landorusIncarnate": "Incarnate", + "keldeoOrdinary": "Ordinary", + "meloettaAria": "Aria", + // 6G + "froakieBattleBond": "Battle Bond", + "scatterbugMeadow": "Meadow", + "scatterbugIcySnow": "Icy Snow", + "scatterbugPolar": "Polar", + "scatterbugTundra": "Tundra", + "scatterbugContinental": "Continental", + "scatterbugGarden": "Garden", + "scatterbugElegant": "Elegant", + "scatterbugModern": "Modern", + "scatterbugMarine": "Marine", + "scatterbugArchipelago": "Archipelago", + "scatterbugHighPlains": "High Plains", + "scatterbugSandstorm": "Sandstorm", + "scatterbugRiver": "River", + "scatterbugMonsoon": "Monsoon", + "scatterbugSavanna": "Savanna", + "scatterbugSun": "Sun", + "scatterbugOcean": "Ocean", + "scatterbugJungle": "Jungle", + "scatterbugFancy": "Fancy", + "scatterbugPokeBall": "Poké Ball", + "flabebeRed": "Red", + "flabebeYellow": "Yellow", + "flabebeOrange": "Orange", + "flabebeBlue": "Blue", + "flabebeWhite": "White", + "furfrouHeart": "Heart", + "furfrouStar": "Star", + "furfrouDiamond": "Diamond", + "furfrouDebutante": "Debutante", + "furfrouMatron": "Matron", + "furfrouDandy": "Dandy", + "furfrouLaReine": "La Reine", + "furfrouKabuki": "Kabuki", + "furfrouPharaoh": "Pharaoh", + "pumpkabooSmall": "Small", + "pumpkabooLarge": "Large", + "pumpkabooSuper": "Super", + "xerneasNeutral": "Neutral", + "xerneasActive": "Active", + "zygarde50": "50% Forme", + "zygarde10": "10% Forme", + "zygarde50Pc": "50% Forme Power Construct", + "zygarde10Pc": "10% Forme Power Construct", + "zygardeComplete": "Complete Forme", + // 7G + "oricorioBaile": "Baile", + "oricorioPompom": "Pom-Pom", + "oricorioPau": "Pau", + "oricorioSensu": "Sensu", + "rockruffOwnTempo": "Own Tempo", + "miniorRedMeteor": "Red Meteor", + "miniorOrangeMeteor": "Orange Meteor", + "miniorYellowMeteor": "Yellow Meteor", + "miniorGreenMeteor": "Green Meteor", + "miniorBlueMeteor": "Blue Meteor", + "miniorIndigoMeteor": "Indigo Meteor", + "miniorVioletMeteor": "Violet Meteor", + "miniorRed": "Red", + "miniorOrange": "Orange", + "miniorYellow": "Yellow", + "miniorGreen": "Green", + "miniorBlue": "Blue", + "miniorIndigo": "Indigo", + "miniorViolet": "Violet", + "mimikyuDisguised": "Disguised", + "mimikyuBusted": "Busted", + "magearnaOriginal": "Original", + "marshadowZenith": "Zenith", + // 8G + "sinisteaPhony": "Phony", + "sinisteaAntique": "Antique", + "eiscueNoIce": "No Ice", + "indeedeeMale": "Male", + "indeedeeFemale": "Female", + "morpekoFullBelly": "Full Belly", + "zacianHeroOfManyBattles": "Hero Of Many Battles", + "zamazentaHeroOfManyBattles": "Hero Of Many Battles", + "zarudeDada": "Dada", + "enamorusIncarnate": "Incarnate", + // 9G + "squawkabillyGreenPlumage": "Green Plumage", + "squawkabillyBluePlumage": "Blue Plumage", + "squawkabillyYellowPlumage": "Yellow Plumage", + "squawkabillyWhitePlumage": "White Plumage", + "tatsugiriCurly": "Curly", + "tatsugiriDroopy": "Droopy", + "tatsugiriStretchy": "Stretchy", + "gimmighoulChest": "Chest", + "gimmighoulRoaming": "Roaming", + "koraidonApexBuild": "Apex Build", + "koraidonLimitedBuild":"Limited Build", + "koraidonSprintingBuild":"Sprinting Build", + "koraidonSwimmingBuild":"Swimming Build", + "koraidonGlidingBuild":"Gliding Build", + "miraidonUltimateMode":"Ultimate Mode", + "miraidonLowPowerMode":"Low Power Mode", + "miraidonDriveMode":"Drive Mode", + "miraidonAquaticMode":"Aquatic Mode", + "miraidonGlideMode":"Glide Mode", + "poltchageistCounterfeit": "Counterfeit", + "poltchageistArtisan": "Artisan", + "paldeaTaurosCombat": "Combat", + "paldeaTaurosBlaze": "Blaze", + "paldeaTaurosAqua": "Aqua", + +} as const; diff --git a/src/locales/zh_TW/pokemon-summary.ts b/src/locales/zh_TW/pokemon-summary.ts new file mode 100644 index 00000000000..484ea2a9d67 --- /dev/null +++ b/src/locales/zh_TW/pokemon-summary.ts @@ -0,0 +1,20 @@ +import { TranslationEntries } from "#app/interfaces/locales"; + +export const pokemonSummary: TranslationEntries = { + "pokemonInfo": "Pokémon Info", + "status": "Status", + "powerAccuracyCategory": "Power\nAccuracy\nCategory", + "type": "Type", + "unknownTrainer": "Unknown", + "ot": "OT", + "nature": "nature", + "expPoints": "Exp. Points", + "nextLv": "Next Lv.", + "cancel": "Cancel", + + "memoString": "{{natureFragment}} nature,\n{{metFragment}}", + "metFragment": { + "normal": "met at Lv{{level}},\n{{biome}}.", + "apparently": "apparently met at Lv{{level}},\n{{biome}}.", + }, +} as const; diff --git a/src/locales/zh_TW/settings.ts b/src/locales/zh_TW/settings.ts index dcb87fafe35..c6c055ed4d2 100644 --- a/src/locales/zh_TW/settings.ts +++ b/src/locales/zh_TW/settings.ts @@ -96,4 +96,5 @@ export const settings: SimpleTranslationEntries = { "controller": "控制器", "gamepadSupport": "手柄支持", "showBgmBar": "Show Music Names", + "shopOverlayOpacity": "Shop Overlay Opacity" } as const; diff --git a/src/locales/zh_TW/splash-messages.ts b/src/locales/zh_TW/splash-messages.ts index 3fbbea71564..734b7a16064 100644 --- a/src/locales/zh_TW/splash-messages.ts +++ b/src/locales/zh_TW/splash-messages.ts @@ -33,5 +33,6 @@ export const splashMessages: SimpleTranslationEntries = { "alsoTryEmeraldRogue": "也試試翡翠流氓!", "alsoTryRadicalRed": "也試試激進紅!", "eeveeExpo": "伊布博覽會!", - "ynoproject": "YNO專案!" + "ynoproject": "YNO專案!", + "breedersInSpace": "Breeders in space!", } as const; diff --git a/src/locales/zh_TW/starter-select-ui-handler.ts b/src/locales/zh_TW/starter-select-ui-handler.ts index ae9a4083d20..c3b78c8078d 100644 --- a/src/locales/zh_TW/starter-select-ui-handler.ts +++ b/src/locales/zh_TW/starter-select-ui-handler.ts @@ -6,7 +6,8 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; * account interactions, descriptive text, etc. */ export const starterSelectUiHandler: SimpleTranslationEntries = { - "confirmStartTeam":"使用這些寶可夢開始嗎?", + "confirmStartTeam": "使用這些寶可夢開始嗎?", + "invalidParty": "This is not a valid starting party!", "gen1": "I", "gen2": "II", "gen3": "III", diff --git a/src/messages.ts b/src/messages.ts index 5c465cc08e9..2259e78abfc 100644 --- a/src/messages.ts +++ b/src/messages.ts @@ -24,17 +24,17 @@ export function getPokemonNameWithAffix(pokemon: Pokemon): string { return !pokemon.isPlayer() ? pokemon.hasTrainer() ? i18next.t("battle:foePokemonWithAffix", { - pokemonName: pokemon.name, + pokemonName: pokemon.getNameToRender(), }) : i18next.t("battle:wildPokemonWithAffix", { - pokemonName: pokemon.name, + pokemonName: pokemon.getNameToRender(), }) - : pokemon.name; + : pokemon.getNameToRender(); case BattleSpec.FINAL_BOSS: return !pokemon.isPlayer() - ? i18next.t("battle:foePokemonWithAffix", { pokemonName: pokemon.name }) - : pokemon.name; + ? i18next.t("battle:foePokemonWithAffix", { pokemonName: pokemon.getNameToRender() }) + : pokemon.getNameToRender(); default: - return pokemon.name; + return pokemon.getNameToRender(); } } diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 9a8504f16d3..82238ca7220 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -1,5 +1,5 @@ import * as Modifiers from "./modifier"; -import { AttackMove, allMoves } from "../data/move"; +import { AttackMove, allMoves, selfStatLowerMoves } from "../data/move"; import { MAX_PER_TYPE_POKEBALLS, PokeballType, getPokeballCatchMultiplier, getPokeballName } from "../data/pokeball"; import Pokemon, { EnemyPokemon, PlayerPokemon, PokemonMove } from "../field/pokemon"; import { EvolutionItem, pokemonEvolutions } from "../data/pokemon-evolutions"; @@ -15,18 +15,19 @@ import { StatusEffect, getStatusEffectDescriptor } from "../data/status-effect"; import { SpeciesFormKey } from "../data/pokemon-species"; import BattleScene from "../battle-scene"; import { VoucherType, getVoucherTypeIcon, getVoucherTypeName } from "../system/voucher"; -import { FormChangeItem, SpeciesFormChangeItemTrigger, pokemonFormChanges } from "../data/pokemon-forms"; +import { FormChangeItem, SpeciesFormChangeCondition, SpeciesFormChangeItemTrigger, pokemonFormChanges } from "../data/pokemon-forms"; import { ModifierTier } from "./modifier-tier"; import { Nature, getNatureName, getNatureStatMultiplier } from "#app/data/nature"; import i18next from "i18next"; import { getModifierTierTextTint } from "#app/ui/text"; -import * as Overrides from "../overrides"; +import Overrides from "#app/overrides"; import { MoneyMultiplierModifier } from "./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 { getPokemonNameWithAffix } from "#app/messages.js"; const outputModifierData = false; const useMaxWeightForOutput = false; @@ -236,10 +237,10 @@ export class PokemonHeldItemModifierType extends PokemonModifierType { const matchingModifier = pokemon.scene.findModifier(m => m instanceof Modifiers.PokemonHeldItemModifier && m.pokemonId === pokemon.id && m.matchType(dummyModifier)) as Modifiers.PokemonHeldItemModifier; const maxStackCount = dummyModifier.getMaxStackCount(pokemon.scene); if (!maxStackCount) { - return i18next.t("modifierType:ModifierType.PokemonHeldItemModifierType.extra.inoperable", { "pokemonName": pokemon.name }); + 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": pokemon.name }); + return i18next.t("modifierType:ModifierType.PokemonHeldItemModifierType.extra.tooMany", { "pokemonName": getPokemonNameWithAffix(pokemon) }); } return null; }, group, soundName); @@ -258,7 +259,7 @@ export class PokemonHpRestoreModifierType extends PokemonModifierType { 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 Modifiers.PokemonHpRestoreModifier(this, (args[0] as PlayerPokemon).id, this.restorePoints, this.restorePercent, this.healStatus, false)), selectFilter || ((pokemon: PlayerPokemon) => { - if (!pokemon.hp || (pokemon.hp >= pokemon.getMaxHp() && (!this.healStatus || (!pokemon.status && !pokemon.getTag(BattlerTagType.CONFUSED))))) { + if (!pokemon.hp || (pokemon.isFullHp() && (!this.healStatus || (!pokemon.status && !pokemon.getTag(BattlerTagType.CONFUSED))))) { return PartyUiHandler.NoEffectMessage; } return null; @@ -590,7 +591,12 @@ export class PokemonLevelIncrementModifierType extends PokemonModifierType { } getDescription(scene: BattleScene): string { - return i18next.t("modifierType:ModifierType.PokemonLevelIncrementModifierType.description"); + let levels = 1; + const hasCandyJar = scene.modifiers.find(modifier => modifier instanceof Modifiers.LevelIncrementBoosterModifier); + if (hasCandyJar) { + levels += hasCandyJar.stackCount; + } + return i18next.t("modifierType:ModifierType.PokemonLevelIncrementModifierType.description", {levels }); } } @@ -600,7 +606,12 @@ export class AllPokemonLevelIncrementModifierType extends ModifierType { } getDescription(scene: BattleScene): string { - return i18next.t("modifierType:ModifierType.AllPokemonLevelIncrementModifierType.description"); + let levels = 1; + const hasCandyJar = scene.modifiers.find(modifier => modifier instanceof Modifiers.LevelIncrementBoosterModifier); + if (hasCandyJar) { + levels += hasCandyJar.stackCount; + } + return i18next.t("modifierType:ModifierType.AllPokemonLevelIncrementModifierType.description", { levels }); } } @@ -1062,7 +1073,8 @@ class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator { const formChangeItemPool = party.filter(p => pokemonFormChanges.hasOwnProperty(p.species.speciesId)).map(p => { const formChanges = pokemonFormChanges[p.species.speciesId]; return formChanges.filter(fc => ((fc.formKey.indexOf(SpeciesFormKey.MEGA) === -1 && fc.formKey.indexOf(SpeciesFormKey.PRIMAL) === -1) || party[0].scene.getModifiers(Modifiers.MegaEvolutionAccessModifier).length) - && ((fc.formKey.indexOf(SpeciesFormKey.GIGANTAMAX) === -1 && fc.formKey.indexOf(SpeciesFormKey.ETERNAMAX) === -1) || party[0].scene.getModifiers(Modifiers.GigantamaxAccessModifier).length)) + && ((fc.formKey.indexOf(SpeciesFormKey.GIGANTAMAX) === -1 && fc.formKey.indexOf(SpeciesFormKey.ETERNAMAX) === -1) || party[0].scene.getModifiers(Modifiers.GigantamaxAccessModifier).length) + && (!fc.conditions.length || fc.conditions.filter(cond => cond instanceof SpeciesFormChangeCondition && cond.predicate(p)).length)) .map(fc => fc.findTrigger(SpeciesFormChangeItemTrigger) as SpeciesFormChangeItemTrigger) .filter(t => t && t.active && !p.scene.findModifier(m => m instanceof Modifiers.PokemonFormChangeItemModifier && m.pokemonId === p.id && m.formChangeItem === t.item)); }).flat().flatMap(fc => fc.item); @@ -1199,6 +1211,58 @@ class WeightedModifierType { } } +type BaseModifierOverride = { + name: Exclude; + count?: number; +}; + +/** Type for modifiers and held items that are constructed via {@linkcode ModifierTypeGenerator}. */ +export type GeneratorModifierOverride = { + count?: number; +} & ( + | { + name: keyof Pick; + type?: SpeciesStatBoosterItem; + } + | { + name: keyof Pick; + type?: TempBattleStat; + } + | { + name: keyof Pick; + type?: Stat; + } + | { + name: keyof Pick; + type?: Nature; + } + | { + name: keyof Pick; + type?: Type; + } + | { + name: keyof Pick; + type?: BerryType; + } + | { + name: keyof Pick; + type?: EvolutionItem; + } + | { + name: keyof Pick; + type?: FormChangeItem; + } + | { + name: keyof Pick; + type?: Moves; + } +); + +/** Type used to construct modifiers and held items for overriding purposes. */ +export type ModifierOverride = GeneratorModifierOverride | BaseModifierOverride; + +export type ModifierTypeKeys = keyof typeof modifierTypes; + export const modifierTypes = { POKEBALL: () => new AddPokeballModifierType("pb", PokeballType.POKEBALL, 5), GREAT_BALL: () => new AddPokeballModifierType("gb", PokeballType.GREAT_BALL, 5), @@ -1233,6 +1297,7 @@ 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 Modifiers.PokemonInstantReviveModifier(type, (args[0] as Pokemon).id)), + WHITE_HERB: () => new PokemonHeldItemModifierType("modifierType:ModifierType.WHITE_HERB", "white_herb", (type, args) => new Modifiers.PokemonResetNegativeStatStageModifier(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), @@ -1336,6 +1401,9 @@ export const modifierTypes = { SOOTHE_BELL: () => new PokemonFriendshipBoosterModifierType("modifierType:ModifierType.SOOTHE_BELL", "soothe_bell"), + SCOPE_LENS: () => new PokemonHeldItemModifierType("modifierType:ModifierType.SCOPE_LENS", "scope_lens", (type, args) => new Modifiers.CritBoosterModifier(type, (args[0] as Pokemon).id, 1)), + LEEK: () => new PokemonHeldItemModifierType("modifierType:ModifierType.LEEK", "leek", (type, args) => new Modifiers.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 Modifiers.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 Modifiers.PokemonNatureWeightModifier(type, (args[0] as Pokemon).id)), @@ -1372,7 +1440,7 @@ export const modifierTypes = { TOXIC_ORB: () => new PokemonHeldItemModifierType("modifierType:ModifierType.TOXIC_ORB", "toxic_orb", (type, args) => new Modifiers.TurnStatusEffectModifier(type, (args[0] as Pokemon).id)), FLAME_ORB: () => new PokemonHeldItemModifierType("modifierType:ModifierType.FLAME_ORB", "flame_orb", (type, args) => new Modifiers.TurnStatusEffectModifier(type, (args[0] as Pokemon).id)), - BATON: () => new PokemonHeldItemModifierType("modifierType:ModifierType.BATON", "stick", (type, args) => new Modifiers.SwitchEffectTransferModifier(type, (args[0] as Pokemon).id)), + BATON: () => new PokemonHeldItemModifierType("modifierType:ModifierType.BATON", "baton", (type, args) => new Modifiers.SwitchEffectTransferModifier(type, (args[0] as Pokemon).id)), SHINY_CHARM: () => new ModifierType("modifierType:ModifierType.SHINY_CHARM", "shiny_charm", (type, _args) => new Modifiers.ShinyRateBoosterModifier(type)), ABILITY_CHARM: () => new ModifierType("modifierType:ModifierType.ABILITY_CHARM", "ability_charm", (type, _args) => new Modifiers.HiddenAbilityRateBoosterModifier(type)), @@ -1530,6 +1598,11 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.AMULET_COIN, skipInLastClassicWaveOrDefault(3)), //new WeightedModifierType(modifierTypes.EVIOLITE, (party: Pokemon[]) => party.some(p => ((p.getSpeciesForm(true).speciesId in pokemonEvolutions) || (p.isFusion() && (p.getFusionSpeciesForm(true).speciesId in pokemonEvolutions))) && !p.getHeldItems().some(i => i instanceof Modifiers.EvolutionStatBoosterModifier)) ? 10 : 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 Modifiers.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]; @@ -1542,6 +1615,14 @@ const modifierPool: ModifierPool = { // 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 Modifiers.TurnStatusEffectModifier) && (checkedAbilities.some(a => p.hasAbility(a, false, true)) || p.getMoveset(true).some(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 Modifiers.PokemonResetNegativeStatStageModifier && i.stackCount >= i.getMaxHeldItemCount(p)) && + (checkedAbilities.some(a => p.hasAbility(a, false, true)) || p.getMoveset(true).some(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 3*(weightMultiplier? 2: 1)+(weightMultiplier? weightMultiplier-1: 0); + }, 10), new WeightedModifierType(modifierTypes.REVIVER_SEED, 4), new WeightedModifierType(modifierTypes.CANDY_JAR, 5), new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 9), @@ -1565,6 +1646,7 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.SHELL_BELL, 3), new WeightedModifierType(modifierTypes.BERRY_POUCH, 4), new WeightedModifierType(modifierTypes.GRIP_CLAW, 5), + new WeightedModifierType(modifierTypes.SCOPE_LENS, 4), new WeightedModifierType(modifierTypes.BATON, 2), new WeightedModifierType(modifierTypes.SOUL_DEW, 7), //new WeightedModifierType(modifierTypes.OVAL_CHARM, 6), @@ -1607,6 +1689,7 @@ const wildModifierPool: ModifierPool = { }), [ModifierTier.ULTRA]: [ new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 10), + new WeightedModifierType(modifierTypes.WHITE_HERB, 2) ].map(m => { m.setTier(ModifierTier.ULTRA); return m; }), @@ -1635,7 +1718,8 @@ const trainerModifierPool: ModifierPool = { m.setTier(ModifierTier.GREAT); return m; }), [ModifierTier.ULTRA]: [ - new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 1), + new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 5), + new WeightedModifierType(modifierTypes.WHITE_HERB, 1), ].map(m => { m.setTier(ModifierTier.ULTRA); return m; }), @@ -1926,17 +2010,16 @@ export function getPlayerModifierTypeOptions(count: integer, party: PlayerPokemo } // OVERRIDE IF NECESSARY - if (Overrides.ITEM_REWARD_OVERRIDE?.length) { - options.forEach((mod, i) => { - let override = modifierTypes[Overrides.ITEM_REWARD_OVERRIDE[i]]?.(); - // Populates item id and tier - override = override - .withIdFromFunc(modifierTypes[Overrides.ITEM_REWARD_OVERRIDE[i]]) - .withTierFromPool(); + Overrides.ITEM_REWARD_OVERRIDE.forEach((item, i) => { + let override = modifierTypes[item]?.(); + // Populates item id and tier + override = override + .withIdFromFunc(modifierTypes[item]) + .withTierFromPool(); + + options[i].type = override instanceof ModifierTypeGenerator ? override.generateType(party) : override; + }); - mod.type = (override instanceof ModifierTypeGenerator ? override.generateType(party) : override) || mod.type; - }); - } return options; } diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index 165a1227c4a..89d322ca591 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -20,8 +20,8 @@ import { achvs } from "../system/achv"; import { VoucherType } from "../system/voucher"; import { FormChangeItem, SpeciesFormChangeItemTrigger } from "../data/pokemon-forms"; import { Nature } from "#app/data/nature"; -import * as Overrides from "../overrides"; -import { ModifierType, ModifierTypeGenerator, modifierTypes } from "./modifier-type"; +import Overrides from "#app/overrides"; +import { GeneratorModifierOverride, ModifierType, ModifierTypeGenerator, modifierTypes } from "./modifier-type"; import { Command } from "#app/ui/command-ui-handler.js"; import { Species } from "#enums/species"; import i18next from "i18next"; @@ -470,6 +470,7 @@ export class TerastallizeAccessModifier extends PersistentModifier { export abstract class PokemonHeldItemModifier extends PersistentModifier { public pokemonId: integer; + readonly isTransferrable: boolean = true; constructor(type: ModifierType, pokemonId: integer, stackCount: integer) { super(type, stackCount); @@ -491,10 +492,6 @@ export abstract class PokemonHeldItemModifier extends PersistentModifier { return super.shouldApply(args) && args.length && args[0] instanceof Pokemon && (this.pokemonId === -1 || (args[0] as Pokemon).id === this.pokemonId); } - getTransferrable(withinParty: boolean) { - return true; - } - isIconVisible(scene: BattleScene): boolean { return this.getPokemon(scene).isOnField(); } @@ -570,6 +567,7 @@ export abstract class PokemonHeldItemModifier extends PersistentModifier { export abstract class LapsingPokemonHeldItemModifier extends PokemonHeldItemModifier { protected battlesLeft: integer; + readonly isTransferrable: boolean = false; constructor(type: ModifierTypes.ModifierType, pokemonId: integer, battlesLeft?: integer, stackCount?: integer) { super(type, pokemonId, stackCount); @@ -606,6 +604,7 @@ export abstract class LapsingPokemonHeldItemModifier extends PokemonHeldItemModi export class TerastallizeModifier extends LapsingPokemonHeldItemModifier { public teraType: Type; + readonly isTransferrable: boolean = false; constructor(type: ModifierTypes.TerastallizeModifierType, pokemonId: integer, teraType: Type, battlesLeft?: integer, stackCount?: integer) { super(type, pokemonId, battlesLeft || 10, stackCount); @@ -649,10 +648,6 @@ export class TerastallizeModifier extends LapsingPokemonHeldItemModifier { return ret; } - getTransferrable(withinParty: boolean): boolean { - return false; - } - getScoreMultiplier(): number { return 1.25; } @@ -664,6 +659,7 @@ export class TerastallizeModifier extends LapsingPokemonHeldItemModifier { export class PokemonBaseStatModifier extends PokemonHeldItemModifier { protected stat: Stat; + readonly isTransferrable: boolean = false; constructor(type: ModifierTypes.PokemonBaseStatBoosterModifierType, pokemonId: integer, stat: Stat, stackCount?: integer) { super(type, pokemonId, stackCount); @@ -695,10 +691,6 @@ export class PokemonBaseStatModifier extends PokemonHeldItemModifier { return true; } - getTransferrable(_withinParty: boolean): boolean { - return false; - } - getScoreMultiplier(): number { return 1.1; } @@ -931,6 +923,97 @@ export class SpeciesStatBoosterModifier extends StatBoosterModifier { } } +/** + * Modifier used for held items that apply critical-hit stage boost(s). + * @extends PokemonHeldItemModifier + * @see {@linkcode apply} + */ +export class CritBoosterModifier extends PokemonHeldItemModifier { + /** The amount of stages by which the held item increases the current critical-hit stage value */ + protected stageIncrement: number; + + constructor(type: ModifierType, pokemonId: integer, stageIncrement: number, stackCount?: integer) { + super(type, pokemonId, stackCount); + + this.stageIncrement = stageIncrement; + } + + clone() { + return new CritBoosterModifier(this.type, this.pokemonId, this.stageIncrement, this.stackCount); + } + + getArgs(): any[] { + return super.getArgs().concat(this.stageIncrement); + } + + matchType(modifier: Modifier): boolean { + if (modifier instanceof CritBoosterModifier) { + return (modifier as CritBoosterModifier).stageIncrement === this.stageIncrement; + } + + return false; + } + + /** + * Increases the current critical-hit stage value by {@linkcode stageIncrement}. + * @param args [0] {@linkcode Pokemon} N/A + * [1] {@linkcode Utils.IntegerHolder} that holds the resulting critical-hit level + * @returns true if the critical-hit stage boost applies successfully, false otherwise + */ + apply(args: any[]): boolean { + const critStage = args[1] as Utils.NumberHolder; + + critStage.value += this.stageIncrement; + return true; + } + + getMaxHeldItemCount(_pokemon: Pokemon): number { + return 1; + } +} + +/** + * Modifier used for held items that apply critical-hit stage boost(s) + * if the holder is of a specific {@linkcode Species}. + * @extends CritBoosterModifier + * @see {@linkcode shouldApply} + */ +export class SpeciesCritBoosterModifier extends CritBoosterModifier { + /** The species that the held item's critical-hit stage boost applies to */ + private species: Species[]; + + constructor(type: ModifierType, pokemonId: integer, stageIncrement: number, species: Species[], stackCount?: integer) { + super(type, pokemonId, stageIncrement, stackCount); + + this.species = species; + } + + clone() { + return new SpeciesCritBoosterModifier(this.type, this.pokemonId, this.stageIncrement, this.species, this.stackCount); + } + + getArgs(): any[] { + return [ ...super.getArgs(), this.species ]; + } + + matchType(modifier: Modifier): boolean { + return modifier instanceof SpeciesCritBoosterModifier; + } + + /** + * Checks if the holder's {@linkcode Species} (or its fused species) is listed + * in {@linkcode species}. + * @param args [0] {@linkcode Pokemon} that holds the held item + * [1] {@linkcode Utils.IntegerHolder} N/A + * @returns true if the critical-hit level can be incremented, false otherwise + */ + shouldApply(args: any[]) { + const holder = args[0] as Pokemon; + + return super.shouldApply(args) && (this.species.includes(holder.getSpeciesForm(true).speciesId) || (holder.isFusion() && this.species.includes(holder.getFusionSpeciesForm(true).speciesId))); + } +} + /** * Applies Specific Type item boosts (e.g., Magnet) */ @@ -1117,7 +1200,7 @@ export class TurnHealModifier extends PokemonHeldItemModifier { apply(args: any[]): boolean { const pokemon = args[0] as Pokemon; - if (pokemon.getHpRatio() < 1) { + if (!pokemon.isFullHp()) { const scene = pokemon.scene; scene.unshiftPhase(new PokemonHealPhase(scene, pokemon.getBattlerIndex(), Math.max(Math.floor(pokemon.getMaxHp() / 16) * this.stackCount, 1), i18next.t("modifier:turnHealApply", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), typeName: this.type.name }), true)); @@ -1208,7 +1291,7 @@ export class HitHealModifier extends PokemonHeldItemModifier { apply(args: any[]): boolean { const pokemon = args[0] as Pokemon; - if (pokemon.turnData.damageDealt && pokemon.getHpRatio() < 1) { + if (pokemon.turnData.damageDealt && !pokemon.isFullHp()) { const scene = pokemon.scene; scene.unshiftPhase(new PokemonHealPhase(scene, pokemon.getBattlerIndex(), Math.max(Math.floor(pokemon.turnData.damageDealt / 8) * this.stackCount, 1), i18next.t("modifier:hitHealApply", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), typeName: this.type.name }), true)); @@ -1357,6 +1440,47 @@ export class PokemonInstantReviveModifier extends PokemonHeldItemModifier { } } +/** + * Modifier used for White Herb, which resets negative {@linkcode Stat} changes + * @extends PokemonHeldItemModifier + * @see {@linkcode apply} + */ +export class PokemonResetNegativeStatStageModifier extends PokemonHeldItemModifier { + constructor(type: ModifierType, pokemonId: integer, stackCount?: integer) { + super(type, pokemonId, stackCount); + } + + matchType(modifier: Modifier) { + return modifier instanceof PokemonResetNegativeStatStageModifier; + } + + clone() { + return new PokemonResetNegativeStatStageModifier(this.type, this.pokemonId, this.stackCount); + } + + /** + * Restores any negative stat stages of the mon to 0 + * @param args args[0] is the {@linkcode Pokemon} whose stat stages are being checked + * @returns true if any stat changes were applied (item was used), false otherwise + */ + apply(args: any[]): boolean { + const pokemon = args[0] as Pokemon; + const loweredStats = pokemon.summonData.battleStats.filter(s => s < 0); + if (loweredStats.length) { + for (let s = 0; s < pokemon.summonData.battleStats.length; s++) { + pokemon.summonData.battleStats[s] = Math.max(0, pokemon.summonData.battleStats[s]); + } + pokemon.scene.queueMessage(i18next.t("modifier:pokemonResetNegativeStatStageApply", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), typeName: this.type.name })); + return true; + } + return false; + } + + getMaxHeldItemCount(pokemon: Pokemon): integer { + return 2; + } +} + export abstract class ConsumablePokemonModifier extends ConsumableModifier { public pokemonId: integer; @@ -1740,7 +1864,7 @@ export class PokemonExpBoosterModifier extends PokemonHeldItemModifier { } apply(args: any[]): boolean { - (args[1] as Utils.NumberHolder).value = Math.floor((args[1] as Utils.NumberHolder).value * (1 + (this.getStackCount() * this.boostMultiplier))); + (args[1] as Utils.NumberHolder).value += (this.getStackCount() * this.boostMultiplier); return true; } @@ -1927,6 +2051,7 @@ export class PokemonMultiHitModifier extends PokemonHeldItemModifier { export class PokemonFormChangeItemModifier extends PokemonHeldItemModifier { public formChangeItem: FormChangeItem; public active: boolean; + readonly isTransferrable: boolean = false; constructor(type: ModifierTypes.FormChangeItemModifierType, pokemonId: integer, formChangeItem: FormChangeItem, active: boolean, stackCount?: integer) { super(type, pokemonId, stackCount); @@ -1965,10 +2090,6 @@ export class PokemonFormChangeItemModifier extends PokemonHeldItemModifier { return ret; } - getTransferrable(withinParty: boolean) { - return withinParty; - } - getMaxHeldItemCount(pokemon: Pokemon): integer { return 1; } @@ -2213,12 +2334,11 @@ export abstract class HeldItemTransferModifier extends PokemonHeldItemModifier { return false; } - const withinParty = pokemon.isPlayer() === targetPokemon.isPlayer(); const poolType = pokemon.isPlayer() ? ModifierTypes.ModifierPoolType.PLAYER : pokemon.hasTrainer() ? ModifierTypes.ModifierPoolType.TRAINER : ModifierTypes.ModifierPoolType.WILD; const transferredModifierTypes: ModifierTypes.ModifierType[] = []; const itemModifiers = pokemon.scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && (m as PokemonHeldItemModifier).pokemonId === targetPokemon.id && m.getTransferrable(withinParty), targetPokemon.isPlayer()) as PokemonHeldItemModifier[]; + && m.pokemonId === targetPokemon.id && m.isTransferrable, targetPokemon.isPlayer()) as PokemonHeldItemModifier[]; let highestItemTier = itemModifiers.map(m => m.type.getOrInferTier(poolType)).reduce((highestTier, tier) => Math.max(tier, highestTier), 0); let tierItemModifiers = itemModifiers.filter(m => m.type.getOrInferTier(poolType) === highestItemTier); @@ -2263,6 +2383,7 @@ export abstract class HeldItemTransferModifier extends PokemonHeldItemModifier { * @see {@linkcode modifierTypes[MINI_BLACK_HOLE]} */ export class TurnHeldItemTransferModifier extends HeldItemTransferModifier { + readonly isTransferrable: boolean = false; constructor(type: ModifierType, pokemonId: integer, stackCount?: integer) { super(type, pokemonId, stackCount); } @@ -2275,10 +2396,6 @@ export class TurnHeldItemTransferModifier extends HeldItemTransferModifier { return new TurnHeldItemTransferModifier(this.type, this.pokemonId, this.stackCount); } - getTransferrable(withinParty: boolean) { - return withinParty; - } - getTransferredItemCount(): integer { return this.getStackCount(); } @@ -2493,7 +2610,7 @@ export class EnemyTurnHealModifier extends EnemyPersistentModifier { apply(args: any[]): boolean { const pokemon = args[0] as Pokemon; - if (pokemon.getHpRatio() < 1) { + if (!pokemon.isFullHp()) { const scene = pokemon.scene; scene.unshiftPhase(new PokemonHealPhase(scene, pokemon.getBattlerIndex(), Math.max(Math.floor(pokemon.getMaxHp() / (100 / this.healPercent)) * this.stackCount, 1), i18next.t("modifier:enemyTurnHealApply", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), true, false, false, false, true)); @@ -2685,7 +2802,8 @@ export function overrideModifiers(scene: BattleScene, player: boolean = true): v } // if the modifier does not exist, we skip it let modifierType: ModifierType = modifierTypes[modifierName](); if (modifierType instanceof ModifierTypeGenerator) { - modifierType = (modifierType as ModifierTypeGenerator).generateType(scene.getParty(), [item.type]); + const itemType = [(item as GeneratorModifierOverride)?.type] ?? null; + modifierType = (modifierType as ModifierTypeGenerator).generateType(scene.getParty(), itemType); } modifierType = modifierType.withIdFromFunc(modifierTypes[modifierName]); const modifier: PersistentModifier = modifierType.newModifier(scene.getParty()[0]) as PersistentModifier; @@ -2718,7 +2836,8 @@ export function overrideHeldItems(scene: BattleScene, pokemon: Pokemon, player: const modifierType: ModifierType = modifierTypes[itemName](); // we retrieve the item in the list let itemModifier: PokemonHeldItemModifier; if (modifierType instanceof ModifierTypes.ModifierTypeGenerator) { - itemModifier = modifierType.generateType(null, [item.type]).withIdFromFunc(modifierTypes[itemName]).newModifier(pokemon) as PokemonHeldItemModifier; + const pregenArgs = "type" in item ? [item.type] : null; + itemModifier = modifierType.generateType(null, pregenArgs).withIdFromFunc(modifierTypes[itemName]).newModifier(pokemon) as PokemonHeldItemModifier; } else { itemModifier = modifierType.withIdFromFunc(modifierTypes[itemName]).newModifier(pokemon) as PokemonHeldItemModifier; } diff --git a/src/overrides.ts b/src/overrides.ts index d4e4a65134d..1196797fac0 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -1,158 +1,185 @@ -import { WeatherType } from "./data/weather"; -import { Variant } from "./data/variant"; -import { TempBattleStat } from "./data/temp-battle-stat"; -import { Nature } from "./data/nature"; -import { Type } from "./data/type"; -import { Stat } from "./data/pokemon-stat"; -import { PokeballCounts } from "./battle-scene"; -import { PokeballType } from "./data/pokeball"; -import { Gender } from "./data/gender"; -import { StatusEffect } from "./data/status-effect"; -import { modifierTypes, SpeciesStatBoosterItem } from "./modifier/modifier-type"; -import { VariantTier } from "#enums/variant-tiers"; -import { EggTier } from "#enums/egg-type"; 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 { PokeballType } from "#enums/pokeball"; import { Species } from "#enums/species"; +import { StatusEffect } from "#enums/status-effect"; import { TimeOfDay } from "#enums/time-of-day"; -import { MysteryEncounterType } from "#enums/mystery-encounter-type"; // eslint-disable-line @typescript-eslint/no-unused-vars -import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; // eslint-disable-line @typescript-eslint/no-unused-vars +import { VariantTier } from "#enums/variant-tiers"; +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, type ModifierTypeKeys } from "./modifier/modifier-type"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; /** - * Overrides for testing different in game situations - * if an override name starts with "STARTING", it will apply when a new run begins - */ - -/** - * OVERALL OVERRIDES - */ - -// a specific seed (default: a random string of 24 characters) -export const SEED_OVERRIDE: string = ""; -export const WEATHER_OVERRIDE: WeatherType = WeatherType.NONE; -export const DOUBLE_BATTLE_OVERRIDE: boolean = false; -export const SINGLE_BATTLE_OVERRIDE: boolean = false; -export const STARTING_WAVE_OVERRIDE: integer = 0; -export const STARTING_BIOME_OVERRIDE: Biome = Biome.TOWN; -export const ARENA_TINT_OVERRIDE: TimeOfDay = null; -// Multiplies XP gained by this value including 0. Set to null to ignore the override -export const XP_MULTIPLIER_OVERRIDE: number = null; -// default 1000 -export const STARTING_MONEY_OVERRIDE: integer = 0; -export const FREE_CANDY_UPGRADE_OVERRIDE: boolean = false; -export const POKEBALL_OVERRIDE: { active: boolean, pokeballs: PokeballCounts } = { - active: false, - pokeballs: { - [PokeballType.POKEBALL]: 5, - [PokeballType.GREAT_BALL]: 0, - [PokeballType.ULTRA_BALL]: 0, - [PokeballType.ROGUE_BALL]: 0, - [PokeballType.MASTER_BALL]: 0, - } -}; - -/** - * PLAYER OVERRIDES - */ - -/** - * Set the form index of any starter in the party whose `speciesId` is inside this override - * @see {@link allSpecies} in `src/data/pokemon-species.ts` for form indexes + * 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 + * * @example * ``` - * const STARTER_FORM_OVERRIDES = { - * [Species.DARMANITAN]: 1 + * const overrides = { + * ABILITY_OVERRIDE: Abilities.PROTEAN, + * PASSIVE_ABILITY_OVERRIDE: Abilities.PIXILATE, * } * ``` */ -export const STARTER_FORM_OVERRIDES: Partial> = {}; - -// default 5 or 20 for Daily -export const STARTING_LEVEL_OVERRIDE: integer = 0; -/** - * SPECIES OVERRIDE - * will only apply to the first starter in your party or each enemy pokemon - * default is 0 to not override - * @example SPECIES_OVERRIDE = Species.Bulbasaur; - */ -export const STARTER_SPECIES_OVERRIDE: Species | integer = 0; -export const ABILITY_OVERRIDE: Abilities = Abilities.NONE; -export const PASSIVE_ABILITY_OVERRIDE: Abilities = Abilities.NONE; -export const STATUS_OVERRIDE: StatusEffect = StatusEffect.NONE; -export const GENDER_OVERRIDE: Gender = null; -export const MOVESET_OVERRIDE: Array = []; -export const SHINY_OVERRIDE: boolean = false; -export const VARIANT_OVERRIDE: Variant = 0; +const overrides = {} satisfies Partial>; /** - * OPPONENT / ENEMY OVERRIDES - */ - -export const OPP_SPECIES_OVERRIDE: Species | integer = 0; -export const OPP_LEVEL_OVERRIDE: number = 0; -export const OPP_ABILITY_OVERRIDE: Abilities = Abilities.NONE; -export const OPP_PASSIVE_ABILITY_OVERRIDE: Abilities = Abilities.NONE; -export const OPP_STATUS_OVERRIDE: StatusEffect = StatusEffect.NONE; -export const OPP_GENDER_OVERRIDE: Gender = null; -export const OPP_MOVESET_OVERRIDE: Array = []; -export const OPP_SHINY_OVERRIDE: boolean = false; -export const OPP_VARIANT_OVERRIDE: Variant = 0; -export const OPP_IVS_OVERRIDE: integer | integer[] = []; - -/** - * EGG OVERRIDES - */ - -export const EGG_IMMEDIATE_HATCH_OVERRIDE: boolean = false; -export const EGG_TIER_OVERRIDE: EggTier = null; -export const EGG_SHINY_OVERRIDE: boolean = false; -export const EGG_VARIANT_OVERRIDE: VariantTier = null; -export const EGG_FREE_GACHA_PULLS_OVERRIDE: boolean = false; -export const EGG_GACHA_PULL_COUNT_OVERRIDE: number = 0; - -/** - * MYSTERY ENCOUNTER OVERRIDES - */ - -// 1 to 256, set to null to ignore -export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = null; -export const MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; -export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = null; - -/** - * MODIFIER / ITEM OVERRIDES - * if count is not provided, it will default to 1 - * @example Modifier Override [{name: "EXP_SHARE", count: 2}] - * @example Held Item Override [{name: "LUCKY_EGG"}] + * If you need to add Overrides values for local testing do that inside {@linkcode overrides} + * --- + * Defaults for Overrides that are used when testing different in game situations * - * Some items are generated based on a sub-type (i.e. berries), to override those: - * @example [{name: "BERRY", count: 5, type: BerryType.SITRUS}] - * types are listed in interface below - * - TempBattleStat is for TEMP_STAT_BOOSTER / X Items (Dire hit is separate) - * - Stat is for BASE_STAT_BOOSTER / Vitamin - * - Nature is for MINT - * - Type is for TERA_SHARD or ATTACK_TYPE_BOOSTER (type boosting items i.e Silk Scarf) - * - BerryType is for BERRY - * - SpeciesStatBoosterItem is for SPECIES_STAT_BOOSTER + * If an override name starts with "STARTING", it will apply when a new run begins */ -export interface ModifierOverride { - name: keyof typeof modifierTypes & string, - count?: integer - type?: TempBattleStat|Stat|Nature|Type|BerryType|SpeciesStatBoosterItem +class DefaultOverrides { + // ----------------- + // OVERALL OVERRIDES + // ----------------- + /** a specific seed (default: a random string of 24 characters) */ + readonly SEED_OVERRIDE: string = ""; + readonly WEATHER_OVERRIDE: WeatherType = WeatherType.NONE; + readonly BATTLE_TYPE_OVERRIDE: "double" | "single" | null = null; + readonly STARTING_WAVE_OVERRIDE: integer = 0; + readonly STARTING_BIOME_OVERRIDE: Biome = Biome.TOWN; + readonly ARENA_TINT_OVERRIDE: TimeOfDay = null; + /** Multiplies XP gained by this value including 0. Set to null to ignore the override */ + readonly XP_MULTIPLIER_OVERRIDE: number = null; + /** default 1000 */ + readonly STARTING_MONEY_OVERRIDE: integer = 0; + readonly FREE_CANDY_UPGRADE_OVERRIDE: boolean = false; + readonly POKEBALL_OVERRIDE: { active: boolean; pokeballs: PokeballCounts } = { + active: false, + pokeballs: { + [PokeballType.POKEBALL]: 5, + [PokeballType.GREAT_BALL]: 0, + [PokeballType.ULTRA_BALL]: 0, + [PokeballType.ROGUE_BALL]: 0, + [PokeballType.MASTER_BALL]: 0, + }, + }; + + // ---------------- + // PLAYER OVERRIDES + // ---------------- + /** + * Set the form index of any starter in the party whose `speciesId` is inside this override + * @see {@link allSpecies} in `src/data/pokemon-species.ts` for form indexes + * @example + * ``` + * const STARTER_FORM_OVERRIDES = { + * [Species.DARMANITAN]: 1 + * } + * ``` + */ + readonly STARTER_FORM_OVERRIDES: Partial> = {}; + + /** default 5 or 20 for Daily */ + readonly STARTING_LEVEL_OVERRIDE: integer = 0; + /** + * SPECIES OVERRIDE + * will only apply to the first starter in your party or each enemy pokemon + * default is 0 to not override + * @example SPECIES_OVERRIDE = Species.Bulbasaur; + */ + readonly STARTER_SPECIES_OVERRIDE: Species | integer = 0; + readonly ABILITY_OVERRIDE: Abilities = Abilities.NONE; + readonly PASSIVE_ABILITY_OVERRIDE: Abilities = Abilities.NONE; + readonly STATUS_OVERRIDE: StatusEffect = StatusEffect.NONE; + readonly GENDER_OVERRIDE: Gender = null; + readonly MOVESET_OVERRIDE: Array = []; + readonly SHINY_OVERRIDE: boolean = false; + readonly VARIANT_OVERRIDE: Variant = 0; + + // -------------------------- + // OPPONENT / ENEMY OVERRIDES + // -------------------------- + readonly OPP_SPECIES_OVERRIDE: Species | integer = 0; + readonly OPP_LEVEL_OVERRIDE: number = 0; + readonly OPP_ABILITY_OVERRIDE: Abilities = Abilities.NONE; + readonly OPP_PASSIVE_ABILITY_OVERRIDE: Abilities = Abilities.NONE; + readonly OPP_STATUS_OVERRIDE: StatusEffect = StatusEffect.NONE; + readonly OPP_GENDER_OVERRIDE: Gender = null; + readonly OPP_MOVESET_OVERRIDE: Array = []; + readonly OPP_SHINY_OVERRIDE: boolean = false; + readonly OPP_VARIANT_OVERRIDE: Variant = 0; + readonly OPP_IVS_OVERRIDE: integer | integer[] = []; + + // ------------- + // EGG OVERRIDES + // ------------- + readonly EGG_IMMEDIATE_HATCH_OVERRIDE: boolean = false; + readonly EGG_TIER_OVERRIDE: EggTier = null; + readonly EGG_SHINY_OVERRIDE: boolean = false; + readonly EGG_VARIANT_OVERRIDE: VariantTier = null; + readonly EGG_FREE_GACHA_PULLS_OVERRIDE: boolean = false; + readonly EGG_GACHA_PULL_COUNT_OVERRIDE: number = 0; + + // ------------------------- + // MYSTERY ENCOUNTER OVERRIDES + // ------------------------- + + // 1 to 256, set to null to ignore + readonly MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = null; + readonly MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; + readonly MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = null; + + // ------------------------- + // MODIFIER / ITEM OVERRIDES + // ------------------------- + /** + * Overrides labeled `MODIFIER` deal with any modifier so long as it doesn't require a party + * member to hold it (typically this is, extends, or generates a {@linkcode ModifierType}), + * like `EXP_SHARE`, `CANDY_JAR`, etc. + * + * Overrides labeled `HELD_ITEM` specifically pertain to any entry in {@linkcode modifierTypes} that + * extends, or generates a {@linkcode PokemonHeldItemModifierType}, like `SOUL_DEW`, `TOXIC_ORB`, etc. + * + * Note that, if count is not provided, it will default to 1. + * + * Additionally, note that some held items and modifiers are grouped together via + * a {@linkcode ModifierTypeGenerator} and require pre-generation arguments to get + * a specific item from that group. If a type is not set, the generator will either + * use the party to weight item choice or randomly pick an item. + * + * @example + * ``` + * // Will have a quantity of 2 in-game + * STARTING_MODIFIER_OVERRIDE = [{name: "EXP_SHARE", count: 2}] + * // Will have a quantity of 1 in-game + * STARTING_HELD_ITEM_OVERRIDE = [{name: "LUCKY_EGG"}] + * // Type must be given to get a specific berry + * STARTING_HELD_ITEM_OVERRIDE = [{name: "BERRY", type: BerryType.SITRUS}] + * // A random berry will be generated at runtime + * STARTING_HELD_ITEM_OVERRIDE = [{name: "BERRY"}] + * ``` + */ + readonly STARTING_MODIFIER_OVERRIDE: Array = []; + readonly OPP_MODIFIER_OVERRIDE: Array = []; + + readonly STARTING_HELD_ITEMS_OVERRIDE: Array = []; + readonly OPP_HELD_ITEMS_OVERRIDE: Array = []; + readonly NEVER_CRIT_OVERRIDE: boolean = false; + + /** + * An array of items by keys as defined in the "modifierTypes" object in the "modifier/modifier-type.ts" file. + * Items listed will replace the normal rolls. + * If less items are listed than rolled, only some items will be replaced + * If more items are listed than rolled, only the first X items will be shown, where X is the number of items rolled. + */ + readonly ITEM_REWARD_OVERRIDE: Array = []; } -export const STARTING_MODIFIER_OVERRIDE: Array = []; -export const OPP_MODIFIER_OVERRIDE: Array = []; -export const STARTING_HELD_ITEMS_OVERRIDE: Array = []; -export const OPP_HELD_ITEMS_OVERRIDE: Array = []; -export const NEVER_CRIT_OVERRIDE: boolean = false; +export const defaultOverrides = new DefaultOverrides(); -/** - * An array of items by keys as defined in the "modifierTypes" object in the "modifier/modifier-type.ts" file. - * Items listed will replace the normal rolls. - * If less items are listed than rolled, only some items will be replaced - * If more items are listed than rolled, only the first X items will be shown, where X is the number of items rolled. - */ -export const ITEM_REWARD_OVERRIDE: Array = []; +export default { + ...defaultOverrides, + ...overrides +} satisfies InstanceType; diff --git a/src/phases.ts b/src/phases.ts index 6c18a3439f5..7f2933a738a 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -1,12 +1,11 @@ import BattleScene, { bypassLogin } from "./battle-scene"; import { DamageResult, default as Pokemon, EnemyPokemon, FieldPosition, HitResult, MoveResult, PlayerPokemon, PokemonMove, TurnMove } from "./field/pokemon"; import * as Utils from "./utils"; -import { isNullOrUndefined } from "./utils"; -import { allMoves, applyFilteredMoveAttrs, applyMoveAttrs, AttackMove, BypassRedirectAttr, BypassSleepAttr, ChargeAttr, CopyMoveAttr, FixedDamageAttr, ForceSwitchOutAttr, getMoveTargets, HealStatusEffectAttr, HitsTagAttr, IgnoreOpponentStatChangesAttr, IncrementMovePriorityAttr, MissEffectAttr, MoveAttr, MoveEffectAttr, MoveEffectTrigger, MoveFlags, MoveTarget, MoveTargetSet, MultiHitAttr, NoEffectAttr, OneHitKOAccuracyAttr, OverrideMoveEffectAttr, PostVictoryStatChangeAttr, PreMoveMessageAttr, SelfStatusMove, VariableAccuracyAttr, VariableTargetAttr } from "./data/move"; +import { allMoves, applyMoveAttrs, BypassSleepAttr, ChargeAttr, applyFilteredMoveAttrs, HitsTagAttr, MissEffectAttr, MoveAttr, MoveEffectAttr, MoveFlags, MultiHitAttr, OverrideMoveEffectAttr, MoveTarget, getMoveTargets, MoveTargetSet, MoveEffectTrigger, CopyMoveAttr, AttackMove, SelfStatusMove, PreMoveMessageAttr, HealStatusEffectAttr, NoEffectAttr, BypassRedirectAttr, FixedDamageAttr, PostVictoryStatChangeAttr, ForceSwitchOutAttr, VariableTargetAttr, IncrementMovePriorityAttr } from "./data/move"; import { Mode } from "./ui/ui"; import { Command } from "./ui/command-ui-handler"; import { Stat } from "./data/pokemon-stat"; -import { BerryModifier, BypassSpeedChanceModifier, ContactHeldItemTransferChanceModifier, EnemyAttackStatusEffectChanceModifier, EnemyPersistentModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, FlinchChanceModifier, HealingBoosterModifier, HitHealModifier, IvScannerModifier, LapsingPersistentModifier, LapsingPokemonHeldItemModifier, MapModifier, Modifier, MoneyInterestModifier, MoneyMultiplierModifier, MultipleParticipantExpBonusModifier, overrideHeldItems, overrideModifiers, PersistentModifier, PokemonExpBoosterModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, PokemonMoveAccuracyBoosterModifier, PokemonMultiHitModifier, SwitchEffectTransferModifier, TempBattleStatBoosterModifier, TurnHealModifier, TurnHeldItemTransferModifier, TurnStatusEffectModifier } from "./modifier/modifier"; +import { BerryModifier, ContactHeldItemTransferChanceModifier, EnemyAttackStatusEffectChanceModifier, EnemyPersistentModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, FlinchChanceModifier, HealingBoosterModifier, HitHealModifier, LapsingPersistentModifier, MapModifier, Modifier, MultipleParticipantExpBonusModifier, PersistentModifier, PokemonExpBoosterModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, SwitchEffectTransferModifier, TurnHealModifier, TurnHeldItemTransferModifier, MoneyMultiplierModifier, MoneyInterestModifier, IvScannerModifier, LapsingPokemonHeldItemModifier, PokemonMultiHitModifier, overrideModifiers, overrideHeldItems, BypassSpeedChanceModifier, TurnStatusEffectModifier, PokemonResetNegativeStatStageModifier } from "./modifier/modifier"; import PartyUiHandler, { PartyOption, PartyUiMode } from "./ui/party-ui-handler"; import { doPokeballBounceAnim, getPokeballAtlasKey, getPokeballCatchMultiplier, getPokeballTintColor, PokeballType } from "./data/pokeball"; import { CommonAnim, CommonBattleAnim, initEncounterAnims, initMoveAnim, loadEncounterAnimAssets, loadMoveAnimAssets, MoveAnim } from "./data/battle-anims"; @@ -24,10 +23,9 @@ import { BattlerTagLapseType, CenterOfAttentionTag, EncoreTag, MysteryEncounterP import { getPokemonMessage, getPokemonNameWithAffix } from "./messages"; import { Starter } from "./ui/starter-select-ui-handler"; import { Gender } from "./data/gender"; -import { getRandomWeatherType, getTerrainBlockMessage, getWeatherDamageMessage, getWeatherLapseMessage, Weather, WeatherType } from "./data/weather"; -import { TempBattleStat } from "./data/temp-battle-stat"; +import { Weather, WeatherType, getRandomWeatherType, getTerrainBlockMessage, getWeatherDamageMessage, getWeatherLapseMessage } from "./data/weather"; import { ArenaTagSide, ArenaTrapTag, MistTag, TrickRoomTag } from "./data/arena-tag"; -import { CheckTrappedAbAttr, IgnoreOpponentStatChangesAbAttr, IgnoreOpponentEvasionAbAttr, PostAttackAbAttr, PostBattleAbAttr, PostDefendAbAttr, PostSummonAbAttr, PostTurnAbAttr, PostWeatherLapseAbAttr, PreSwitchOutAbAttr, PreWeatherDamageAbAttr, ProtectStatAbAttr, RedirectMoveAbAttr, BlockRedirectAbAttr, RunSuccessAbAttr, StatChangeMultiplierAbAttr, SuppressWeatherEffectAbAttr, SyncEncounterNatureAbAttr, applyAbAttrs, applyCheckTrappedAbAttrs, applyPostAttackAbAttrs, applyPostBattleAbAttrs, applyPostDefendAbAttrs, applyPostSummonAbAttrs, applyPostTurnAbAttrs, applyPostWeatherLapseAbAttrs, applyPreStatChangeAbAttrs, applyPreSwitchOutAbAttrs, applyPreWeatherEffectAbAttrs, BattleStatMultiplierAbAttr, applyBattleStatMultiplierAbAttrs, IncrementMovePriorityAbAttr, applyPostVictoryAbAttrs, PostVictoryAbAttr, BlockNonDirectDamageAbAttr as BlockNonDirectDamageAbAttr, applyPostKnockOutAbAttrs, PostKnockOutAbAttr, PostBiomeChangeAbAttr, applyPostFaintAbAttrs, PostFaintAbAttr, IncreasePpAbAttr, PostStatChangeAbAttr, applyPostStatChangeAbAttrs, AlwaysHitAbAttr, PreventBerryUseAbAttr, StatChangeCopyAbAttr, PokemonTypeChangeAbAttr, applyPreAttackAbAttrs, applyPostMoveUsedAbAttrs, PostMoveUsedAbAttr, MaxMultiHitAbAttr, HealFromBerryUseAbAttr, WonderSkinAbAttr, applyPreDefendAbAttrs, IgnoreMoveEffectsAbAttr, BlockStatusDamageAbAttr, BypassSpeedChanceAbAttr, AddSecondStrikeAbAttr } from "./data/ability"; +import { CheckTrappedAbAttr, PostAttackAbAttr, PostBattleAbAttr, PostDefendAbAttr, PostSummonAbAttr, PostTurnAbAttr, PostWeatherLapseAbAttr, PreSwitchOutAbAttr, PreWeatherDamageAbAttr, ProtectStatAbAttr, RedirectMoveAbAttr, BlockRedirectAbAttr, RunSuccessAbAttr, StatChangeMultiplierAbAttr, SuppressWeatherEffectAbAttr, SyncEncounterNatureAbAttr, applyAbAttrs, applyCheckTrappedAbAttrs, applyPostAttackAbAttrs, applyPostBattleAbAttrs, applyPostDefendAbAttrs, applyPostSummonAbAttrs, applyPostTurnAbAttrs, applyPostWeatherLapseAbAttrs, applyPreStatChangeAbAttrs, applyPreSwitchOutAbAttrs, applyPreWeatherEffectAbAttrs, IncrementMovePriorityAbAttr, applyPostVictoryAbAttrs, PostVictoryAbAttr, BlockNonDirectDamageAbAttr as BlockNonDirectDamageAbAttr, applyPostKnockOutAbAttrs, PostKnockOutAbAttr, PostBiomeChangeAbAttr, applyPostFaintAbAttrs, PostFaintAbAttr, IncreasePpAbAttr, PostStatChangeAbAttr, applyPostStatChangeAbAttrs, AlwaysHitAbAttr, PreventBerryUseAbAttr, StatChangeCopyAbAttr, PokemonTypeChangeAbAttr, applyPreAttackAbAttrs, applyPostMoveUsedAbAttrs, PostMoveUsedAbAttr, MaxMultiHitAbAttr, HealFromBerryUseAbAttr, IgnoreMoveEffectsAbAttr, BlockStatusDamageAbAttr, BypassSpeedChanceAbAttr, AddSecondStrikeAbAttr } from "./data/ability"; import { Unlockables, getUnlockableName } from "./system/unlockables"; import { getBiomeKey } from "./field/arena"; import { BattlerIndex, BattleType, TurnCommand } from "./battle"; @@ -50,8 +48,7 @@ import { fetchDailyRunSeed, getDailyRunStarters } from "./data/daily-run"; import { GameMode, GameModes, getGameMode } from "./game-mode"; import PokemonSpecies, { getPokemonSpecies, speciesStarters } from "./data/pokemon-species"; import i18next from "./plugins/i18n"; -import * as Overrides from "./overrides"; -import { addTextObject, TextStyle } from "./ui/text"; +import { TextStyle, addTextObject } from "./ui/text"; import { Type } from "./data/type"; import { BerryUsedEvent, EncounterPhaseEvent, MoveUsedEvent, TurnEndEvent, TurnInitEvent } from "./events/battle-scene"; import { Abilities } from "#enums/abilities"; @@ -65,11 +62,14 @@ import { Moves } from "#enums/moves"; import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; +import { applyChallenges, ChallengeType } from "./data/challenge"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { doTrainerExclamation, handleMysteryEncounterBattleStartEffects, handleMysteryEncounterVictory } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import ModifierSelectUiHandler, { SHOP_OPTIONS_ROW_LIMIT } from "#app/ui/modifier-select-ui-handler"; import { getEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; +import Overrides from "#app/overrides"; +import { isNullOrUndefined } from "./utils"; const { t } = i18next; @@ -102,7 +102,7 @@ export class LoginPhase extends Phase { const loadData = () => { updateUserInfo().then(success => { if (!success[0]) { - Utils.setCookie(Utils.sessionIdKey, ""); + Utils.removeCookie(Utils.sessionIdKey); this.scene.reset(true, true); return; } @@ -123,7 +123,7 @@ export class LoginPhase extends Phase { this.scene.ui.playSelect(); updateUserInfo().then(success => { if (!success[0]) { - Utils.setCookie(Utils.sessionIdKey, ""); + Utils.removeCookie(Utils.sessionIdKey); this.scene.reset(true, true); return; } @@ -135,11 +135,21 @@ export class LoginPhase extends Phase { } ] }); + }, () => { + 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.setCookie(Utils.sessionIdKey, ""); + Utils.removeCookie(Utils.sessionIdKey); this.scene.reset(true, true); } else { this.scene.unshiftPhase(new UnavailablePhase(this.scene)); @@ -619,6 +629,7 @@ export class SelectStarterPhase extends Phase { starterPokemon.generateFusionSpecies(true); } starterPokemon.setVisible(false); + applyChallenges(this.scene.gameMode, ChallengeType.STARTER_MODIFY, starterPokemon); party.push(starterPokemon); loadPokemonAssets.push(starterPokemon.loadAssets()); }); @@ -886,7 +897,7 @@ export class EncounterPhase extends BattlePhase { loadEnemyAssets.push(enemyPokemon.loadAssets()); - console.log(enemyPokemon.name, enemyPokemon.species.speciesId, enemyPokemon.stats); + console.log(getPokemonNameWithAffix(enemyPokemon), enemyPokemon.species.speciesId, enemyPokemon.stats); }); if (this.scene.getParty().filter(p => p.isShiny()).length === 6) { @@ -1006,7 +1017,7 @@ export class EncounterPhase extends BattlePhase { const enemyField = this.scene.getEnemyField(); if (this.scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { - return i18next.t("battle:bossAppeared", { bossName: enemyField[0].name }); + return i18next.t("battle:bossAppeared", { bossName: getPokemonNameWithAffix(enemyField[0])}); } if (this.scene.currentBattle.battleType === BattleType.TRAINER) { @@ -1019,8 +1030,8 @@ export class EncounterPhase extends BattlePhase { } 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].getNameToRender() }) + : i18next.t("battle:multiWildAppeared", { pokemonName1: enemyField[0].getNameToRender(), pokemonName2: enemyField[1].getNameToRender() }); } doEncounterCommon(showEncounterMessage: boolean = true) { @@ -1528,11 +1539,11 @@ export class SummonPhase extends PartyMemberPokemonPhase { // 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", partyMember?.name, partyMember, party[0]?.name, party[0]); + 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: this.getPokemon().name })); + this.scene.ui.showText(i18next.t("battle:playerGo", { pokemonName: getPokemonNameWithAffix(this.getPokemon()) })); if (this.player) { this.scene.pbTray.hide(); } @@ -1552,7 +1563,7 @@ export class SummonPhase extends PartyMemberPokemonPhase { 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); - const pokemonName = this.getPokemon().name; + const pokemonName = getPokemonNameWithAffix(this.getPokemon()); const message = i18next.t("battle:trainerSendOut", { trainerName, pokemonName }); this.scene.pbTrayEnemy.hide(); @@ -1726,6 +1737,15 @@ export class SwitchSummonPhase extends SummonPhase { private lastPokemon: Pokemon; + /** + * Constructor for creating a new SwitchSummonPhase + * @param scene {@linkcode BattleScene} the scene the phase is associated with + * @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 batonPass boolean if the switch is from baton pass + * @param player boolean if the switch is from the player + */ constructor(scene: BattleScene, fieldIndex: integer, slotIndex: integer, doReturn: boolean, batonPass: boolean, player?: boolean) { super(scene, fieldIndex, player !== undefined ? player : true); @@ -1749,6 +1769,8 @@ export class SwitchSummonPhase extends SummonPhase { } } + // if doReturn === False OR slotIndex !== -1 (slotIndex is valid) and the pokemon doesn't exist/is false + // then switchAndSummon(), manually pick pokemon to switch into if (!this.doReturn || (this.slotIndex !== -1 && !(this.player ? this.scene.getParty() : this.scene.getEnemyParty())[this.slotIndex])) { if (this.player) { return this.switchAndSummon(); @@ -1765,15 +1787,15 @@ export class SwitchSummonPhase extends SummonPhase { } // TODO: maybe remove this? Not sure if still necessary - if (!pokemon.isActive() || !pokemon.isOnField()) { - this.switchAndSummon(); - } + // if (!pokemon.isActive() || !pokemon.isOnField()) { + // this.switchAndSummon(); + // } this.scene.ui.showText(this.player ? - i18next.t("battle:playerComeBack", { pokemonName: pokemon.name }) : + 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.name + pokemonName: getPokemonNameWithAffix(pokemon) }) ); this.scene.playSound("pb_rel"); @@ -1813,12 +1835,17 @@ export class SwitchSummonPhase extends SummonPhase { party[this.fieldIndex] = switchedPokemon; const showTextAndSummon = () => { this.scene.ui.showText(this.player ? - i18next.t("battle:playerGo", { pokemonName: switchedPokemon.name }) : + i18next.t("battle:playerGo", { pokemonName: getPokemonNameWithAffix(switchedPokemon) }) : i18next.t("battle:trainerGo", { trainerName: this.scene.currentBattle.trainer.getName(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER), - pokemonName: this.getPokemon().name + pokemonName: getPokemonNameWithAffix(this.getPokemon()) }) ); + // Ensure improperly persisted summon data (such as tags) is cleared upon switching + if (!this.batonPass) { + party[this.fieldIndex].resetBattleData(); + party[this.fieldIndex].resetSummonData(); + } this.summon(); }; if (this.player) { @@ -1975,7 +2002,7 @@ export class CheckSwitchPhase extends BattlePhase { return; } - this.scene.ui.showText(i18next.t("battle:switchQuestion", { pokemonName: this.useName ? pokemon.name : i18next.t("battle:pokemon") }), null, () => { + 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); @@ -1995,7 +2022,7 @@ export class SummonMissingPhase extends SummonPhase { } preSummon(): void { - this.scene.ui.showText(i18next.t("battle:sendOutPokemon", { pokemonName: this.getPokemon().name })); + this.scene.ui.showText(i18next.t("battle:sendOutPokemon", { pokemonName: getPokemonNameWithAffix(this.getPokemon()) })); this.scene.time.delayedCall(250, () => this.summon()); } } @@ -2148,7 +2175,10 @@ export class CommandPhase extends FieldPhase { if (!moveId) { turnCommand.targets = [this.fieldIndex]; } - console.log(moveTargets, playerPokemon.name); + console.log(moveTargets, getPokemonNameWithAffix(playerPokemon)); + if (moveTargets.targets.length > 1 && moveTargets.multiple) { + this.scene.unshiftPhase(new SelectTargetPhase(this.scene, this.fieldIndex)); + } if (moveTargets.targets.length <= 1 || moveTargets.multiple) { turnCommand.move.targets = moveTargets.targets; } else if (playerPokemon.getTag(BattlerTagType.CHARGING) && playerPokemon.getMoveQueue().length >= 1) { @@ -2271,7 +2301,7 @@ export class CommandPhase extends FieldPhase { } this.scene.ui.showText( i18next.t("battle:noEscapePokemon", { - pokemonName: this.scene.getPokemonById(trapTag.sourceId).name, + pokemonName: getPokemonNameWithAffix(this.scene.getPokemonById(trapTag.sourceId)), moveName: trapTag.getMoveName(), escapeVerb: isSwitch ? i18next.t("battle:escapeVerbSwitch") : i18next.t("battle:escapeVerbFlee") }), @@ -2405,13 +2435,13 @@ export class SelectTargetPhase extends PokemonPhase { const turnCommand = this.scene.currentBattle.turnCommands[this.fieldIndex]; const move = turnCommand.move?.move; - this.scene.ui.setMode(Mode.TARGET_SELECT, this.fieldIndex, move, (cursor: integer) => { + this.scene.ui.setMode(Mode.TARGET_SELECT, this.fieldIndex, move, (targets: BattlerIndex[]) => { this.scene.ui.setMode(Mode.MESSAGE); - if (cursor === -1) { + if (targets.length < 1) { this.scene.currentBattle.turnCommands[this.fieldIndex] = null; this.scene.unshiftPhase(new CommandPhase(this.scene, this.fieldIndex)); } else { - turnCommand.targets = [cursor]; + turnCommand.targets = targets; } if (turnCommand.command === Command.BALL && this.fieldIndex) { this.scene.currentBattle.turnCommands[this.fieldIndex - 1].skip = true; @@ -2550,6 +2580,11 @@ export class TurnStartPhase extends FieldPhase { this.scene.pushPhase(new BerryPhase(this.scene)); this.scene.pushPhase(new TurnEndPhase(this.scene)); + /** + * 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(); } } @@ -2824,11 +2859,18 @@ export class MovePhase extends BattlePhase { this.targets[0] = moveTarget.value; } + // Check for counterattack moves to switch target if (this.targets.length === 1 && this.targets[0] === BattlerIndex.ATTACKER) { if (this.pokemon.turnData.attacksReceived.length) { - const attacker = this.pokemon.turnData.attacksReceived.length ? this.pokemon.scene.getPokemonById(this.pokemon.turnData.attacksReceived[0].sourceId) : null; - if (attacker?.isActive(true)) { - this.targets[0] = attacker.getBattlerIndex(); + const attack = this.pokemon.turnData.attacksReceived[0]; + this.targets[0] = attack.attackingPosition; + + // 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.getEnemyField()[this.targets[0]]) { + this.targets[0] = this.scene.getEnemyField().find(p => p.isActive(true)).getBattlerIndex(); + } } } if (this.targets[0] === BattlerIndex.ATTACKER) { @@ -3114,6 +3156,7 @@ export class MoveEffectPhase extends PokemonPhase { if (moveHistoryEntry.result === MoveResult.PENDING) { moveHistoryEntry.result = MoveResult.MISS; } + user.pushMoveHistory(moveHistoryEntry); applyMoveAttrs(MissEffectAttr, user, null, move); continue; } @@ -3208,8 +3251,11 @@ export class MoveEffectPhase extends PokemonPhase { if (--user.turnData.hitsLeft >= 1 && this.getTarget()?.isActive()) { this.scene.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) { + if (hitsTotal > 1 || 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 })); } this.scene.applyModifiers(HitHealModifier, this.player, user); @@ -3241,7 +3287,11 @@ export class MoveEffectPhase extends PokemonPhase { } // 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().slice(1).find(() => true)?.targets || []).indexOf(target.getBattlerIndex()) !== -1) { + if (user.getTag(BattlerTagType.IGNORE_ACCURACY) && (user.getLastXMoves().find(() => true)?.targets || []).indexOf(target.getBattlerIndex()) !== -1) { + return true; + } + + if (target.getTag(BattlerTagType.ALWAYS_GET_HIT)) { return true; } @@ -3250,54 +3300,16 @@ export class MoveEffectPhase extends PokemonPhase { return false; } - const moveAccuracy = new Utils.NumberHolder(this.move.getMove().accuracy); + const moveAccuracy = this.move.getMove().calculateBattleAccuracy(user, target); - applyMoveAttrs(VariableAccuracyAttr, user, target, this.move.getMove(), moveAccuracy); - applyPreDefendAbAttrs(WonderSkinAbAttr, target, user, this.move.getMove(), { value: false }, moveAccuracy); - - if (moveAccuracy.value === -1) { + if (moveAccuracy === -1) { return true; } - const isOhko = this.move.getMove().hasAttr(OneHitKOAccuracyAttr); - - if (!isOhko) { - user.scene.applyModifiers(PokemonMoveAccuracyBoosterModifier, user.isPlayer(), user, moveAccuracy); - } - - if (this.scene.arena.weather?.weatherType === WeatherType.FOG) { - moveAccuracy.value = Math.floor(moveAccuracy.value * 0.9); - } - - if (!isOhko && this.scene.arena.getTag(ArenaTagType.GRAVITY)) { - moveAccuracy.value = Math.floor(moveAccuracy.value * 1.67); - } - - const userAccuracyLevel = new Utils.IntegerHolder(user.summonData.battleStats[BattleStat.ACC]); - const targetEvasionLevel = new Utils.IntegerHolder(target.summonData.battleStats[BattleStat.EVA]); - applyAbAttrs(IgnoreOpponentStatChangesAbAttr, target, null, userAccuracyLevel); - applyAbAttrs(IgnoreOpponentStatChangesAbAttr, user, null, targetEvasionLevel); - applyAbAttrs(IgnoreOpponentEvasionAbAttr, user, null, targetEvasionLevel); - applyMoveAttrs(IgnoreOpponentStatChangesAttr, user, target, this.move.getMove(), targetEvasionLevel); - this.scene.applyModifiers(TempBattleStatBoosterModifier, this.player, TempBattleStat.ACC, userAccuracyLevel); - + const accuracyMultiplier = user.getAccuracyMultiplier(target, this.move.getMove()); const rand = user.randSeedInt(100, 1); - const accuracyMultiplier = new Utils.NumberHolder(1); - if (userAccuracyLevel.value !== targetEvasionLevel.value) { - accuracyMultiplier.value = userAccuracyLevel.value > targetEvasionLevel.value - ? (3 + Math.min(userAccuracyLevel.value - targetEvasionLevel.value, 6)) / 3 - : 3 / (3 + Math.min(targetEvasionLevel.value - userAccuracyLevel.value, 6)); - } - - applyBattleStatMultiplierAbAttrs(BattleStatMultiplierAbAttr, user, BattleStat.ACC, accuracyMultiplier, this.move.getMove()); - - const evasionMultiplier = new Utils.NumberHolder(1); - applyBattleStatMultiplierAbAttrs(BattleStatMultiplierAbAttr, target, BattleStat.EVA, evasionMultiplier); - - accuracyMultiplier.value /= evasionMultiplier.value; - - return rand <= moveAccuracy.value * accuracyMultiplier.value; + return rand <= moveAccuracy * accuracyMultiplier; } getUserPokemon(): Pokemon { @@ -3422,6 +3434,8 @@ export class ShowAbilityPhase extends PokemonPhase { } } +export type StatChangeCallback = (target: Pokemon, changed: BattleStat[], relativeChanges: number[]) => void; + export class StatChangePhase extends PokemonPhase { private stats: BattleStat[]; private selfTarget: boolean; @@ -3429,8 +3443,10 @@ export class StatChangePhase extends PokemonPhase { private showMessage: boolean; private ignoreAbilities: boolean; private canBeCopied: boolean; + private onChange: StatChangeCallback; - constructor(scene: BattleScene, battlerIndex: BattlerIndex, selfTarget: boolean, stats: BattleStat[], levels: integer, showMessage: boolean = true, ignoreAbilities: boolean = false, canBeCopied: boolean = true) { + + constructor(scene: BattleScene, battlerIndex: BattlerIndex, selfTarget: boolean, stats: BattleStat[], levels: integer, showMessage: boolean = true, ignoreAbilities: boolean = false, canBeCopied: boolean = true, onChange: StatChangeCallback = null) { super(scene, battlerIndex); this.selfTarget = selfTarget; @@ -3439,6 +3455,7 @@ export class StatChangePhase extends PokemonPhase { this.showMessage = showMessage; this.ignoreAbilities = ignoreAbilities; this.canBeCopied = canBeCopied; + this.onChange = onChange; } start() { @@ -3480,6 +3497,8 @@ export class StatChangePhase extends PokemonPhase { const battleStats = this.getPokemon().summonData.battleStats; const relLevels = filteredStats.map(stat => (levels.value >= 1 ? Math.min(battleStats[stat] + levels.value, 6) : Math.max(battleStats[stat] + levels.value, -6)) - battleStats[stat]); + this.onChange?.(this.getPokemon(), filteredStats, relLevels); + const end = () => { if (this.showMessage) { const messages = this.getStatChangeMessages(filteredStats, levels.value, relLevels); @@ -3500,6 +3519,21 @@ export class StatChangePhase extends PokemonPhase { applyPostStatChangeAbAttrs(PostStatChangeAbAttr, pokemon, filteredStats, this.levels, 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 StatChangePhase && p.battlerIndex === this.battlerIndex); + if (!(existingPhase instanceof StatChangePhase)) { + // Apply White Herb if needed + const whiteHerb = this.scene.applyModifier(PokemonResetNegativeStatStageModifier, this.player, pokemon) as PokemonResetNegativeStatStageModifier; + // 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.updateInfo(); handleTutorial(this.scene, Tutorial.Stat_Change).then(() => super.end()); @@ -3609,12 +3643,13 @@ export class StatChangePhase extends PokemonPhase { if (relLevelStats.length > 1) { statsFragment = relLevelStats.length >= 5 - ? "stats" - : `${relLevelStats.slice(0, -1).map(s => getBattleStatName(s)).join(", ")}${relLevelStats.length > 2 ? "," : ""} and ${getBattleStatName(relLevelStats[relLevelStats.length - 1])}`; + ? i18next.t("battle:stats") + : `${relLevelStats.slice(0, -1).map(s => getBattleStatName(s)).join(", ")}${relLevelStats.length > 2 ? "," : ""} ${i18next.t("battle:statsAnd")} ${getBattleStatName(relLevelStats[relLevelStats.length - 1])}`; + messages.push(getBattleStatLevelChangeDescription(getPokemonNameWithAffix(this.getPokemon()), statsFragment, Math.abs(parseInt(rl)), levels >= 1,relLevelStats.length)); } else { statsFragment = getBattleStatName(relLevelStats[0]); + messages.push(getBattleStatLevelChangeDescription(getPokemonNameWithAffix(this.getPokemon()), statsFragment, Math.abs(parseInt(rl)), levels >= 1,relLevelStats.length)); } - messages.push(getBattleStatLevelChangeDescription(getPokemonNameWithAffix(this.getPokemon()), statsFragment, Math.abs(parseInt(rl)), levels >= 1)); }); return messages; @@ -4046,8 +4081,13 @@ export class FaintPhase extends PokemonPhase { } export class VictoryPhase extends PokemonPhase { - constructor(scene: BattleScene, battlerIndex: BattlerIndex) { + /** 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, isExpOnly: boolean = false) { super(scene, battlerIndex); + + this.isExpOnly = isExpOnly; } start() { @@ -4100,7 +4140,9 @@ export class VictoryPhase extends PokemonPhase { expMultiplier = Overrides.XP_MULTIPLIER_OVERRIDE; } const pokemonExp = new Utils.NumberHolder(expValue * expMultiplier); - this.scene.applyModifiers(PokemonExpBoosterModifier, true, partyMember, pokemonExp); + const modifierBonusExp = new Utils.NumberHolder(1); + this.scene.applyModifiers(PokemonExpBoosterModifier, true, partyMember, modifierBonusExp); + pokemonExp.value *= modifierBonusExp.value; partyMemberExp.push(Math.floor(pokemonExp.value)); } @@ -4139,7 +4181,7 @@ export class VictoryPhase extends PokemonPhase { } if (this.scene.currentBattle.battleType === BattleType.MYSTERY_ENCOUNTER) { - handleMysteryEncounterVictory(this.scene); + handleMysteryEncounterVictory(this.scene, false, this.isExpOnly); this.end(); return; } @@ -4332,7 +4374,11 @@ export class RibbonModifierRewardPhase extends ModifierRewardPhase { this.scene.addModifier(newModifier).then(() => { this.scene.playSound("level_up_fanfare"); this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.showText(`${this.species.name} beat ${this.scene.gameMode.getName()} Mode for the first time!\nYou received ${newModifier.type.name}!`, null, () => { + this.scene.ui.showText(i18next.t("battle:beatModeFirstTime", { + speciesName: this.species.name, + gameMode: this.scene.gameMode.getName(), + newModifier: newModifier.type.name + }), null, () => { resolve(); }, null, true, 1500); }); @@ -4363,7 +4409,7 @@ export class GameOverPhase extends BattlePhase { } else if (this.victory || !this.scene.enableRetries) { this.handleGameOver(); } else { - this.scene.ui.showText("Would you like to retry from the start of the battle?", null, () => { + this.scene.ui.showText(i18next.t("battle:retryBattle"), null, () => { this.scene.ui.setMode(Mode.CONFIRM, () => { this.scene.ui.fadeOut(1250).then(() => { this.scene.reset(); @@ -4533,7 +4579,7 @@ export class EndCardPhase extends Phase { this.endCard.setScale(0.5); this.scene.field.add(this.endCard); - this.text = addTextObject(this.scene, this.scene.game.canvas.width / 12, (this.scene.game.canvas.height / 6) - 16, "Congratulations!", TextStyle.SUMMARY, { fontSize: "128px" }); + 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.setOrigin(0.5); this.scene.field.add(this.text); @@ -4563,7 +4609,7 @@ export class UnlockPhase extends Phase { this.scene.gameData.unlocks[this.unlockable] = true; this.scene.playSound("level_up_fanfare"); this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.showText(`${getUnlockableName(this.unlockable)}\nhas been unlocked.`, null, () => { + 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); @@ -4667,7 +4713,7 @@ export class ExpPhase extends PlayerPartyMemberPokemonPhase { const exp = new Utils.NumberHolder(this.expValue); this.scene.applyModifiers(ExpBoosterModifier, true, exp); exp.value = Math.floor(exp.value); - this.scene.ui.showText(i18next.t("battle:expGain", { pokemonName: pokemon.name, exp: exp.value }), null, () => { + 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; @@ -4767,14 +4813,14 @@ export class LevelUpPhase extends PlayerPartyMemberPokemonPhase { pokemon.updateInfo(); if (this.scene.expParty === ExpNotification.DEFAULT) { this.scene.playSound("level_up_fanfare"); - this.scene.ui.showText(i18next.t("battle:levelUp", { pokemonName: this.getPokemon().name, level: this.level }), null, () => this.scene.ui.getMessageHandler().promptLevelUpStats(this.partyMemberIndex, prevStats, false).then(() => this.end()), null, true); + 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) { 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.level <= 100) { + 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])); @@ -4825,7 +4871,7 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase { .then(() => { this.scene.ui.setMode(messageMode).then(() => { this.scene.playSound("level_up_fanfare"); - this.scene.ui.showText(i18next.t("battle:learnMove", { pokemonName: pokemon.name, moveName: move.name }), null, () => { + this.scene.ui.showText(i18next.t("battle:learnMove", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name }), null, () => { this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeMoveLearnedTrigger, true); this.end(); }, messageMode === Mode.EVOLUTION_SCENE ? 1000 : null, true); @@ -4834,15 +4880,15 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase { }); } else { this.scene.ui.setMode(messageMode).then(() => { - this.scene.ui.showText(i18next.t("battle:learnMovePrompt", { pokemonName: pokemon.name, moveName: move.name }), null, () => { - this.scene.ui.showText(i18next.t("battle:learnMoveLimitReached", { pokemonName: pokemon.name }), null, () => { + this.scene.ui.showText(i18next.t("battle:learnMovePrompt", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name }), null, () => { + this.scene.ui.showText(i18next.t("battle:learnMoveLimitReached", { pokemonName: getPokemonNameWithAffix(pokemon) }), null, () => { this.scene.ui.showText(i18next.t("battle:learnMoveReplaceQuestion", { moveName: move.name }), null, () => { const noHandler = () => { this.scene.ui.setMode(messageMode).then(() => { this.scene.ui.showText(i18next.t("battle:learnMoveStopTeaching", { moveName: move.name }), null, () => { this.scene.ui.setModeWithoutClear(Mode.CONFIRM, () => { this.scene.ui.setMode(messageMode); - this.scene.ui.showText(i18next.t("battle:learnMoveNotLearned", { pokemonName: pokemon.name, moveName: move.name }), null, () => this.end(), null, true); + this.scene.ui.showText(i18next.t("battle:learnMoveNotLearned", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name }), null, () => this.end(), null, true); }, () => { this.scene.ui.setMode(messageMode); this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.partyMemberIndex, this.moveId)); @@ -4861,7 +4907,7 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase { } this.scene.ui.setMode(messageMode).then(() => { this.scene.ui.showText(i18next.t("battle:countdownPoof"), null, () => { - this.scene.ui.showText(i18next.t("battle:learnMoveForgetSuccess", { pokemonName: pokemon.name, moveName: pokemon.moveset[moveIndex].getName() }), null, () => { + this.scene.ui.showText(i18next.t("battle:learnMoveForgetSuccess", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: pokemon.moveset[moveIndex].getName() }), null, () => { this.scene.ui.showText(i18next.t("battle:learnMoveAnd"), null, () => { pokemon.setMove(moveIndex, Moves.NONE); this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.partyMemberIndex, this.moveId)); @@ -4903,7 +4949,7 @@ export class PokemonHealPhase extends CommonAnimPhase { } start() { - if (!this.skipAnim && (this.revive || this.getPokemon().hp) && this.getPokemon().getHpRatio() < 1) { + if (!this.skipAnim && (this.revive || this.getPokemon().hp) && !this.getPokemon().isFullHp()) { super.start(); } else { this.end(); @@ -4918,10 +4964,8 @@ export class PokemonHealPhase extends CommonAnimPhase { return; } - const fullHp = pokemon.getHpRatio() >= 1; - const hasMessage = !!this.message; - const healOrDamage = (!fullHp || this.hpHealed < 0); + const healOrDamage = (!pokemon.isFullHp() || this.hpHealed < 0); let lastStatusEffect = StatusEffect.NONE; if (healOrDamage) { @@ -5099,7 +5143,9 @@ export class AttemptCapturePhase extends PokemonPhase { }); } }, - onComplete: () => this.catch() + onComplete: () => { + this.catch(); + } }); }; @@ -5140,7 +5186,6 @@ export class AttemptCapturePhase extends PokemonPhase { catch() { const pokemon = this.getPokemon() as EnemyPokemon; - this.scene.unshiftPhase(new VictoryPhase(this.scene, this.battlerIndex)); const speciesForm = !pokemon.fusionSpecies ? pokemon.getSpeciesForm() : pokemon.getFusionSpeciesForm(); @@ -5164,8 +5209,9 @@ export class AttemptCapturePhase extends PokemonPhase { this.scene.gameData.updateSpeciesDexIvs(pokemon.species.getRootSpeciesId(true), pokemon.ivs); - this.scene.ui.showText(i18next.t("battle:pokemonCaught", { pokemonName: pokemon.name }), null, () => { + 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(); @@ -5197,9 +5243,16 @@ export class AttemptCapturePhase extends PokemonPhase { 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.name }), null, () => { - this.scene.pokemonInfoContainer.makeRoomForConfirmUi(); + this.scene.ui.showText(i18next.t("battle:partyFull", { pokemonName: getPokemonNameWithAffix(pokemon) }), 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) { @@ -5214,7 +5267,7 @@ export class AttemptCapturePhase extends PokemonPhase { removePokemon(); end(); }); - }); + }, "fullParty"); }); }; promptRelease(); @@ -5363,7 +5416,7 @@ export class SelectModifierPhase extends BattlePhase { 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 as PokemonHeldItemModifier).getTransferrable(true) && (m as PokemonHeldItemModifier).pokemonId === party[fromSlotIndex].id) as PokemonHeldItemModifier[]; + && m.isTransferrable && m.pokemonId === party[fromSlotIndex].id) as PokemonHeldItemModifier[]; const itemModifier = itemModifiers[itemIndex]; this.scene.tryTransferHeldItemModifier(itemModifier, party[toSlotIndex], true, itemQuantity); } else { @@ -5680,7 +5733,7 @@ export class ScanIvsPhase extends PokemonPhase { const pokemon = this.getPokemon(); - this.scene.ui.showText(i18next.t("battle:ivScannerUseQuestion", { pokemonName: pokemon.name }), null, () => { + 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(); diff --git a/src/plugins/i18n.ts b/src/plugins/i18n.ts index 1b4bfdbb16a..df8afdc2d01 100644 --- a/src/plugins/i18n.ts +++ b/src/plugins/i18n.ts @@ -100,7 +100,7 @@ export async function initI18n(): Promise { detection: { lookupLocalStorage: "prLang" }, - debug: true, + debug: Number(import.meta.env.VITE_I18N_DEBUG) === 1, interpolation: { escapeValue: false, }, diff --git a/src/system/achv.ts b/src/system/achv.ts index dda6e5c511b..0dcf74ce3a5 100644 --- a/src/system/achv.ts +++ b/src/system/achv.ts @@ -5,7 +5,7 @@ import i18next from "i18next"; import * as Utils from "../utils"; import { PlayerGender } from "#enums/player-gender"; import { ParseKeys } from "i18next"; -import { Challenge, SingleGenerationChallenge, SingleTypeChallenge } from "#app/data/challenge.js"; +import { Challenge, FreshStartChallenge, SingleGenerationChallenge, SingleTypeChallenge } from "#app/data/challenge.js"; export enum AchvTier { COMMON, @@ -276,6 +276,8 @@ export function getAchievementDescription(localizationKey: string): string { case "MONO_DARK": case "MONO_FAIRY": return i18next.t(`${genderPrefix}achv:MonoType.description` as ParseKeys, {"type": i18next.t(`pokemonInfo:Type.${localizationKey.slice(5)}`)}); + case "FRESH_START": + return i18next.t(`${genderPrefix}achv:FRESH_START.description` as ParseKeys); default: return ""; } @@ -303,7 +305,7 @@ 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_BATTLE_STAT: new Achv("TRANSFER_MAX_BATTLE_STAT","", "TRANSFER_MAX_BATTLE_STAT.description","stick", 20), + TRANSFER_MAX_BATTLE_STAT: new Achv("TRANSFER_MAX_BATTLE_STAT","", "TRANSFER_MAX_BATTLE_STAT.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), @@ -323,15 +325,15 @@ export const achvs = { 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), - MONO_GEN_ONE_VICTORY: new ChallengeAchv("MONO_GEN_ONE","", "MONO_GEN_ONE.description", "mystic_ticket", 100, c => c instanceof SingleGenerationChallenge && c.value === 1), - MONO_GEN_TWO_VICTORY: new ChallengeAchv("MONO_GEN_TWO","", "MONO_GEN_TWO.description", "mystic_ticket", 100, c => c instanceof SingleGenerationChallenge && c.value === 2), - MONO_GEN_THREE_VICTORY: new ChallengeAchv("MONO_GEN_THREE","", "MONO_GEN_THREE.description", "mystic_ticket", 100, c => c instanceof SingleGenerationChallenge && c.value === 3), - MONO_GEN_FOUR_VICTORY: new ChallengeAchv("MONO_GEN_FOUR","", "MONO_GEN_FOUR.description", "mystic_ticket", 100, c => c instanceof SingleGenerationChallenge && c.value === 4), - MONO_GEN_FIVE_VICTORY: new ChallengeAchv("MONO_GEN_FIVE","", "MONO_GEN_FIVE.description", "mystic_ticket", 100, c => c instanceof SingleGenerationChallenge && c.value === 5), - MONO_GEN_SIX_VICTORY: new ChallengeAchv("MONO_GEN_SIX","", "MONO_GEN_SIX.description", "mystic_ticket", 100, c => c instanceof SingleGenerationChallenge && c.value === 6), - MONO_GEN_SEVEN_VICTORY: new ChallengeAchv("MONO_GEN_SEVEN","", "MONO_GEN_SEVEN.description", "mystic_ticket", 100, c => c instanceof SingleGenerationChallenge && c.value === 7), - MONO_GEN_EIGHT_VICTORY: new ChallengeAchv("MONO_GEN_EIGHT","", "MONO_GEN_EIGHT.description", "mystic_ticket", 100, c => c instanceof SingleGenerationChallenge && c.value === 8), - MONO_GEN_NINE_VICTORY: new ChallengeAchv("MONO_GEN_NINE","", "MONO_GEN_NINE.description", "mystic_ticket", 100, c => c instanceof SingleGenerationChallenge && c.value === 9), + MONO_GEN_ONE_VICTORY: new ChallengeAchv("MONO_GEN_ONE","", "MONO_GEN_ONE.description", "ribbon_gen1", 100, c => c instanceof SingleGenerationChallenge && c.value === 1), + MONO_GEN_TWO_VICTORY: new ChallengeAchv("MONO_GEN_TWO","", "MONO_GEN_TWO.description", "ribbon_gen2", 100, c => c instanceof SingleGenerationChallenge && c.value === 2), + MONO_GEN_THREE_VICTORY: new ChallengeAchv("MONO_GEN_THREE","", "MONO_GEN_THREE.description", "ribbon_gen3", 100, c => c instanceof SingleGenerationChallenge && c.value === 3), + MONO_GEN_FOUR_VICTORY: new ChallengeAchv("MONO_GEN_FOUR","", "MONO_GEN_FOUR.description", "ribbon_gen4", 100, c => c instanceof SingleGenerationChallenge && c.value === 4), + MONO_GEN_FIVE_VICTORY: new ChallengeAchv("MONO_GEN_FIVE","", "MONO_GEN_FIVE.description", "ribbon_gen5", 100, c => c instanceof SingleGenerationChallenge && c.value === 5), + MONO_GEN_SIX_VICTORY: new ChallengeAchv("MONO_GEN_SIX","", "MONO_GEN_SIX.description", "ribbon_gen6", 100, c => c instanceof SingleGenerationChallenge && c.value === 6), + MONO_GEN_SEVEN_VICTORY: new ChallengeAchv("MONO_GEN_SEVEN","", "MONO_GEN_SEVEN.description", "ribbon_gen7", 100, c => c instanceof SingleGenerationChallenge && c.value === 7), + MONO_GEN_EIGHT_VICTORY: new ChallengeAchv("MONO_GEN_EIGHT","", "MONO_GEN_EIGHT.description", "ribbon_gen8", 100, c => c instanceof SingleGenerationChallenge && c.value === 8), + MONO_GEN_NINE_VICTORY: new ChallengeAchv("MONO_GEN_NINE","", "MONO_GEN_NINE.description", "ribbon_gen9", 100, c => c instanceof SingleGenerationChallenge && c.value === 9), MONO_NORMAL: new ChallengeAchv("MONO_NORMAL","", "MONO_NORMAL.description", "silk_scarf", 100, c => c instanceof SingleTypeChallenge && c.value === 1), MONO_FIGHTING: new ChallengeAchv("MONO_FIGHTING","", "MONO_FIGHTING.description", "black_belt", 100, c => c instanceof SingleTypeChallenge && c.value === 2), MONO_FLYING: new ChallengeAchv("MONO_FLYING","", "MONO_FLYING.description", "sharp_beak", 100, c => c instanceof SingleTypeChallenge && c.value === 3), @@ -350,6 +352,7 @@ export const achvs = { MONO_DRAGON: new ChallengeAchv("MONO_DRAGON","", "MONO_DRAGON.description", "dragon_fang", 100, c => c instanceof SingleTypeChallenge && c.value === 16), MONO_DARK: new ChallengeAchv("MONO_DARK","", "MONO_DARK.description", "black_glasses", 100, c => c instanceof SingleTypeChallenge && c.value === 17), MONO_FAIRY: new ChallengeAchv("MONO_FAIRY","", "MONO_FAIRY.description", "fairy_feather", 100, c => c instanceof SingleTypeChallenge && c.value === 18), + FRESH_START: new ChallengeAchv("FRESH_START","", "FRESH_START.description", "reviver_seed", 100, c => c instanceof FreshStartChallenge && c.value === 1), }; export function initAchievements() { diff --git a/src/system/game-data.ts b/src/system/game-data.ts index 606d63d70fe..9662a685af7 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -4,7 +4,7 @@ import Pokemon, { EnemyPokemon, PlayerPokemon } from "../field/pokemon"; import { pokemonEvolutions, pokemonPrevolutions } from "../data/pokemon-evolutions"; import PokemonSpecies, { allSpecies, getPokemonSpecies, noStarterFormKeys, speciesStarters } from "../data/pokemon-species"; import * as Utils from "../utils"; -import * as Overrides from "../overrides"; +import Overrides from "#app/overrides"; import PokemonData from "./pokemon-data"; import PersistentModifierData from "./modifier-data"; import ArenaData from "./arena-data"; @@ -40,6 +40,8 @@ import { GameDataType } from "#enums/game-data-type"; import { Moves } from "#enums/moves"; import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; +import { applyChallenges, ChallengeType } from "#app/data/challenge.js"; +import { Abilities } from "#app/enums/abilities.js"; import { MysteryEncounterData } from "../data/mystery-encounters/mystery-encounter-data"; import IMysteryEncounter from "../data/mystery-encounters/mystery-encounter"; @@ -576,6 +578,8 @@ export class GameData { // Account for past key oversight dataStr = dataStr.replace(/\$pAttr/g, "$pa"); } + dataStr = dataStr.replace(/"trainerId":\d+/g, `"trainerId":${this.trainerId}`); + dataStr = dataStr.replace(/"secretId":\d+/g, `"secretId":${this.secretId}`); const fromKeys = shorten ? Object.keys(systemShortKeys) : Object.values(systemShortKeys); const toKeys = shorten ? Object.values(systemShortKeys) : Object.keys(systemShortKeys); for (const k in fromKeys) { @@ -854,6 +858,14 @@ export class GameData { const handleSessionData = async (sessionDataStr: string) => { try { const sessionData = this.parseSessionData(sessionDataStr); + for (let i = 0; i <= 5; i++) { + const speciesToCheck = getPokemonSpecies(sessionData.party[i]?.species); + if (sessionData.party[i]?.abilityIndex === 1) { + if (speciesToCheck.ability1 === speciesToCheck.ability2 && speciesToCheck.abilityHidden !== Abilities.NONE && speciesToCheck.abilityHidden !== speciesToCheck.ability1) { + sessionData.party[i].abilityIndex = 2; + } + } + } resolve(sessionData); } catch (err) { reject(err); @@ -1693,7 +1705,10 @@ export class GameData { value = decrementValue(value); } - return value; + const cost = new Utils.NumberHolder(value); + applyChallenges(this.scene.gameMode, ChallengeType.STARTER_COST, speciesId, cost); + + return cost.value; } getFormIndex(attr: bigint): integer { diff --git a/src/system/game-stats.ts b/src/system/game-stats.ts index 4c3f40e5d1e..a8b74f29bb7 100644 --- a/src/system/game-stats.ts +++ b/src/system/game-stats.ts @@ -58,9 +58,9 @@ export class GameStats { this.pokemonCaught = source?.pokemonCaught || 0; this.pokemonHatched = source?.pokemonHatched || 0; // Currently handled by migration - this.subLegendaryPokemonSeen = source?.subLegendaryPokemonSeen; - this.subLegendaryPokemonCaught = source?.subLegendaryPokemonCaught; - this.subLegendaryPokemonHatched = source?.subLegendaryPokemonHatched; + this.subLegendaryPokemonSeen = source?.subLegendaryPokemonSeen ?? 0; + this.subLegendaryPokemonCaught = source?.subLegendaryPokemonCaught ?? 0; + this.subLegendaryPokemonHatched = source?.subLegendaryPokemonHatched ?? 0; this.legendaryPokemonSeen = source?.legendaryPokemonSeen || 0; this.legendaryPokemonCaught = source?.legendaryPokemonCaught || 0; this.legendaryPokemonHatched = source?.legendaryPokemonHatched || 0; diff --git a/src/system/pokemon-data.ts b/src/system/pokemon-data.ts index 57f4c0aea93..7e8f1e21c07 100644 --- a/src/system/pokemon-data.ts +++ b/src/system/pokemon-data.ts @@ -17,6 +17,7 @@ export default class PokemonData { public id: integer; public player: boolean; public species: Species; + public nickname: string; public formIndex: integer; public abilityIndex: integer; public passive: boolean; @@ -59,6 +60,7 @@ export default class PokemonData { this.id = source.id; this.player = sourcePokemon ? sourcePokemon.isPlayer() : source.player; this.species = sourcePokemon ? sourcePokemon.species.speciesId : source.species; + this.nickname = sourcePokemon ? sourcePokemon.nickname : source.nickname; this.formIndex = Math.max(Math.min(source.formIndex, getPokemonSpecies(this.species).forms.length - 1), 0); this.abilityIndex = source.abilityIndex; this.passive = source.passive; @@ -141,7 +143,11 @@ export default class PokemonData { toPokemon(scene: BattleScene, battleType?: BattleType, partyMemberIndex: integer = 0, double: boolean = 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) + ? 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); if (this.summonData) { ret.primeSummonData(this.summonData); diff --git a/src/system/settings/settings.ts b/src/system/settings/settings.ts index b09de095259..af27613136c 100644 --- a/src/system/settings/settings.ts +++ b/src/system/settings/settings.ts @@ -16,6 +16,13 @@ const VOLUME_OPTIONS: SettingOption[] = new Array(11).fill(null).map((_, i) => i 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(); + return { + value, + label: value, + }; +}); const OFF_ON: SettingOption[] = [ { value: "Off", @@ -98,6 +105,7 @@ export const SettingKeys = { SE_Volume: "SE_VOLUME", Music_Preference: "MUSIC_PREFERENCE", Show_BGM_Bar: "SHOW_BGM_BAR", + Shop_Overlay_Opacity: "SHOP_OVERLAY_OPACITY" }; /** @@ -493,9 +501,8 @@ export const Setting: Array = [ key: SettingKeys.Show_BGM_Bar, label: i18next.t("settings:showBgmBar"), options: OFF_ON, - default: 0, - type: SettingType.DISPLAY, - requireReload: true + default: 1, + type: SettingType.DISPLAY }, { key: SettingKeys.Master_Volume, @@ -535,7 +542,14 @@ export const Setting: Array = [ type: SettingType.AUDIO, requireReload: true }, - + { + key: SettingKeys.Shop_Overlay_Opacity, + label: i18next.t("settings:shopOverlayOpacity"), + options: SHOP_OVERLAY_OPACITY_OPTIONS, + default: 7, + type: SettingType.DISPLAY, + requireReload: false + }, ]; /** @@ -760,6 +774,9 @@ export function setSetting(scene: BattleScene, setting: string, value: integer): } } break; + case SettingKeys.Shop_Overlay_Opacity: + scene.updateShopOverlayOpacity(parseInt(Setting[index].options[value].value) * .01); + break; } return true; diff --git a/src/test/abilities/ability_timing.test.ts b/src/test/abilities/ability_timing.test.ts new file mode 100644 index 00000000000..84d4390652e --- /dev/null +++ b/src/test/abilities/ability_timing.test.ts @@ -0,0 +1,53 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import Overrides from "#app/overrides"; +import { CommandPhase, MessagePhase, TurnInitPhase } from "#app/phases"; +import { Mode } from "#app/ui/ui"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import i18next, { initI18n } from "#app/plugins/i18n"; + + +describe("Ability Timing", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.PIDGEY); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INTIMIDATE); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(Array(4).fill(Moves.SPLASH)); + + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.ICE_BEAM]); + }); + + it("should trigger after switch check", async() => { + initI18n(); + i18next.changeLanguage("en"); + await game.runToSummon([Species.EEVEE, Species.FEEBAS]); + + game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { + game.setMode(Mode.MESSAGE); + game.endPhase(); + }, () => game.isCurrentPhase(CommandPhase) || game.isCurrentPhase(TurnInitPhase)); + + await game.phaseInterceptor.to(MessagePhase); + const message = game.textInterceptor.getLatestMessage(); + expect(message).toContain("Attack fell"); + }, 5000); +}); diff --git a/src/test/abilities/aura_break.test.ts b/src/test/abilities/aura_break.test.ts index bfd1fdf59fe..28813b5206f 100644 --- a/src/test/abilities/aura_break.test.ts +++ b/src/test/abilities/aura_break.test.ts @@ -1,21 +1,19 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { Species } from "#enums/species"; import { MoveEffectPhase } from "#app/phases"; import { Moves } from "#enums/moves"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; -import Move, { allMoves } from "#app/data/move.js"; -import Pokemon from "#app/field/pokemon.js"; -import { FieldMoveTypePowerBoostAbAttr } from "#app/data/ability.js"; -import { NumberHolder } from "#app/utils.js"; +import { allMoves } from "#app/data/move.js"; describe("Abilities - Aura Break", () => { let phaserGame: Phaser.Game; let game: GameManager; - const multiplier = 9 / 16; + + const auraBreakMultiplier = 9/16 * 4/3; beforeAll(() => { phaserGame = new Phaser.Game({ @@ -29,67 +27,38 @@ describe("Abilities - Aura Break", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.MOONBLAST, Moves.DARK_PULSE, Moves.MOONBLAST, Moves.DARK_PULSE]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.AURA_BREAK); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.MOONBLAST, Moves.DARK_PULSE, Moves.MOONBLAST, Moves.DARK_PULSE]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.AURA_BREAK); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); }); it("reverses the effect of fairy aura", async () => { - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.FAIRY_AURA); - const basePower = allMoves[Moves.MOONBLAST].power; - await game.startBattle([Species.MAGIKARP]); + const moveToCheck = allMoves[Moves.MOONBLAST]; + const basePower = moveToCheck.power; + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.FAIRY_AURA); + vi.spyOn(moveToCheck, "calculateBattlePower"); + + await game.startBattle([Species.PIKACHU]); game.doAttack(getMovePosition(game.scene, 0, Moves.MOONBLAST)); - - const appliedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[Moves.MOONBLAST]); - await game.phaseInterceptor.to(MoveEffectPhase); - expect(appliedPower).not.toBe(undefined); - expect(appliedPower).not.toBe(basePower); - expect(appliedPower).toBe(basePower * multiplier); - + expect(moveToCheck.calculateBattlePower).toHaveReturnedWith(expect.closeTo(basePower * auraBreakMultiplier)); }); it("reverses the effect of dark aura", async () => { - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.DARK_AURA); - const basePower = allMoves[Moves.DARK_PULSE].power; - await game.startBattle([Species.MAGIKARP]); + const moveToCheck = allMoves[Moves.DARK_PULSE]; + const basePower = moveToCheck.power; + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.DARK_AURA); + vi.spyOn(moveToCheck, "calculateBattlePower"); + + await game.startBattle([Species.PIKACHU]); game.doAttack(getMovePosition(game.scene, 0, Moves.DARK_PULSE)); - - const appliedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[Moves.DARK_PULSE]); - await game.phaseInterceptor.to(MoveEffectPhase); - expect(appliedPower).not.toBe(undefined); - expect(appliedPower).not.toBe(basePower); - expect(appliedPower).toBe(basePower * multiplier); + expect(moveToCheck.calculateBattlePower).toHaveReturnedWith(expect.closeTo(basePower * auraBreakMultiplier)); }); }); - -/** - * Calculates the mocked power of a move in a Pokémon battle, taking into account certain abilities. - * - * @param defender - The defending Pokémon. - * @param attacker - The attacking Pokémon. - * @param move - The move being used in the attack. - * @returns The calculated power of the move after applying any relevant ability effects. - * - * @remarks - * This function creates a NumberHolder with the initial power of the move. - * It then checks if the defender has an ability with the FieldMoveTypePowerBoostAbAttr. - * If so, it applies a power modification of 9/16 using an instance of FieldMoveTypePowerBoostAbAttr. - * The final calculated power is then returned. - */ -const getMockedMovePower = (defender: Pokemon, attacker: Pokemon, move: Move): number => { - const powerHolder = new NumberHolder(move.power); - - if (defender.hasAbilityWithAttr(FieldMoveTypePowerBoostAbAttr)) { - const auraBreakInstance = new FieldMoveTypePowerBoostAbAttr(move.type, 9 / 16); - auraBreakInstance.applyPreAttack(attacker, false, defender, move, [powerHolder]); - } - - return powerHolder.value; -}; diff --git a/src/test/abilities/battery.test.ts b/src/test/abilities/battery.test.ts index 53a04732b74..06f388371e9 100644 --- a/src/test/abilities/battery.test.ts +++ b/src/test/abilities/battery.test.ts @@ -1,19 +1,20 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { Species } from "#enums/species"; import { Moves } from "#enums/moves"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; -import Move, { allMoves, MoveCategory } from "#app/data/move.js"; -import { AllyMoveCategoryPowerBoostAbAttr } from "#app/data/ability.js"; -import { NumberHolder } from "#app/utils.js"; -import Pokemon from "#app/field/pokemon.js"; +import { allMoves } from "#app/data/move.js"; +import { Abilities } from "#app/enums/abilities.js"; +import { MoveEffectPhase, TurnEndPhase } from "#app/phases.js"; describe("Abilities - Battery", () => { let phaserGame: Phaser.Game; let game: GameManager; + const batteryMultiplier = 1.3; + beforeAll(() => { phaserGame = new Phaser.Game({ type: Phaser.HEADLESS, @@ -26,95 +27,55 @@ describe("Abilities - Battery", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.ROCK_SLIDE, Moves.SPLASH, Moves.HEAT_WAVE]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.BREAKING_SWIPE, Moves.SPLASH, Moves.DAZZLING_GLEAM]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); }); it("raises the power of allies' special moves by 30%", async () => { - const moveToBeUsed = Moves.HEAT_WAVE; - const basePower = allMoves[moveToBeUsed].power; + const moveToCheck = allMoves[Moves.DAZZLING_GLEAM]; + const basePower = moveToCheck.power; - await game.startBattle([Species.MAGIKARP, Species.CHARJABUG]); + vi.spyOn(moveToCheck, "calculateBattlePower"); - game.doAttack(getMovePosition(game.scene, 0, moveToBeUsed)); + await game.startBattle([Species.PIKACHU, Species.CHARJABUG]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.DAZZLING_GLEAM)); game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + await game.phaseInterceptor.to(MoveEffectPhase); - const multiplier = getAttrPowerMultiplier(game.scene.getPlayerField()[1]); - const mockedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); - - expect(mockedPower).not.toBe(undefined); - expect(mockedPower).not.toBe(basePower); - expect(mockedPower).toBe(basePower * multiplier); + expect(moveToCheck.calculateBattlePower).toHaveReturnedWith(basePower * batteryMultiplier); }); it("does not raise the power of allies' non-special moves", async () => { - const moveToBeUsed = Moves.ROCK_SLIDE; - const basePower = allMoves[moveToBeUsed].power; + const moveToCheck = allMoves[Moves.BREAKING_SWIPE]; + const basePower = moveToCheck.power; - await game.startBattle([Species.MAGIKARP, Species.CHARJABUG]); + vi.spyOn(moveToCheck, "calculateBattlePower"); - game.doAttack(getMovePosition(game.scene, 0, moveToBeUsed)); + await game.startBattle([Species.PIKACHU, Species.CHARJABUG]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.BREAKING_SWIPE)); game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + await game.phaseInterceptor.to(MoveEffectPhase); - const multiplier = getAttrPowerMultiplier(game.scene.getPlayerField()[1]); - const mockedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); - - expect(mockedPower).not.toBe(undefined); - expect(mockedPower).toBe(basePower); - expect(mockedPower).not.toBe(basePower * multiplier); + expect(moveToCheck.calculateBattlePower).toHaveReturnedWith(basePower); }); it("does not raise the power of the ability owner's special moves", async () => { - const moveToBeUsed = Moves.HEAT_WAVE; - const basePower = allMoves[moveToBeUsed].power; + const moveToCheck = allMoves[Moves.DAZZLING_GLEAM]; + const basePower = moveToCheck.power; - await game.startBattle([Species.CHARJABUG, Species.MAGIKARP]); + vi.spyOn(moveToCheck, "calculateBattlePower"); - game.doAttack(getMovePosition(game.scene, 0, moveToBeUsed)); + await game.startBattle([Species.CHARJABUG, Species.PIKACHU]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.DAZZLING_GLEAM)); game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + await game.phaseInterceptor.to(TurnEndPhase); - const multiplier = getAttrPowerMultiplier(game.scene.getPlayerField()[0]); - const mockedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); - - expect(mockedPower).not.toBe(undefined); - expect(mockedPower).toBe(basePower); - expect(mockedPower).not.toBe(basePower * multiplier); + expect(moveToCheck.calculateBattlePower).toHaveReturnedWith(basePower); }); }); - -/** - * Calculates the mocked power of a move. - * Note this does not consider other damage calculations - * except the power multiplier from Battery. - * - * @param defender - The defending Pokémon. - * @param attacker - The attacking Pokémon. - * @param move - The move being used by the attacker. - * @returns The adjusted power of the move. - */ -const getMockedMovePower = (defender: Pokemon, attacker: Pokemon, move: Move) => { - const powerHolder = new NumberHolder(move.power); - - /** - * @see AllyMoveCategoryPowerBoostAbAttr - */ - if (attacker.getAlly().hasAbilityWithAttr(AllyMoveCategoryPowerBoostAbAttr)) { - const batteryInstance = new AllyMoveCategoryPowerBoostAbAttr([MoveCategory.SPECIAL], 1.3); - batteryInstance.applyPreAttack(attacker, false, defender, move, [ powerHolder ]); - } - - return powerHolder.value; -}; - -/** - * Retrieves the power multiplier from a Pokémon's ability attribute. - * - * @param pokemon - The Pokémon whose ability attributes are being queried. - * @returns The power multiplier of the `AllyMoveCategoryPowerBoostAbAttr` attribute. - */ -const getAttrPowerMultiplier = (pokemon: Pokemon) => { - const attr = pokemon.getAbilityAttrs(AllyMoveCategoryPowerBoostAbAttr); - - return (attr[0] as AllyMoveCategoryPowerBoostAbAttr)["powerMultiplier"]; -}; diff --git a/src/test/abilities/battle_bond.test.ts b/src/test/abilities/battle_bond.test.ts index b2ff73f5b76..1ebefb99f32 100644 --- a/src/test/abilities/battle_bond.test.ts +++ b/src/test/abilities/battle_bond.test.ts @@ -1,7 +1,7 @@ import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; import GameManager from "#test/utils/gameManager"; import { getMovePosition } from "#test/utils/gameManagerUtils"; -import * as Overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { Moves } from "#enums/moves"; import { Abilities } from "#enums/abilities"; import { Species } from "#enums/species"; @@ -28,7 +28,7 @@ describe("Abilities - BATTLE BOND", () => { beforeEach(() => { game = new GameManager(phaserGame); const moveToUse = Moves.SPLASH; - vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BATTLE_BOND); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); diff --git a/src/test/abilities/costar.test.ts b/src/test/abilities/costar.test.ts index ecd70088aa2..f26c4f70758 100644 --- a/src/test/abilities/costar.test.ts +++ b/src/test/abilities/costar.test.ts @@ -1,7 +1,7 @@ import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; import GameManager from "../utils/gameManager"; import Phaser from "phaser"; -import * as Overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { BattleStat } from "#app/data/battle-stat.js"; import { CommandPhase, MessagePhase } from "#app/phases.js"; import { getMovePosition } from "../utils/gameManagerUtils"; @@ -27,7 +27,7 @@ describe("Abilities - COSTAR", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.COSTAR); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NASTY_PLOT]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); diff --git a/src/test/abilities/disguise.test.ts b/src/test/abilities/disguise.test.ts index 297aa33e06c..0a542780ebc 100644 --- a/src/test/abilities/disguise.test.ts +++ b/src/test/abilities/disguise.test.ts @@ -1,7 +1,7 @@ import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; import GameManager from "#test/utils/gameManager"; import { getMovePosition } from "#test/utils/gameManagerUtils"; -import * as Overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { Moves } from "#enums/moves"; import { Abilities } from "#enums/abilities"; import { Species } from "#enums/species"; @@ -28,7 +28,7 @@ describe("Abilities - DISGUISE", () => { beforeEach(() => { game = new GameManager(phaserGame); const moveToUse = Moves.SPLASH; - vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.DISGUISE); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); diff --git a/src/test/abilities/dry_skin.test.ts b/src/test/abilities/dry_skin.test.ts index bfb8f45a11f..3d97c414862 100644 --- a/src/test/abilities/dry_skin.test.ts +++ b/src/test/abilities/dry_skin.test.ts @@ -1,7 +1,7 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { TurnEndPhase } from "#app/phases"; import { Moves } from "#enums/moves"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; @@ -24,16 +24,17 @@ describe("Abilities - Dry Skin", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.DRY_SKIN); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.CHARMANDER); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.UNNERVE); - vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.CHANDELURE); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.DRY_SKIN); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.CHARMANDER); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.UNNERVE); + vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.CHANDELURE); }); it("during sunlight, lose 1/8 of maximum health at the end of each turn", async () => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SUNNY_DAY, Moves.SPLASH]); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SUNNY_DAY, Moves.SPLASH]); await game.startBattle(); @@ -54,7 +55,7 @@ describe("Abilities - Dry Skin", () => { }); it("during rain, gain 1/8 of maximum health at the end of each turn", async () => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.RAIN_DANCE, Moves.SPLASH]); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.RAIN_DANCE, Moves.SPLASH]); await game.startBattle(); @@ -77,36 +78,34 @@ describe("Abilities - Dry Skin", () => { }); it("opposing fire attacks do 25% more damage", async () => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.EMBER]); - - // ensure the enemy doesn't die to this - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(30); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.FLAMETHROWER]); await game.startBattle(); const enemy = game.scene.getEnemyPokemon(); - expect(enemy).not.toBe(undefined); + expect(enemy).toBeDefined(); + const initialHP = 1000; + enemy.hp = initialHP; // first turn - vi.spyOn(game.scene, "randBattleSeedInt").mockReturnValue(0); // this makes moves always deal 85% damage - game.doAttack(getMovePosition(game.scene, 0, Moves.EMBER)); + game.doAttack(getMovePosition(game.scene, 0, Moves.FLAMETHROWER)); await game.phaseInterceptor.to(TurnEndPhase); - const fireDamageTakenWithDrySkin = enemy.getMaxHp() - enemy.hp; + const fireDamageTakenWithDrySkin = initialHP - enemy.hp; expect(enemy.hp > 0); - enemy.hp = enemy.getMaxHp(); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + enemy.hp = initialHP; + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); // second turn - game.doAttack(getMovePosition(game.scene, 0, Moves.EMBER)); + game.doAttack(getMovePosition(game.scene, 0, Moves.FLAMETHROWER)); await game.phaseInterceptor.to(TurnEndPhase); - const fireDamageTakenWithoutDrySkin = enemy.getMaxHp() - enemy.hp; + const fireDamageTakenWithoutDrySkin = initialHP - enemy.hp; expect(fireDamageTakenWithDrySkin).toBeGreaterThan(fireDamageTakenWithoutDrySkin); }); it("opposing water attacks heal 1/4 of maximum health and deal no damage", async () => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.WATER_GUN]); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.WATER_GUN]); await game.startBattle(); @@ -121,7 +120,7 @@ describe("Abilities - Dry Skin", () => { }); it("opposing water attacks do not heal if they were protected from", async () => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.WATER_GUN]); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.WATER_GUN]); await game.startBattle(); @@ -129,7 +128,7 @@ describe("Abilities - Dry Skin", () => { expect(enemy).not.toBe(undefined); enemy.hp = 1; - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); game.doAttack(getMovePosition(game.scene, 0, Moves.WATER_GUN)); await game.phaseInterceptor.to(TurnEndPhase); @@ -137,7 +136,7 @@ describe("Abilities - Dry Skin", () => { }); it("multi-strike water attacks only heal once", async () => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.WATER_GUN, Moves.WATER_SHURIKEN]); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.WATER_GUN, Moves.WATER_SHURIKEN]); await game.startBattle(); diff --git a/src/test/abilities/hustle.test.ts b/src/test/abilities/hustle.test.ts new file mode 100644 index 00000000000..853dd9bc904 --- /dev/null +++ b/src/test/abilities/hustle.test.ts @@ -0,0 +1,99 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { DamagePhase, MoveEffectPhase } from "#app/phases.js"; +import { Abilities } from "#app/enums/abilities.js"; +import { Stat } from "#app/enums/stat.js"; +import { allMoves } from "#app/data/move.js"; + +describe("Abilities - Hustle", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HUSTLE); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.GIGA_DRAIN, Moves.FISSURE]); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(5); + vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(5); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + }); + + it("increases the user's Attack stat by 50%", async () => { + await game.startBattle([Species.PIKACHU]); + const pikachu = game.scene.getPlayerPokemon(); + const atk = pikachu.stats[Stat.ATK]; + + vi.spyOn(pikachu, "getBattleStat"); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + await game.phaseInterceptor.to(MoveEffectPhase, false); + vi.spyOn(game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValue(true); + await game.phaseInterceptor.to(DamagePhase); + + expect(pikachu.getBattleStat).toHaveReturnedWith(atk * 1.5); + }); + + it("lowers the accuracy of the user's physical moves by 20%", async () => { + await game.startBattle([Species.PIKACHU]); + const pikachu = game.scene.getPlayerPokemon(); + + vi.spyOn(pikachu, "getAccuracyMultiplier"); + + game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(pikachu.getAccuracyMultiplier).toHaveReturnedWith(0.8); + }); + + it("does not affect non-physical moves", async () => { + await game.startBattle([Species.PIKACHU]); + const pikachu = game.scene.getPlayerPokemon(); + const spatk = pikachu.stats[Stat.SPATK]; + + vi.spyOn(pikachu, "getBattleStat"); + vi.spyOn(pikachu, "getAccuracyMultiplier"); + + game.doAttack(getMovePosition(game.scene, 0, Moves.GIGA_DRAIN)); + await game.phaseInterceptor.to(DamagePhase); + + expect(pikachu.getBattleStat).toHaveReturnedWith(spatk); + expect(pikachu.getAccuracyMultiplier).toHaveReturnedWith(1); + }); + + it("does not affect OHKO moves", async () => { + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(30); + + await game.startBattle([Species.PIKACHU]); + const pikachu = game.scene.getPlayerPokemon(); + const enemyPokemon = game.scene.getEnemyPokemon(); + + vi.spyOn(pikachu, "getAccuracyMultiplier"); + vi.spyOn(allMoves[Moves.FISSURE], "calculateBattleAccuracy"); + + game.doAttack(getMovePosition(game.scene, 0, Moves.FISSURE)); + await game.phaseInterceptor.to(DamagePhase); + + expect(enemyPokemon.turnData.damageTaken).toBe(enemyPokemon.getMaxHp()); + expect(pikachu.getAccuracyMultiplier).toHaveReturnedWith(1); + expect(allMoves[Moves.FISSURE].calculateBattleAccuracy).toHaveReturnedWith(100); + }); +}); diff --git a/src/test/abilities/ice_face.test.ts b/src/test/abilities/ice_face.test.ts index 7d85f5bbc55..1b00ef748eb 100644 --- a/src/test/abilities/ice_face.test.ts +++ b/src/test/abilities/ice_face.test.ts @@ -1,7 +1,7 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { Species } from "#enums/species"; import { MoveEffectPhase, @@ -33,10 +33,10 @@ describe("Abilities - Ice Face", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.EISCUE); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ICE_FACE); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.ICE_BEAM, Moves.TOXIC_THREAD, Moves.HAIL]); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.EISCUE); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ICE_FACE); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.ICE_BEAM, Moves.TOXIC_THREAD, Moves.HAIL]); }); it("takes no damage from physical move and transforms to Noice", async () => { @@ -48,14 +48,14 @@ describe("Abilities - Ice Face", () => { const eiscue = game.scene.getEnemyPokemon(); - expect(eiscue.hp).equals(eiscue.getMaxHp()); + expect(eiscue.isFullHp()).toBe(true); expect(eiscue.formIndex).toBe(noiceForm); expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBe(undefined); }); it("takes no damage from the first hit of multihit physical move and transforms to Noice", async () => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SURGING_STRIKES]); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(1); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SURGING_STRIKES]); + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(1); await game.startBattle([Species.HITMONLEE]); game.doAttack(getMovePosition(game.scene, 0, Moves.SURGING_STRIKES)); @@ -65,7 +65,7 @@ describe("Abilities - Ice Face", () => { // First hit await game.phaseInterceptor.to(MoveEffectPhase); - expect(eiscue.hp).equals(eiscue.getMaxHp()); + expect(eiscue.isFullHp()).toBe(true); expect(eiscue.formIndex).toBe(icefaceForm); expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBeUndefined(); @@ -109,8 +109,8 @@ describe("Abilities - Ice Face", () => { }); it("transforms to Ice Face when Hail or Snow starts", async () => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.QUICK_ATTACK]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.HAIL, Moves.HAIL, Moves.HAIL, Moves.HAIL]); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.QUICK_ATTACK]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.HAIL, Moves.HAIL, Moves.HAIL, Moves.HAIL]); await game.startBattle([Species.MAGIKARP]); @@ -120,7 +120,7 @@ describe("Abilities - Ice Face", () => { const eiscue = game.scene.getEnemyPokemon(); - expect(eiscue.hp).equals(eiscue.getMaxHp()); + expect(eiscue.isFullHp()).toBe(true); expect(eiscue.formIndex).toBe(noiceForm); expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBe(undefined); @@ -131,8 +131,8 @@ describe("Abilities - Ice Face", () => { }); it("transforms to Ice Face when summoned on arena with active Snow or Hail", async () => { - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SNOWSCAPE]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SNOWSCAPE]); await game.startBattle([Species.EISCUE, Species.NINJASK]); @@ -143,7 +143,7 @@ describe("Abilities - Ice Face", () => { expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBe(undefined); expect(eiscue.formIndex).toBe(noiceForm); - expect(eiscue.hp).equals(eiscue.getMaxHp()); + expect(eiscue.isFullHp()).toBe(true); await game.toNextTurn(); game.doSwitchPokemon(1); @@ -158,8 +158,8 @@ describe("Abilities - Ice Face", () => { }); it("will not revert to its Ice Face if there is already Hail when it changes into Noice", async () => { - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); await game.startBattle([Species.EISCUE]); @@ -178,7 +178,7 @@ describe("Abilities - Ice Face", () => { }); it("persists form change when switched out", async () => { - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK, Moves.QUICK_ATTACK]); await game.startBattle([Species.EISCUE, Species.MAGIKARP]); @@ -189,7 +189,7 @@ describe("Abilities - Ice Face", () => { expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBe(undefined); expect(eiscue.formIndex).toBe(noiceForm); - expect(eiscue.hp).equals(eiscue.getMaxHp()); + expect(eiscue.isFullHp()).toBe(true); await game.toNextTurn(); game.doSwitchPokemon(1); @@ -202,10 +202,10 @@ describe("Abilities - Ice Face", () => { }); it("reverts to Ice Face on arena reset", async () => { - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(4); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(4); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); - vi.spyOn(overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue({ + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(4); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(4); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue({ [Species.EISCUE]: noiceForm, }); @@ -227,7 +227,7 @@ describe("Abilities - Ice Face", () => { }); it("cannot be suppressed", async () => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.GASTRO_ACID]); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.GASTRO_ACID]); await game.startBattle([Species.MAGIKARP]); @@ -243,7 +243,7 @@ describe("Abilities - Ice Face", () => { }); it("cannot be swapped with another ability", async () => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SKILL_SWAP]); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SKILL_SWAP]); await game.startBattle([Species.MAGIKARP]); @@ -259,7 +259,7 @@ describe("Abilities - Ice Face", () => { }); it("cannot be copied", async () => { - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.TRACE); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.TRACE); await game.startBattle([Species.MAGIKARP]); diff --git a/src/test/abilities/intimidate.test.ts b/src/test/abilities/intimidate.test.ts index 4a690e76b56..2ff909def2e 100644 --- a/src/test/abilities/intimidate.test.ts +++ b/src/test/abilities/intimidate.test.ts @@ -1,23 +1,18 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; -import { - CommandPhase, DamagePhase, EncounterPhase, - EnemyCommandPhase, SelectStarterPhase, - TurnInitPhase, -} from "#app/phases"; -import {Mode} from "#app/ui/ui"; -import {BattleStat} from "#app/data/battle-stat"; -import {generateStarter, getMovePosition} from "#app/test/utils/gameManagerUtils"; -import {Command} from "#app/ui/command-ui-handler"; -import {Status, StatusEffect} from "#app/data/status-effect"; -import {GameModes, getGameMode} from "#app/game-mode"; +import Overrides from "#app/overrides"; +import { CommandPhase, DamagePhase, EncounterPhase, EnemyCommandPhase, SelectStarterPhase, TurnInitPhase } from "#app/phases"; +import { Mode } from "#app/ui/ui"; +import { BattleStat } from "#app/data/battle-stat"; +import { generateStarter, getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Command } from "#app/ui/command-ui-handler"; +import { Status, StatusEffect } from "#app/data/status-effect"; +import { GameModes, getGameMode } from "#app/game-mode"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; - describe("Abilities - Intimidate", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -34,24 +29,26 @@ describe("Abilities - Intimidate", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INTIMIDATE); - vi.spyOn(overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INTIMIDATE); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH,Moves.SPLASH,Moves.SPLASH,Moves.SPLASH]); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INTIMIDATE); + vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INTIMIDATE); + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); }); - it("single - wild with switch", async() => { - await game.runToSummon([ - Species.MIGHTYENA, - Species.POOCHYENA, - ]); - game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - game.setMode(Mode.MESSAGE); - game.endPhase(); - }, () => game.isCurrentPhase(CommandPhase) || game.isCurrentPhase(TurnInitPhase)); + it("single - wild with switch", async () => { + await game.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); + game.onNextPrompt( + "CheckSwitchPhase", + Mode.CONFIRM, + () => { + game.setMode(Mode.MESSAGE); + game.endPhase(); + }, + () => game.isCurrentPhase(CommandPhase) || game.isCurrentPhase(TurnInitPhase) + ); await game.phaseInterceptor.to(CommandPhase, false); expect(game.scene.getParty()[0].species.speciesId).toBe(Species.MIGHTYENA); let battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; @@ -70,16 +67,18 @@ describe("Abilities - Intimidate", () => { expect(battleStatsOpponent[BattleStat.ATK]).toBe(-2); }, 20000); - it("single - boss should only trigger once then switch", async() => { - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(10); - await game.runToSummon([ - Species.MIGHTYENA, - Species.POOCHYENA, - ]); - game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - game.setMode(Mode.MESSAGE); - game.endPhase(); - }, () => game.isCurrentPhase(CommandPhase) || game.isCurrentPhase(TurnInitPhase)); + it("single - boss should only trigger once then switch", async () => { + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(10); + await game.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); + game.onNextPrompt( + "CheckSwitchPhase", + Mode.CONFIRM, + () => { + game.setMode(Mode.MESSAGE); + game.endPhase(); + }, + () => game.isCurrentPhase(CommandPhase) || game.isCurrentPhase(TurnInitPhase) + ); await game.phaseInterceptor.to(CommandPhase, false); let battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1); @@ -97,16 +96,18 @@ describe("Abilities - Intimidate", () => { expect(battleStatsOpponent[BattleStat.ATK]).toBe(-2); }, 20000); - it("single - trainer should only trigger once with switch", async() => { - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); - await game.runToSummon([ - Species.MIGHTYENA, - Species.POOCHYENA, - ]); - game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - game.setMode(Mode.MESSAGE); - game.endPhase(); - }, () => game.isCurrentPhase(CommandPhase) || game.isCurrentPhase(TurnInitPhase)); + it("single - trainer should only trigger once with switch", async () => { + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); + await game.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); + game.onNextPrompt( + "CheckSwitchPhase", + Mode.CONFIRM, + () => { + game.setMode(Mode.MESSAGE); + game.endPhase(); + }, + () => game.isCurrentPhase(CommandPhase) || game.isCurrentPhase(TurnInitPhase) + ); await game.phaseInterceptor.to(CommandPhase, false); let battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1); @@ -124,18 +125,19 @@ describe("Abilities - Intimidate", () => { expect(battleStatsOpponent[BattleStat.ATK]).toBe(-2); }, 200000); - it("double - trainer should only trigger once per pokemon", async() => { - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); - await game.runToSummon([ - Species.MIGHTYENA, - Species.POOCHYENA, - ]); - game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - game.setMode(Mode.MESSAGE); - game.endPhase(); - }, () => game.isCurrentPhase(CommandPhase) || game.isCurrentPhase(TurnInitPhase)); + it("double - trainer should only trigger once per pokemon", async () => { + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); + await game.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); + game.onNextPrompt( + "CheckSwitchPhase", + Mode.CONFIRM, + () => { + game.setMode(Mode.MESSAGE); + game.endPhase(); + }, + () => game.isCurrentPhase(CommandPhase) || game.isCurrentPhase(TurnInitPhase) + ); await game.phaseInterceptor.to(CommandPhase, false); const battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; expect(battleStatsOpponent[BattleStat.ATK]).toBe(-2); @@ -149,18 +151,19 @@ describe("Abilities - Intimidate", () => { expect(battleStatsPokemon2[BattleStat.ATK]).toBe(-2); }, 20000); - it("double - wild: should only trigger once per pokemon", async() => { - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); - await game.runToSummon([ - Species.MIGHTYENA, - Species.POOCHYENA, - ]); - game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - game.setMode(Mode.MESSAGE); - game.endPhase(); - }, () => game.isCurrentPhase(CommandPhase) || game.isCurrentPhase(TurnInitPhase)); + it("double - wild: should only trigger once per pokemon", async () => { + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); + await game.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); + game.onNextPrompt( + "CheckSwitchPhase", + Mode.CONFIRM, + () => { + game.setMode(Mode.MESSAGE); + game.endPhase(); + }, + () => game.isCurrentPhase(CommandPhase) || game.isCurrentPhase(TurnInitPhase) + ); await game.phaseInterceptor.to(CommandPhase, false); const battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; expect(battleStatsOpponent[BattleStat.ATK]).toBe(-2); @@ -174,18 +177,19 @@ describe("Abilities - Intimidate", () => { expect(battleStatsPokemon2[BattleStat.ATK]).toBe(-2); }, 20000); - it("double - boss: should only trigger once per pokemon", async() => { - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(10); - await game.runToSummon([ - Species.MIGHTYENA, - Species.POOCHYENA, - ]); - game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { - game.setMode(Mode.MESSAGE); - game.endPhase(); - }, () => game.isCurrentPhase(CommandPhase) || game.isCurrentPhase(TurnInitPhase)); + it("double - boss: should only trigger once per pokemon", async () => { + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(10); + await game.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); + game.onNextPrompt( + "CheckSwitchPhase", + Mode.CONFIRM, + () => { + game.setMode(Mode.MESSAGE); + game.endPhase(); + }, + () => game.isCurrentPhase(CommandPhase) || game.isCurrentPhase(TurnInitPhase) + ); await game.phaseInterceptor.to(CommandPhase, false); const battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; expect(battleStatsOpponent[BattleStat.ATK]).toBe(-2); @@ -199,13 +203,10 @@ describe("Abilities - Intimidate", () => { expect(battleStatsPokemon2[BattleStat.ATK]).toBe(-2); }, 20000); - it("single - wild next wave opp triger once, us: none", async() => { - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(2); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.AERIAL_ACE]); - await game.startBattle([ - Species.MIGHTYENA, - Species.POOCHYENA, - ]); + it("single - wild next wave opp triger once, us: none", async () => { + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(2); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.AERIAL_ACE]); + await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); let battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1); let battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats; @@ -228,13 +229,10 @@ describe("Abilities - Intimidate", () => { expect(battleStatsOpponent[BattleStat.ATK]).toBe(0); }, 20000); - it("single - wild next turn - no retrigger on next turn", async() => { - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(2); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); - await game.startBattle([ - Species.MIGHTYENA, - Species.POOCHYENA, - ]); + it("single - wild next turn - no retrigger on next turn", async () => { + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(2); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); + await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); let battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1); let battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats; @@ -255,14 +253,11 @@ describe("Abilities - Intimidate", () => { expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1); }, 20000); - it("single - trainer should only trigger once and each time he switch", async() => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.VOLT_SWITCH,Moves.VOLT_SWITCH,Moves.VOLT_SWITCH,Moves.VOLT_SWITCH]); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); - await game.startBattle([ - Species.MIGHTYENA, - Species.POOCHYENA, - ]); + it("single - trainer should only trigger once and each time he switch", async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.VOLT_SWITCH, Moves.VOLT_SWITCH, Moves.VOLT_SWITCH, Moves.VOLT_SWITCH]); + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); + await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); let battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1); let battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats; @@ -282,7 +277,6 @@ describe("Abilities - Intimidate", () => { battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; expect(battleStatsOpponent[BattleStat.ATK]).toBe(0); - game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); }); @@ -298,14 +292,11 @@ describe("Abilities - Intimidate", () => { expect(battleStatsOpponent[BattleStat.ATK]).toBe(0); }, 200000); - it("single - trainer should only trigger once whatever turn we are", async() => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH,Moves.SPLASH,Moves.SPLASH,Moves.SPLASH]); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); - await game.startBattle([ - Species.MIGHTYENA, - Species.POOCHYENA, - ]); + it("single - trainer should only trigger once whatever turn we are", async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); + await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]); let battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1); let battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats; @@ -325,7 +316,6 @@ describe("Abilities - Intimidate", () => { battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1); - game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); }); @@ -341,13 +331,14 @@ describe("Abilities - Intimidate", () => { expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1); }, 20000); - it("double - wild vs only 1 on player side", async() => { - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); - await game.runToSummon([ - Species.MIGHTYENA, - ]); + it("double - wild vs only 1 on player side", async () => { + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); + vi.spyOn(Overrides, "OPP_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "COIN_CASE" }]); + await game.runToSummon([Species.MIGHTYENA]); + // Get rid of any modifiers that may alter power + game.scene.clearEnemyHeldItemModifiers(); + game.scene.clearEnemyModifiers(); await game.phaseInterceptor.to(CommandPhase, false); const battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats; expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1); @@ -358,18 +349,14 @@ describe("Abilities - Intimidate", () => { expect(battleStatsPokemon[BattleStat.ATK]).toBe(-2); }, 20000); - it("double - wild vs only 1 alive on player side", async() => { - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); + it("double - wild vs only 1 alive on player side", async () => { + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); await game.runToTitle(); game.onNextPrompt("TitlePhase", Mode.TITLE, () => { game.scene.gameMode = getGameMode(GameModes.CLASSIC); - const starters = generateStarter(game.scene, [ - Species.MIGHTYENA, - Species.POOCHYENA, - ]); + const starters = generateStarter(game.scene, [Species.MIGHTYENA, Species.POOCHYENA]); const selectStarterPhase = new SelectStarterPhase(game.scene); game.scene.pushPhase(new EncounterPhase(game.scene, false)); selectStarterPhase.initBattle(starters); diff --git a/src/test/abilities/intrepid_sword.test.ts b/src/test/abilities/intrepid_sword.test.ts index 2d51642be70..1fae6555688 100644 --- a/src/test/abilities/intrepid_sword.test.ts +++ b/src/test/abilities/intrepid_sword.test.ts @@ -1,7 +1,7 @@ import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import {Abilities} from "#enums/abilities"; import {Species} from "#enums/species"; import { @@ -26,10 +26,10 @@ describe("Abilities - Intrepid Sword", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.ZACIAN); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INTREPID_SWORD); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INTREPID_SWORD); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.ZACIAN); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INTREPID_SWORD); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INTREPID_SWORD); }); it("INTREPID SWORD on player", async() => { diff --git a/src/test/abilities/libero.test.ts b/src/test/abilities/libero.test.ts index a00239a651b..015e6a44e24 100644 --- a/src/test/abilities/libero.test.ts +++ b/src/test/abilities/libero.test.ts @@ -1,7 +1,7 @@ import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; import GameManager from "../utils/gameManager"; -import * as Overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; @@ -32,7 +32,7 @@ describe("Abilities - Protean", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.LIBERO); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); @@ -197,7 +197,7 @@ describe("Abilities - Protean", () => { await game.phaseInterceptor.to(TurnEndPhase); const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + expect(enemyPokemon.isFullHp()).toBe(true); testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TACKLE); }, TIMEOUT, diff --git a/src/test/abilities/moxie.test.ts b/src/test/abilities/moxie.test.ts index 46fc4e5c34c..f7b7fe22027 100644 --- a/src/test/abilities/moxie.test.ts +++ b/src/test/abilities/moxie.test.ts @@ -1,7 +1,7 @@ import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { CommandPhase, EnemyCommandPhase, @@ -34,13 +34,13 @@ describe("Abilities - Moxie", () => { beforeEach(() => { game = new GameManager(phaserGame); const moveToUse = Moves.AERIAL_ACE; - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MOXIE); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MOXIE); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MOXIE); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MOXIE); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); it("MOXIE", async() => { diff --git a/src/test/abilities/parental_bond.test.ts b/src/test/abilities/parental_bond.test.ts index 4401ee0d40a..f29eafc72f6 100644 --- a/src/test/abilities/parental_bond.test.ts +++ b/src/test/abilities/parental_bond.test.ts @@ -1,7 +1,7 @@ import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; import GameManager from "../utils/gameManager"; -import * as Overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; @@ -30,7 +30,8 @@ describe("Abilities - Parental Bond", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.PARENTAL_BOND); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); @@ -57,7 +58,6 @@ describe("Abilities - Parental Bond", () => { game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); await game.phaseInterceptor.to(MoveEffectPhase, false); - vi.spyOn(game.scene, "randBattleSeedInt").mockReturnValue(15); await game.phaseInterceptor.to(DamagePhase); const firstStrikeDamage = enemyStartingHp - enemyPokemon.hp; @@ -238,8 +238,7 @@ describe("Abilities - Parental Bond", () => { test( "ability should not apply to multi-target moves", async () => { - vi.spyOn(Overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.EARTHQUAKE]); await game.startBattle([Species.CHARIZARD, Species.PIDGEOT]); @@ -449,7 +448,7 @@ describe("Abilities - Parental Bond", () => { ); /** TODO: Fix TRAPPED tag lapsing incorrectly, then run this test */ - test.skip( + test( "Anchor Shot boosted by this ability should only trap the target after the second hit", async () => { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ANCHOR_SHOT]); @@ -613,8 +612,7 @@ describe("Abilities - Parental Bond", () => { test( "ability should not apply to multi-target moves with Multi-Lens", async () => { - vi.spyOn(Overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.EARTHQUAKE, Moves.SPLASH]); vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS", count: 1}]); @@ -636,7 +634,6 @@ describe("Abilities - Parental Bond", () => { game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); await game.phaseInterceptor.to(MoveEffectPhase, false); - vi.spyOn(game.scene, "randBattleSeedInt").mockReturnValue(15); await game.phaseInterceptor.to(DamagePhase); const enemyFirstHitDamage = enemyStartingHp.map((hp, i) => hp - enemyPokemon[i].hp); diff --git a/src/test/abilities/power_construct.test.ts b/src/test/abilities/power_construct.test.ts index 68a360a60a2..48c92c0e2d1 100644 --- a/src/test/abilities/power_construct.test.ts +++ b/src/test/abilities/power_construct.test.ts @@ -1,7 +1,7 @@ import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; import GameManager from "#test/utils/gameManager"; import { getMovePosition } from "#test/utils/gameManagerUtils"; -import * as Overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { Moves } from "#enums/moves"; import { Abilities } from "#enums/abilities"; import { Species } from "#enums/species"; @@ -28,7 +28,7 @@ describe("Abilities - POWER CONSTRUCT", () => { beforeEach(() => { game = new GameManager(phaserGame); const moveToUse = Moves.SPLASH; - vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.POWER_CONSTRUCT); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); diff --git a/src/test/abilities/power_spot.test.ts b/src/test/abilities/power_spot.test.ts index 0ed2b10f4be..1947cfc9c4f 100644 --- a/src/test/abilities/power_spot.test.ts +++ b/src/test/abilities/power_spot.test.ts @@ -1,19 +1,20 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { Species } from "#enums/species"; import { Moves } from "#enums/moves"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; -import Move, { allMoves, MoveCategory } from "#app/data/move.js"; -import { AllyMoveCategoryPowerBoostAbAttr } from "#app/data/ability.js"; -import { NumberHolder } from "#app/utils.js"; -import Pokemon from "#app/field/pokemon.js"; +import { allMoves } from "#app/data/move.js"; +import { MoveEffectPhase, TurnEndPhase } from "#app/phases.js"; +import { Abilities } from "#app/enums/abilities.js"; describe("Abilities - Power Spot", () => { let phaserGame: Phaser.Game; let game: GameManager; + const powerSpotMultiplier = 1.3; + beforeAll(() => { phaserGame = new Phaser.Game({ type: Phaser.HEADLESS, @@ -26,95 +27,52 @@ describe("Abilities - Power Spot", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.ROCK_SLIDE, Moves.SPLASH, Moves.HEAT_WAVE]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.BREAKING_SWIPE, Moves.SPLASH, Moves.DAZZLING_GLEAM]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); }); it("raises the power of allies' special moves by 30%", async () => { - const moveToBeUsed = Moves.HEAT_WAVE; - const basePower = allMoves[moveToBeUsed].power; + const moveToCheck = allMoves[Moves.DAZZLING_GLEAM]; + const basePower = moveToCheck.power; - await game.startBattle([Species.MAGIKARP, Species.STONJOURNER]); + vi.spyOn(moveToCheck, "calculateBattlePower"); - game.doAttack(getMovePosition(game.scene, 0, moveToBeUsed)); + await game.startBattle([Species.PIKACHU, Species.STONJOURNER]); + game.doAttack(getMovePosition(game.scene, 0, Moves.DAZZLING_GLEAM)); game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + await game.phaseInterceptor.to(MoveEffectPhase); - const multiplier = getAttrPowerMultiplier(game.scene.getPlayerField()[1]); - const mockedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); - - expect(mockedPower).not.toBe(undefined); - expect(mockedPower).not.toBe(basePower); - expect(mockedPower).toBe(basePower * multiplier); + expect(moveToCheck.calculateBattlePower).toHaveReturnedWith(basePower * powerSpotMultiplier); }); it("raises the power of allies' physical moves by 30%", async () => { - const moveToBeUsed = Moves.ROCK_SLIDE; - const basePower = allMoves[moveToBeUsed].power; + const moveToCheck = allMoves[Moves.BREAKING_SWIPE]; + const basePower = moveToCheck.power; - await game.startBattle([Species.MAGIKARP, Species.STONJOURNER]); + vi.spyOn(moveToCheck, "calculateBattlePower"); - game.doAttack(getMovePosition(game.scene, 0, moveToBeUsed)); + await game.startBattle([Species.PIKACHU, Species.STONJOURNER]); + game.doAttack(getMovePosition(game.scene, 0, Moves.BREAKING_SWIPE)); game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + await game.phaseInterceptor.to(MoveEffectPhase); - const multiplier = getAttrPowerMultiplier(game.scene.getPlayerField()[1]); - const mockedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); - - expect(mockedPower).not.toBe(undefined); - expect(mockedPower).not.toBe(basePower); - expect(mockedPower).toBe(basePower * multiplier); + expect(moveToCheck.calculateBattlePower).toHaveReturnedWith(basePower * powerSpotMultiplier); }); it("does not raise the power of the ability owner's moves", async () => { - const moveToBeUsed = Moves.HEAT_WAVE; - const basePower = allMoves[moveToBeUsed].power; + const moveToCheck = allMoves[Moves.BREAKING_SWIPE]; + const basePower = moveToCheck.power; - await game.startBattle([Species.STONJOURNER, Species.MAGIKARP]); + vi.spyOn(moveToCheck, "calculateBattlePower"); - game.doAttack(getMovePosition(game.scene, 0, moveToBeUsed)); + await game.startBattle([Species.STONJOURNER, Species.PIKACHU]); + game.doAttack(getMovePosition(game.scene, 0, Moves.BREAKING_SWIPE)); game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + await game.phaseInterceptor.to(TurnEndPhase); - const multiplier = getAttrPowerMultiplier(game.scene.getPlayerField()[0]); - const mockedPower = getMockedMovePower(game.scene.getEnemyField()[0], game.scene.getPlayerField()[0], allMoves[moveToBeUsed]); - - expect(mockedPower).not.toBe(undefined); - expect(mockedPower).toBe(basePower); - expect(mockedPower).not.toBe(basePower * multiplier); + expect(moveToCheck.calculateBattlePower).toHaveReturnedWith(basePower); }); }); - -/** - * Calculates the mocked power of a move. - * Note this does not consider other damage calculations - * except the power multiplier from Power Spot. - * - * @param defender - The defending Pokémon. - * @param attacker - The attacking Pokémon. - * @param move - The move being used by the attacker. - * @returns The adjusted power of the move. - */ -const getMockedMovePower = (defender: Pokemon, attacker: Pokemon, move: Move) => { - const powerHolder = new NumberHolder(move.power); - - /** - * @see AllyMoveCategoryPowerBoostAbAttr - */ - if (attacker.getAlly().hasAbilityWithAttr(AllyMoveCategoryPowerBoostAbAttr)) { - const powerSpotInstance = new AllyMoveCategoryPowerBoostAbAttr([MoveCategory.SPECIAL, MoveCategory.PHYSICAL], 1.3); - powerSpotInstance.applyPreAttack(attacker, false, defender, move, [ powerHolder ]); - } - - return powerHolder.value; -}; - -/** - * Retrieves the power multiplier from a Pokémon's ability attribute. - * - * @param pokemon - The Pokémon whose ability attributes are being queried. - * @returns The power multiplier of the `AllyMoveCategoryPowerBoostAbAttr` attribute. - */ -const getAttrPowerMultiplier = (pokemon: Pokemon) => { - const attr = pokemon.getAbilityAttrs(AllyMoveCategoryPowerBoostAbAttr); - - return (attr[0] as AllyMoveCategoryPowerBoostAbAttr)["powerMultiplier"]; -}; diff --git a/src/test/abilities/protean.test.ts b/src/test/abilities/protean.test.ts index 125c03eb39c..6255a2bc2b2 100644 --- a/src/test/abilities/protean.test.ts +++ b/src/test/abilities/protean.test.ts @@ -1,7 +1,7 @@ import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; import GameManager from "../utils/gameManager"; -import * as Overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; @@ -32,7 +32,7 @@ describe("Abilities - Protean", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.PROTEAN); vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); @@ -197,7 +197,7 @@ describe("Abilities - Protean", () => { await game.phaseInterceptor.to(TurnEndPhase); const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + expect(enemyPokemon.isFullHp()).toBe(true); testPokemonTypeMatchesDefaultMoveType(leadPokemon, Moves.TACKLE); }, TIMEOUT, diff --git a/src/test/abilities/quick_draw.test.ts b/src/test/abilities/quick_draw.test.ts index aa66d7e052f..9e6a39b86c9 100644 --- a/src/test/abilities/quick_draw.test.ts +++ b/src/test/abilities/quick_draw.test.ts @@ -1,6 +1,6 @@ import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as Overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { Abilities } from "#enums/abilities"; import { Species } from "#enums/species"; import { FaintPhase } from "#app/phases"; @@ -25,18 +25,22 @@ describe("Abilities - Quick Draw", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + + vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.QUICK_DRAW); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TAIL_WHIP]); + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(Array(4).fill(Moves.TACKLE)); vi.spyOn(allAbilities[Abilities.QUICK_DRAW].getAttrs(BypassSpeedChanceAbAttr)[0], "chance", "get").mockReturnValue(100); }); test("makes pokemon going first in its priority bracket", async () => { - await game.startBattle([Species.SLOWBRO]); + await game.startBattle(); const pokemon = game.scene.getPlayerPokemon(); const enemy = game.scene.getEnemyPokemon(); @@ -52,8 +56,11 @@ describe("Abilities - Quick Draw", () => { expect(pokemon.battleData.abilitiesApplied).contain(Abilities.QUICK_DRAW); }, 20000); - test("does not triggered by non damage moves", { timeout: 20000, retry: 5 }, async () => { - await game.startBattle([Species.SLOWBRO]); + test("does not triggered by non damage moves", { + timeout: 20000, + retry: 5 + }, async () => { + await game.startBattle(); const pokemon = game.scene.getPlayerPokemon(); const enemy = game.scene.getEnemyPokemon(); @@ -67,12 +74,13 @@ describe("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 () => { vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(Array(4).fill(Moves.EXTREME_SPEED)); - await game.startBattle([Species.SLOWBRO]); + await game.startBattle(); const pokemon = game.scene.getPlayerPokemon(); const enemy = game.scene.getEnemyPokemon(); diff --git a/src/test/abilities/sand_veil.test.ts b/src/test/abilities/sand_veil.test.ts index 221d48d3ca1..ea75027101a 100644 --- a/src/test/abilities/sand_veil.test.ts +++ b/src/test/abilities/sand_veil.test.ts @@ -1,7 +1,7 @@ import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; import GameManager from "../utils/gameManager"; -import * as Overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; @@ -29,7 +29,7 @@ describe("Abilities - Sand Veil", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEOWSCARADA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); @@ -76,7 +76,7 @@ describe("Abilities - Sand Veil", () => { await game.phaseInterceptor.to(MoveEndPhase, false); - expect(leadPokemon[0].hp).toBe(leadPokemon[0].getMaxHp()); + expect(leadPokemon[0].isFullHp()).toBe(true); expect(leadPokemon[1].hp).toBeLessThan(leadPokemon[1].getMaxHp()); }, TIMEOUT ); diff --git a/src/test/abilities/sap_sipper.test.ts b/src/test/abilities/sap_sipper.test.ts index 403ac1bf4ff..9fa2001a6ad 100644 --- a/src/test/abilities/sap_sipper.test.ts +++ b/src/test/abilities/sap_sipper.test.ts @@ -1,7 +1,7 @@ import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { MoveEndPhase, TurnEndPhase, } from "#app/phases"; @@ -30,18 +30,18 @@ describe("Abilities - Sap Sipper", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); }); it("raise attack 1 level and block effects when activated against a grass attack", async() => { const moveToUse = Moves.LEAFAGE; const enemyAbility = Abilities.SAP_SIPPER; - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.DUSKULL); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(enemyAbility); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.DUSKULL); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(enemyAbility); await game.startBattle(); @@ -59,10 +59,10 @@ describe("Abilities - Sap Sipper", () => { const moveToUse = Moves.SPORE; const enemyAbility = Abilities.SAP_SIPPER; - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(enemyAbility); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(enemyAbility); await game.startBattle(); @@ -78,10 +78,10 @@ describe("Abilities - Sap Sipper", () => { const moveToUse = Moves.GRASSY_TERRAIN; const enemyAbility = Abilities.SAP_SIPPER; - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(enemyAbility); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(enemyAbility); await game.startBattle(); @@ -98,10 +98,10 @@ describe("Abilities - Sap Sipper", () => { const moveToUse = Moves.BULLET_SEED; const enemyAbility = Abilities.SAP_SIPPER; - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(enemyAbility); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(enemyAbility); await game.startBattle(); @@ -119,11 +119,11 @@ describe("Abilities - Sap Sipper", () => { const moveToUse = Moves.SPIKY_SHIELD; const ability = Abilities.SAP_SIPPER; - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(ability); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(ability); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); await game.startBattle(); @@ -139,17 +139,16 @@ 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("activate once against multi-hit grass attacks (metronome)", async() => { + it.todo("activate once against multi-hit grass attacks (metronome)", async() => { const moveToUse = Moves.METRONOME; const enemyAbility = Abilities.SAP_SIPPER; - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(enemyAbility); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(enemyAbility); await game.startBattle(); @@ -162,5 +161,4 @@ describe("Abilities - Sap Sipper", () => { expect(startingOppHp - game.scene.getEnemyParty()[0].hp).toBe(0); expect(game.scene.getEnemyParty()[0].summonData.battleStats[BattleStat.ATK]).toBe(1); }); - */ }); diff --git a/src/test/abilities/schooling.test.ts b/src/test/abilities/schooling.test.ts index 4fd64b97246..aac8a3e793f 100644 --- a/src/test/abilities/schooling.test.ts +++ b/src/test/abilities/schooling.test.ts @@ -1,7 +1,7 @@ import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; import GameManager from "#test/utils/gameManager"; import { getMovePosition } from "#test/utils/gameManagerUtils"; -import * as Overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { Moves } from "#enums/moves"; import { Abilities } from "#enums/abilities"; import { Species } from "#enums/species"; @@ -28,7 +28,7 @@ describe("Abilities - SCHOOLING", () => { beforeEach(() => { game = new GameManager(phaserGame); const moveToUse = Moves.SPLASH; - vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SCHOOLING); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); diff --git a/src/test/abilities/screen_cleaner.test.ts b/src/test/abilities/screen_cleaner.test.ts index d790469e952..28253f9aaf6 100644 --- a/src/test/abilities/screen_cleaner.test.ts +++ b/src/test/abilities/screen_cleaner.test.ts @@ -1,7 +1,7 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { Species } from "#enums/species"; import { PostSummonPhase, TurnEndPhase, } from "#app/phases"; import { Moves } from "#enums/moves"; @@ -25,14 +25,14 @@ describe("Abilities - Screen Cleaner", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SCREEN_CLEANER); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SCREEN_CLEANER); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); }); it("removes Aurora Veil", async () => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.HAIL]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL]); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.HAIL]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL]); await game.startBattle([Species.MAGIKARP, Species.MAGIKARP]); @@ -49,7 +49,7 @@ describe("Abilities - Screen Cleaner", () => { }); it("removes Light Screen", async () => { - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN]); await game.startBattle([Species.MAGIKARP, Species.MAGIKARP]); @@ -66,7 +66,7 @@ describe("Abilities - Screen Cleaner", () => { }); it("removes Reflect", async () => { - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.REFLECT, Moves.REFLECT, Moves.REFLECT, Moves.REFLECT]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.REFLECT, Moves.REFLECT, Moves.REFLECT, Moves.REFLECT]); await game.startBattle([Species.MAGIKARP, Species.MAGIKARP]); diff --git a/src/test/abilities/serene_grace.test.ts b/src/test/abilities/serene_grace.test.ts index cf283ea92a8..6530c3ebe15 100644 --- a/src/test/abilities/serene_grace.test.ts +++ b/src/test/abilities/serene_grace.test.ts @@ -1,7 +1,7 @@ import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import {Abilities} from "#enums/abilities"; import {applyAbAttrs ,MoveEffectChanceMultiplierAbAttr} from "#app/data/ability"; import {Species} from "#enums/species"; @@ -34,11 +34,11 @@ describe("Abilities - Serene Grace", () => { beforeEach(() => { game = new GameManager(phaserGame); const movesToUse = [Moves.AIR_SLASH, Moves.TACKLE]; - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.ONIX); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue(movesToUse); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.ONIX); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue(movesToUse); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); it("Move chance without Serene Grace", async() => { @@ -76,7 +76,7 @@ describe("Abilities - Serene Grace", () => { it("Move chance with Serene Grace", async() => { const moveToUse = Moves.AIR_SLASH; - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SERENE_GRACE); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SERENE_GRACE); await game.startBattle([ Species.TOGEKISS ]); diff --git a/src/test/abilities/sheer_force.test.ts b/src/test/abilities/sheer_force.test.ts index c01ec176f4d..46bd92f0d56 100644 --- a/src/test/abilities/sheer_force.test.ts +++ b/src/test/abilities/sheer_force.test.ts @@ -1,7 +1,7 @@ import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import {Abilities} from "#enums/abilities"; import {applyAbAttrs ,applyPreAttackAbAttrs,applyPostDefendAbAttrs, MoveEffectChanceMultiplierAbAttr, MovePowerBoostAbAttr, PostDefendTypeChangeAbAttr} from "#app/data/ability"; import {Species} from "#enums/species"; @@ -34,16 +34,16 @@ describe("Abilities - Sheer Force", () => { beforeEach(() => { game = new GameManager(phaserGame); const movesToUse = [Moves.AIR_SLASH, Moves.BIND, Moves.CRUSH_CLAW, Moves.TACKLE]; - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.ONIX); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue(movesToUse); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.ONIX); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue(movesToUse); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); it("Sheer Force", async() => { const moveToUse = Moves.AIR_SLASH; - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SHEER_FORCE); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SHEER_FORCE); await game.startBattle([ Species.PIDGEOT ]); @@ -82,7 +82,7 @@ describe("Abilities - Sheer Force", () => { it("Sheer Force with exceptions including binding moves", async() => { const moveToUse = Moves.BIND; - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SHEER_FORCE); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SHEER_FORCE); await game.startBattle([ Species.PIDGEOT ]); @@ -121,7 +121,7 @@ describe("Abilities - Sheer Force", () => { it("Sheer Force with moves with no secondary effect", async() => { const moveToUse = Moves.TACKLE; - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SHEER_FORCE); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SHEER_FORCE); await game.startBattle([ Species.PIDGEOT ]); @@ -160,9 +160,9 @@ describe("Abilities - Sheer Force", () => { it("Sheer Force Disabling Specific Abilities", async() => { const moveToUse = Moves.CRUSH_CLAW; - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.COLOR_CHANGE); - vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "KINGS_ROCK", count: 1}]); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SHEER_FORCE); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.COLOR_CHANGE); + vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "KINGS_ROCK", count: 1}]); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SHEER_FORCE); await game.startBattle([ Species.PIDGEOT ]); diff --git a/src/test/abilities/shield_dust.test.ts b/src/test/abilities/shield_dust.test.ts index f52a1d6c7d4..472ba90caf9 100644 --- a/src/test/abilities/shield_dust.test.ts +++ b/src/test/abilities/shield_dust.test.ts @@ -1,7 +1,7 @@ import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { Abilities } from "#enums/abilities"; import {applyAbAttrs ,applyPreDefendAbAttrs,IgnoreMoveEffectsAbAttr,MoveEffectChanceMultiplierAbAttr} from "#app/data/ability"; import {Species} from "#enums/species"; @@ -34,12 +34,12 @@ describe("Abilities - Shield Dust", () => { beforeEach(() => { game = new GameManager(phaserGame); const movesToUse = [Moves.AIR_SLASH]; - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.ONIX); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SHIELD_DUST); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue(movesToUse); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.ONIX); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SHIELD_DUST); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue(movesToUse); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); it("Shield Dust", async() => { diff --git a/src/test/abilities/shields_down.test.ts b/src/test/abilities/shields_down.test.ts index f35fdd9ed79..881a3f4911f 100644 --- a/src/test/abilities/shields_down.test.ts +++ b/src/test/abilities/shields_down.test.ts @@ -1,7 +1,7 @@ import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; import GameManager from "#test/utils/gameManager"; import { getMovePosition } from "#test/utils/gameManagerUtils"; -import * as Overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { Moves } from "#enums/moves"; import { Abilities } from "#enums/abilities"; import { Species } from "#enums/species"; @@ -28,7 +28,7 @@ describe("Abilities - SHIELDS DOWN", () => { beforeEach(() => { game = new GameManager(phaserGame); const moveToUse = Moves.SPLASH; - vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.SHIELDS_DOWN); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); diff --git a/src/test/abilities/steely_spirit.test.ts b/src/test/abilities/steely_spirit.test.ts index e9c673a102a..3e9993a7465 100644 --- a/src/test/abilities/steely_spirit.test.ts +++ b/src/test/abilities/steely_spirit.test.ts @@ -1,21 +1,21 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { Species } from "#enums/species"; import { Moves } from "#enums/moves"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; -import Pokemon, { PlayerPokemon } from "#app/field/pokemon.js"; -import Move, { allMoves } from "#app/data/move.js"; -import { NumberHolder } from "#app/utils.js"; -import { allAbilities, applyPreAttackAbAttrs, UserFieldMoveTypePowerBoostAbAttr } from "#app/data/ability.js"; +import { allMoves } from "#app/data/move.js"; +import { allAbilities } from "#app/data/ability.js"; import { Abilities } from "#app/enums/abilities.js"; +import { MoveEffectPhase, SelectTargetPhase } from "#app/phases.js"; describe("Abilities - Steely Spirit", () => { let phaserGame: Phaser.Game; let game: GameManager; const steelySpiritMultiplier = 1.5; const moveToCheck = Moves.IRON_HEAD; + const ironHeadPower = allMoves[moveToCheck].power; beforeAll(() => { phaserGame = new Phaser.Game({ @@ -29,30 +29,35 @@ describe("Abilities - Steely Spirit", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.IRON_HEAD, Moves.SPLASH]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.IRON_HEAD, Moves.SPLASH]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(allMoves[moveToCheck], "calculateBattlePower"); }); - it("increases Steel-type moves used by the user and its allies", async () => { - await game.startBattle([Species.MAGIKARP, Species.PERRSERKER]); - const perserrker = game.scene.getPlayerField()[1]; + it("increases Steel-type moves' power used by the user and its allies by 50%", async () => { + await game.startBattle([Species.PIKACHU, Species.SHUCKLE]); + const boostSource = game.scene.getPlayerField()[1]; + const enemyToCheck = game.scene.getEnemyPokemon(); - vi.spyOn(perserrker, "getAbility").mockReturnValue(allAbilities[Abilities.STEELY_SPIRIT]); + vi.spyOn(boostSource, "getAbility").mockReturnValue(allAbilities[Abilities.STEELY_SPIRIT]); - expect(perserrker.hasAbility(Abilities.STEELY_SPIRIT)).toBe(true); + expect(boostSource.hasAbility(Abilities.STEELY_SPIRIT)).toBe(true); game.doAttack(getMovePosition(game.scene, 0, moveToCheck)); + await game.phaseInterceptor.to(SelectTargetPhase, false); + game.doSelectTarget(enemyToCheck.getBattlerIndex()); game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + await game.phaseInterceptor.to(MoveEffectPhase); - const mockedMovePower = getMockedMovePower(game.scene.getEnemyPokemon(), perserrker, allMoves[moveToCheck]); - - expect(mockedMovePower).toBe(allMoves[moveToCheck].power * steelySpiritMultiplier); + expect(allMoves[moveToCheck].calculateBattlePower).toHaveReturnedWith(ironHeadPower * steelySpiritMultiplier); }); it("stacks if multiple users with this ability are on the field.", async () => { - await game.startBattle([Species.PERRSERKER, Species.PERRSERKER]); + await game.startBattle([Species.PIKACHU, Species.PIKACHU]); + const enemyToCheck = game.scene.getEnemyPokemon(); game.scene.getPlayerField().forEach(p => { vi.spyOn(p, "getAbility").mockReturnValue(allAbilities[Abilities.STEELY_SPIRIT]); @@ -61,55 +66,35 @@ describe("Abilities - Steely Spirit", () => { expect(game.scene.getPlayerField().every(p => p.hasAbility(Abilities.STEELY_SPIRIT))).toBe(true); game.doAttack(getMovePosition(game.scene, 0, moveToCheck)); - game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + await game.phaseInterceptor.to(SelectTargetPhase, false); + game.doSelectTarget(enemyToCheck.getBattlerIndex()); + game.doAttack(getMovePosition(game.scene, 1, moveToCheck)); + await game.phaseInterceptor.to(SelectTargetPhase, false); + game.doSelectTarget(enemyToCheck.getBattlerIndex()); + await game.phaseInterceptor.to(MoveEffectPhase); - const mockedMovePower = getMockedMovePower(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[moveToCheck]); - - expect(mockedMovePower).toBe(allMoves[moveToCheck].power * Math.pow(steelySpiritMultiplier, 2)); + expect(allMoves[moveToCheck].calculateBattlePower).toHaveReturnedWith(ironHeadPower * Math.pow(steelySpiritMultiplier, 2)); }); it("does not take effect when suppressed", async () => { - await game.startBattle([Species.MAGIKARP, Species.PERRSERKER]); - const perserrker = game.scene.getPlayerField()[1]; + await game.startBattle([Species.PIKACHU, Species.SHUCKLE]); + const boostSource = game.scene.getPlayerField()[1]; + const enemyToCheck = game.scene.getEnemyPokemon(); - vi.spyOn(perserrker, "getAbility").mockReturnValue(allAbilities[Abilities.STEELY_SPIRIT]); - expect(perserrker.hasAbility(Abilities.STEELY_SPIRIT)).toBe(true); + vi.spyOn(boostSource, "getAbility").mockReturnValue(allAbilities[Abilities.STEELY_SPIRIT]); + expect(boostSource.hasAbility(Abilities.STEELY_SPIRIT)).toBe(true); - perserrker.summonData.abilitySuppressed = true; + boostSource.summonData.abilitySuppressed = true; - expect(perserrker.hasAbility(Abilities.STEELY_SPIRIT)).toBe(false); - expect(perserrker.summonData.abilitySuppressed).toBe(true); + expect(boostSource.hasAbility(Abilities.STEELY_SPIRIT)).toBe(false); + expect(boostSource.summonData.abilitySuppressed).toBe(true); game.doAttack(getMovePosition(game.scene, 0, moveToCheck)); + await game.phaseInterceptor.to(SelectTargetPhase, false); + game.doSelectTarget(enemyToCheck.getBattlerIndex()); game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + await game.phaseInterceptor.to(MoveEffectPhase); - const mockedMovePower = getMockedMovePower(game.scene.getEnemyPokemon(), perserrker, allMoves[moveToCheck]); - - expect(mockedMovePower).toBe(allMoves[moveToCheck].power); + expect(allMoves[moveToCheck].calculateBattlePower).toHaveReturnedWith(ironHeadPower); }); }); - -/** - * Calculates the mocked power of a move. - * Note this does not consider other damage calculations - * except the power multiplier from Steely Spirit. - * - * @param defender - The defending Pokémon. - * @param attacker - The attacking Pokémon. - * @param move - The move being used by the attacker. - * @returns The adjusted power of the move. - */ -const getMockedMovePower = (defender: Pokemon, attacker: Pokemon, move: Move) => { - const powerHolder = new NumberHolder(move.power); - - /** - * Check if pokemon has the specified ability and is in effect. - * See Pokemon.hasAbility {@linkcode Pokemon.hasAbility} - */ - if (attacker.hasAbility(Abilities.STEELY_SPIRIT)) { - const alliedField: Pokemon[] = attacker instanceof PlayerPokemon ? attacker.scene.getPlayerField() : attacker.scene.getEnemyField(); - alliedField.forEach(p => applyPreAttackAbAttrs(UserFieldMoveTypePowerBoostAbAttr, p, this, move, powerHolder)); - } - - return powerHolder.value; -}; diff --git a/src/test/abilities/sturdy.test.ts b/src/test/abilities/sturdy.test.ts index b9d764971f0..0cfa45ef843 100644 --- a/src/test/abilities/sturdy.test.ts +++ b/src/test/abilities/sturdy.test.ts @@ -1,7 +1,7 @@ import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { DamagePhase, MoveEndPhase, @@ -30,15 +30,15 @@ describe("Abilities - Sturdy", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); - vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.LUCARIO); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.CLOSE_COMBAT, Moves.FISSURE]); + vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.LUCARIO); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.CLOSE_COMBAT, Moves.FISSURE]); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.ARON); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(5); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.STURDY); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.ARON); + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(5); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.STURDY); }); test( @@ -77,7 +77,7 @@ describe("Abilities - Sturdy", () => { await game.phaseInterceptor.to(MoveEndPhase); const enemyPokemon: EnemyPokemon = game.scene.getEnemyParty()[0]; - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + expect(enemyPokemon.isFullHp()).toBe(true); }, TIMEOUT ); @@ -85,7 +85,7 @@ describe("Abilities - Sturdy", () => { test( "Sturdy is ignored by pokemon with `Abilities.MOLD_BREAKER`", async () => { - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MOLD_BREAKER); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MOLD_BREAKER); await game.startBattle(); game.doAttack(getMovePosition(game.scene, 0, Moves.CLOSE_COMBAT)); diff --git a/src/test/abilities/unseen_fist.test.ts b/src/test/abilities/unseen_fist.test.ts index c53be8c82a4..e6025cb0a6a 100644 --- a/src/test/abilities/unseen_fist.test.ts +++ b/src/test/abilities/unseen_fist.test.ts @@ -1,7 +1,7 @@ import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; import GameManager from "../utils/gameManager"; -import * as Overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { Species } from "#enums/species"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; @@ -26,7 +26,7 @@ describe("Abilities - Unseen Fist", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.URSHIFU); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); diff --git a/src/test/abilities/volt_absorb.test.ts b/src/test/abilities/volt_absorb.test.ts index 86efd1a9d93..e8c47e1420e 100644 --- a/src/test/abilities/volt_absorb.test.ts +++ b/src/test/abilities/volt_absorb.test.ts @@ -1,7 +1,7 @@ import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { TurnEndPhase, } from "#app/phases"; @@ -29,19 +29,19 @@ describe("Abilities - Volt Absorb", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); }); it("does not activate when CHARGE is used", async () => { const moveToUse = Moves.CHARGE; const ability = Abilities.VOLT_ABSORB; - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(ability); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.DUSKULL); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(ability); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.DUSKULL); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); await game.startBattle(); diff --git a/src/test/abilities/wind_power.test.ts b/src/test/abilities/wind_power.test.ts index 89957362268..84869bd54a8 100644 --- a/src/test/abilities/wind_power.test.ts +++ b/src/test/abilities/wind_power.test.ts @@ -1,7 +1,7 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { Species } from "#enums/species"; import { TurnEndPhase, @@ -27,11 +27,11 @@ describe("Abilities - Wind Power", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHIFTRY); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_POWER); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHIFTRY); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_POWER); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); }); it("it becomes charged when hit by wind moves", async () => { @@ -47,8 +47,8 @@ describe("Abilities - Wind Power", () => { }); it("it becomes charged when Tailwind takes effect on its side", async () => { - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_POWER); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_POWER); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); await game.startBattle([Species.SHIFTRY]); const shiftry = game.scene.getPlayerPokemon(); @@ -62,8 +62,8 @@ describe("Abilities - Wind Power", () => { }); it("does not become charged when Tailwind takes effect on opposing side", async () => { - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_POWER); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_POWER); await game.startBattle([Species.SHIFTRY]); const magikarp = game.scene.getEnemyPokemon(); @@ -81,7 +81,7 @@ describe("Abilities - Wind Power", () => { }); it("does not interact with Sandstorm", async () => { - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); await game.startBattle([Species.SHIFTRY]); const shiftry = game.scene.getPlayerPokemon(); diff --git a/src/test/abilities/wind_rider.test.ts b/src/test/abilities/wind_rider.test.ts index 2b9361f5839..d578c5a22dc 100644 --- a/src/test/abilities/wind_rider.test.ts +++ b/src/test/abilities/wind_rider.test.ts @@ -1,7 +1,7 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { Species } from "#enums/species"; import { TurnEndPhase, @@ -27,11 +27,11 @@ describe("Abilities - Wind Rider", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHIFTRY); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_RIDER); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHIFTRY); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_RIDER); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); }); it("takes no damage from wind moves and its Attack is increased by one stage when hit by one", async () => { @@ -44,13 +44,13 @@ describe("Abilities - Wind Rider", () => { await game.phaseInterceptor.to(TurnEndPhase); - expect(shiftry.hp).equals(shiftry.getMaxHp()); + expect(shiftry.isFullHp()).toBe(true); expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(1); }); it("Attack is increased by one stage when Tailwind is present on its side", async () => { - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_RIDER); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_RIDER); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); await game.startBattle([Species.SHIFTRY]); const shiftry = game.scene.getPlayerPokemon(); @@ -65,8 +65,8 @@ describe("Abilities - Wind Rider", () => { }); it("does not increase Attack when Tailwind is present on opposing side", async () => { - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_RIDER); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WIND_RIDER); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); await game.startBattle([Species.SHIFTRY]); const magikarp = game.scene.getEnemyPokemon(); @@ -84,7 +84,7 @@ describe("Abilities - Wind Rider", () => { }); it("does not increase Attack when Tailwind is present on opposing side", async () => { - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); await game.startBattle([Species.SHIFTRY]); const magikarp = game.scene.getEnemyPokemon(); @@ -102,13 +102,13 @@ describe("Abilities - Wind Rider", () => { }); it("does not interact with Sandstorm", async () => { - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); await game.startBattle([Species.SHIFTRY]); const shiftry = game.scene.getPlayerPokemon(); expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(0); - expect(shiftry.hp).equals(shiftry.getMaxHp()); + expect(shiftry.isFullHp()).toBe(true); game.doAttack(getMovePosition(game.scene, 0, Moves.SANDSTORM)); diff --git a/src/test/abilities/wonder_skin.test.ts b/src/test/abilities/wonder_skin.test.ts index 4dc4b1d4282..cd23b2c359f 100644 --- a/src/test/abilities/wonder_skin.test.ts +++ b/src/test/abilities/wonder_skin.test.ts @@ -1,16 +1,14 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { Species } from "#enums/species"; -import { TurnEndPhase, } from "#app/phases"; +import { MoveEffectPhase } from "#app/phases"; import { Moves } from "#enums/moves"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; -import Move, { allMoves } from "#app/data/move.js"; -import { MoveAbilityBypassAbAttr, WonderSkinAbAttr } from "#app/data/ability.js"; -import { NumberHolder } from "#app/utils.js"; -import Pokemon from "#app/field/pokemon.js"; +import { allMoves } from "#app/data/move.js"; +import { allAbilities } from "#app/data/ability.js"; describe("Abilities - Wonder Skin", () => { let phaserGame: Phaser.Game; @@ -28,114 +26,52 @@ describe("Abilities - Wonder Skin", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WONDER_SKIN); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.CHARM]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.CHARM]); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WONDER_SKIN); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); }); it("lowers accuracy of status moves to 50%", async () => { - await game.startBattle([Species.MAGIKARP]); + const moveToCheck = allMoves[Moves.CHARM]; + vi.spyOn(moveToCheck, "calculateBattleAccuracy"); + + await game.startBattle([Species.PIKACHU]); game.doAttack(getMovePosition(game.scene, 0, Moves.CHARM)); + await game.phaseInterceptor.to(MoveEffectPhase); - const mockedAccuracy = getMockedMoveAccuracy(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[Moves.CHARM]); - - await game.phaseInterceptor.to(TurnEndPhase); - - expect(mockedAccuracy).not.toBe(undefined); - expect(mockedAccuracy).not.toBe(100); - expect(mockedAccuracy).toBe(50); + expect(moveToCheck.calculateBattleAccuracy).toHaveReturnedWith(50); }); it("does not lower accuracy of non-status moves", async () => { - await game.startBattle([Species.MAGIKARP]); + const moveToCheck = allMoves[Moves.TACKLE]; + vi.spyOn(moveToCheck, "calculateBattleAccuracy"); + + await game.startBattle([Species.PIKACHU]); game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + await game.phaseInterceptor.to(MoveEffectPhase); - const mockedAccuracy = getMockedMoveAccuracy(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[Moves.TACKLE]); - - await game.phaseInterceptor.to(TurnEndPhase); - - expect(mockedAccuracy).not.toBe(undefined); - expect(mockedAccuracy).toBe(100); - expect(mockedAccuracy).not.toBe(50); + expect(moveToCheck.calculateBattleAccuracy).toHaveReturnedWith(100); }); - it("does not affect pokemon with Mold Breaker", async () => { - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MOLD_BREAKER); + const bypassAbilities = [Abilities.MOLD_BREAKER, Abilities.TERAVOLT, Abilities.TURBOBLAZE]; - await game.startBattle([Species.MAGIKARP]); + bypassAbilities.forEach(ability => { + it(`does not affect pokemon with ${allAbilities[ability].name}`, async () => { + const moveToCheck = allMoves[Moves.CHARM]; - game.doAttack(getMovePosition(game.scene, 0, Moves.CHARM)); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(ability); + vi.spyOn(moveToCheck, "calculateBattleAccuracy"); - const mockedAccuracy = getMockedMoveAccuracy(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[Moves.CHARM]); + await game.startBattle([Species.PIKACHU]); + game.doAttack(getMovePosition(game.scene, 0, Moves.CHARM)); + await game.phaseInterceptor.to(MoveEffectPhase); - await game.phaseInterceptor.to(TurnEndPhase); - - expect(mockedAccuracy).not.toBe(undefined); - expect(mockedAccuracy).toBe(100); - expect(mockedAccuracy).not.toBe(50); - }); - - it("does not affect pokemon with Teravolt", async () => { - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.TERAVOLT); - - await game.startBattle([Species.MAGIKARP]); - - game.doAttack(getMovePosition(game.scene, 0, Moves.CHARM)); - - const mockedAccuracy = getMockedMoveAccuracy(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[Moves.CHARM]); - - await game.phaseInterceptor.to(TurnEndPhase); - - expect(mockedAccuracy).not.toBe(undefined); - expect(mockedAccuracy).toBe(100); - expect(mockedAccuracy).not.toBe(50); - }); - - it("does not affect pokemon with Turboblaze", async () => { - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.TURBOBLAZE); - - await game.startBattle([Species.MAGIKARP]); - - game.doAttack(getMovePosition(game.scene, 0, Moves.CHARM)); - - const mockedAccuracy = getMockedMoveAccuracy(game.scene.getEnemyPokemon(), game.scene.getPlayerPokemon(), allMoves[Moves.CHARM]); - - await game.phaseInterceptor.to(TurnEndPhase); - - expect(mockedAccuracy).not.toBe(undefined); - expect(mockedAccuracy).toBe(100); - expect(mockedAccuracy).not.toBe(50); + expect(moveToCheck.calculateBattleAccuracy).toHaveReturnedWith(100); + }); }); }); - -/** - * Calculates the mocked accuracy of a move. - * Note this does not consider other accuracy calculations - * except the power multiplier from Wonder Skin. - * Bypassed by MoveAbilityBypassAbAttr {@linkcode MoveAbilityBypassAbAttr} - * - * @param defender - The defending Pokémon. - * @param attacker - The attacking Pokémon. - * @param move - The move being used by the attacker. - * @returns The adjusted accuracy of the move. - */ -const getMockedMoveAccuracy = (defender: Pokemon, attacker: Pokemon, move: Move) => { - const accuracyHolder = new NumberHolder(move.accuracy); - - /** - * Simulate ignoring ability - * @see MoveAbilityBypassAbAttr - */ - if (attacker.hasAbilityWithAttr(MoveAbilityBypassAbAttr)) { - return accuracyHolder.value; - } - - const wonderSkinInstance = new WonderSkinAbAttr(); - - wonderSkinInstance.applyPreDefend(defender, false, attacker, move, { value: false }, [ accuracyHolder ]); - - return accuracyHolder.value; -}; diff --git a/src/test/abilities/zen_mode.test.ts b/src/test/abilities/zen_mode.test.ts index 4a3caaaa157..dae01b7aa89 100644 --- a/src/test/abilities/zen_mode.test.ts +++ b/src/test/abilities/zen_mode.test.ts @@ -1,7 +1,7 @@ import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as Overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { CommandPhase, DamagePhase, @@ -43,7 +43,7 @@ describe("Abilities - ZEN MODE", () => { beforeEach(() => { game = new GameManager(phaserGame); const moveToUse = Moves.SPLASH; - vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); diff --git a/src/test/abilities/zero_to_hero.test.ts b/src/test/abilities/zero_to_hero.test.ts index e0264729125..6e82f151f15 100644 --- a/src/test/abilities/zero_to_hero.test.ts +++ b/src/test/abilities/zero_to_hero.test.ts @@ -1,7 +1,7 @@ import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; import GameManager from "#test/utils/gameManager"; import { getMovePosition } from "#test/utils/gameManagerUtils"; -import * as Overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { Moves } from "#enums/moves"; import { Abilities } from "#enums/abilities"; import { Species } from "#enums/species"; @@ -28,7 +28,7 @@ describe("Abilities - ZERO TO HERO", () => { beforeEach(() => { game = new GameManager(phaserGame); const moveToUse = Moves.SPLASH; - vi.spyOn(Overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZERO_TO_HERO); vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); diff --git a/src/test/achievements/achievement.test.ts b/src/test/achievements/achievement.test.ts index f24529187c6..f5a7416e809 100644 --- a/src/test/achievements/achievement.test.ts +++ b/src/test/achievements/achievement.test.ts @@ -5,7 +5,7 @@ import { IntegerHolder, NumberHolder } from "#app/utils.js"; import { TurnHeldItemTransferModifier } from "#app/modifier/modifier.js"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; describe("check some Achievement related stuff", () => { it ("should check Achievement creation", () => { @@ -103,14 +103,12 @@ describe("RibbonAchv", () => { }); beforeEach(() => { - vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(0); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(0); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(0); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(0); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([]); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([]); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); + vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(0); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(0); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(0); + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(0); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([]); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([]); game = new GameManager(phaserGame); scene = game.scene; }); diff --git a/src/test/arena/arena_gravity.test.ts b/src/test/arena/arena_gravity.test.ts new file mode 100644 index 00000000000..ae944758bc7 --- /dev/null +++ b/src/test/arena/arena_gravity.test.ts @@ -0,0 +1,83 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import Overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { + MoveEffectPhase, + TurnEndPhase, +} from "#app/phases"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { allMoves } from "#app/data/move.js"; +import { ArenaTagType } from "#app/enums/arena-tag-type.js"; +import { Abilities } from "#app/enums/abilities.js"; + +describe("Arena - Gravity", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.GRAVITY, Moves.FISSURE]); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.UNNERVE); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(new Array(4).fill(Moves.SPLASH)); + }); + + it("non-OHKO move accuracy is multiplied by 1.67", async () => { + const moveToCheck = allMoves[Moves.TACKLE]; + + vi.spyOn(moveToCheck, "calculateBattleAccuracy"); + + // Setup Gravity on first turn + await game.startBattle([Species.PIKACHU]); + game.doAttack(getMovePosition(game.scene, 0, Moves.GRAVITY)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(game.scene.arena.getTag(ArenaTagType.GRAVITY)).toBeDefined(); + + // Use non-OHKO move on second turn + await game.toNextTurn(); + game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(moveToCheck.calculateBattleAccuracy).toHaveReturnedWith(100 * 1.67); + }); + + it("OHKO move accuracy is not affected", async () => { + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(5); + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(5); + + /** See Fissure {@link https://bulbapedia.bulbagarden.net/wiki/Fissure_(move)} */ + const moveToCheck = allMoves[Moves.FISSURE]; + + vi.spyOn(moveToCheck, "calculateBattleAccuracy"); + + // Setup Gravity on first turn + await game.startBattle([Species.PIKACHU]); + game.doAttack(getMovePosition(game.scene, 0, Moves.GRAVITY)); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(game.scene.arena.getTag(ArenaTagType.GRAVITY)).toBeDefined(); + + // Use OHKO move on second turn + await game.toNextTurn(); + game.doAttack(getMovePosition(game.scene, 0, Moves.FISSURE)); + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(moveToCheck.calculateBattleAccuracy).toHaveReturnedWith(30); + }); +}); diff --git a/src/test/arena/weather_fog.test.ts b/src/test/arena/weather_fog.test.ts new file mode 100644 index 00000000000..85a9e334c45 --- /dev/null +++ b/src/test/arena/weather_fog.test.ts @@ -0,0 +1,51 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import Overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { + MoveEffectPhase, +} from "#app/phases"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { allMoves } from "#app/data/move.js"; +import { WeatherType } from "#app/data/weather.js"; +import { Abilities } from "#app/enums/abilities.js"; + +describe("Weather - Fog", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(Overrides, "WEATHER_OVERRIDE", "get").mockReturnValue(WeatherType.FOG); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(new Array(4).fill(Moves.SPLASH)); + }); + + it("move accuracy is multiplied by 90%", async () => { + const moveToCheck = allMoves[Moves.TACKLE]; + + vi.spyOn(moveToCheck, "calculateBattleAccuracy"); + + await game.startBattle([Species.MAGIKARP]); + game.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(moveToCheck.calculateBattleAccuracy).toHaveReturnedWith(100 * 0.9); + }); +}); diff --git a/src/test/arena/weather_strong_winds.test.ts b/src/test/arena/weather_strong_winds.test.ts index d022d69a772..906d6c71b0d 100644 --- a/src/test/arena/weather_strong_winds.test.ts +++ b/src/test/arena/weather_strong_winds.test.ts @@ -1,7 +1,7 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { Species } from "#enums/species"; import { TurnStartPhase, @@ -27,15 +27,15 @@ describe("Weather - Strong Winds", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(10); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.TAILLOW); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.DELTA_STREAM); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.THUNDERBOLT, Moves.ICE_BEAM, Moves.ROCK_SLIDE]); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(10); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.TAILLOW); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.DELTA_STREAM); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.THUNDERBOLT, Moves.ICE_BEAM, Moves.ROCK_SLIDE]); }); it("electric type move is not very effective on Rayquaza", async () => { - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RAYQUAZA); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RAYQUAZA); await game.startBattle([Species.PIKACHU]); const pikachu = game.scene.getPlayerPokemon(); diff --git a/src/test/battle/battle-order.test.ts b/src/test/battle/battle-order.test.ts index 5d8f9d2c98f..0a6b9473ff1 100644 --- a/src/test/battle/battle-order.test.ts +++ b/src/test/battle/battle-order.test.ts @@ -1,7 +1,7 @@ import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { CommandPhase, EnemyCommandPhase, SelectTargetPhase, TurnStartPhase @@ -33,11 +33,11 @@ describe("Battle order", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); }); it("opponent faster than player 50 vs 150", async() => { @@ -83,8 +83,7 @@ describe("Battle order", () => { }, 20000); it("double - both opponents faster than player 50/50 vs 150/150", async() => { - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); await game.startBattle([ Species.BULBASAUR, Species.BLASTOISE, @@ -126,8 +125,7 @@ describe("Battle order", () => { }, 20000); it("double - speed tie except 1 - 100/100 vs 100/150", async() => { - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); await game.startBattle([ Species.BULBASAUR, Species.BLASTOISE, @@ -168,8 +166,7 @@ describe("Battle order", () => { }, 20000); it("double - speed tie 100/150 vs 100/150", async() => { - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); await game.startBattle([ Species.BULBASAUR, Species.BLASTOISE, diff --git a/src/test/battle/battle.test.ts b/src/test/battle/battle.test.ts index 8eb9b9b87d9..206573053db 100644 --- a/src/test/battle/battle.test.ts +++ b/src/test/battle/battle.test.ts @@ -2,7 +2,7 @@ import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest import {generateStarter, getMovePosition,} from "#app/test/utils/gameManagerUtils"; import {Mode} from "#app/ui/ui"; import {GameModes} from "#app/game-mode"; -import * as overrides from "../../overrides"; +import Overrides from "#app/overrides"; import {Command} from "#app/ui/command-ui-handler"; import { CommandPhase, DamagePhase, @@ -89,14 +89,14 @@ describe("Test Battle Phase", () => { }, 20000); it("do attack wave 3 - single battle - regular - OHKO", async() => { - vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); await game.startBattle(); game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); @@ -109,14 +109,14 @@ describe("Test Battle Phase", () => { }, 20000); it("do attack wave 3 - single battle - regular - NO OHKO with opponent using non damage attack", async() => { - vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(5); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAIL_WHIP, Moves.TAIL_WHIP, Moves.TAIL_WHIP, Moves.TAIL_WHIP]); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(5); + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAIL_WHIP, Moves.TAIL_WHIP, Moves.TAIL_WHIP, Moves.TAIL_WHIP]); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); await game.startBattle(); game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { game.scene.ui.setMode(Mode.FIGHT, (game.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); @@ -150,8 +150,8 @@ describe("Test Battle Phase", () => { it("test remove random battle seed int", async() => { for (let i=0; i<10; i++) { - const rand = game.scene.randBattleSeedInt(15); - expect(rand).toBe(14); + const rand = game.scene.randBattleSeedInt(16); + expect(rand).toBe(15); } }); @@ -203,10 +203,10 @@ describe("Test Battle Phase", () => { }, 20000); it("2vs1", async() => { - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MIGHTYENA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MIGHTYENA); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, @@ -216,10 +216,10 @@ describe("Test Battle Phase", () => { }, 20000); it("1vs1", async() => { - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MIGHTYENA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MIGHTYENA); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); await game.startBattle([ Species.BLASTOISE, ]); @@ -228,11 +228,11 @@ describe("Test Battle Phase", () => { }, 20000); it("2vs2", async() => { - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MIGHTYENA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MIGHTYENA); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, @@ -242,11 +242,11 @@ describe("Test Battle Phase", () => { }, 20000); it("4vs2", async() => { - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MIGHTYENA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MIGHTYENA); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, @@ -259,15 +259,15 @@ describe("Test Battle Phase", () => { it("kill opponent pokemon", async() => { const moveToUse = Moves.SPLASH; - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); await game.startBattle([ Species.DARMANITAN, Species.CHARIZARD, @@ -288,15 +288,15 @@ describe("Test Battle Phase", () => { it("to next turn", async() => { const moveToUse = Moves.SPLASH; - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); await game.startBattle(); const turn = game.scene.currentBattle.turn; game.doAttack(0); @@ -306,15 +306,15 @@ describe("Test Battle Phase", () => { it("to next wave with pokemon killed, single", async() => { const moveToUse = Moves.SPLASH; - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); await game.startBattle(); const waveIndex = game.scene.currentBattle.waveIndex; game.doAttack(0); diff --git a/src/test/battle/error-handling.test.ts b/src/test/battle/error-handling.test.ts index d46d8bcf7e8..063ac2b5210 100644 --- a/src/test/battle/error-handling.test.ts +++ b/src/test/battle/error-handling.test.ts @@ -1,7 +1,7 @@ import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; import GameManager from "#app/test/utils/gameManager"; import Phaser from "phaser"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; @@ -23,15 +23,15 @@ describe("Test Battle Phase", () => { beforeEach(() => { game = new GameManager(phaserGame); const moveToUse = Moves.SPLASH; - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MEWTWO); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ZEN_MODE); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); it.skip("to next turn", async() => { diff --git a/src/test/battle/special_battle.test.ts b/src/test/battle/special_battle.test.ts index 01ae7d05359..cc1d2057b9b 100644 --- a/src/test/battle/special_battle.test.ts +++ b/src/test/battle/special_battle.test.ts @@ -1,6 +1,6 @@ import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; import {Mode} from "#app/ui/ui"; -import * as overrides from "../../overrides"; +import Overrides from "#app/overrides"; import { CommandPhase, } from "#app/phases"; @@ -26,17 +26,17 @@ describe("Test Battle Phase", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE]); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); }); it("startBattle 2vs1 boss", async() => { - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(10); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(10); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, @@ -46,8 +46,8 @@ describe("Test Battle Phase", () => { }, 20000); it("startBattle 2vs2 boss", async() => { - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(10); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(10); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, @@ -57,8 +57,8 @@ describe("Test Battle Phase", () => { }, 20000); it("startBattle 2vs2 trainer", async() => { - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, @@ -68,8 +68,8 @@ describe("Test Battle Phase", () => { }, 20000); it("startBattle 2vs1 trainer", async() => { - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, @@ -79,8 +79,8 @@ describe("Test Battle Phase", () => { }, 20000); it("startBattle 2vs1 rival", async() => { - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(8); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(8); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, @@ -90,8 +90,8 @@ describe("Test Battle Phase", () => { }, 20000); it("startBattle 2vs2 rival", async() => { - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(8); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(8); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, @@ -101,8 +101,8 @@ describe("Test Battle Phase", () => { }, 20000); it("startBattle 1vs1 trainer", async() => { - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); await game.startBattle([ Species.BLASTOISE, ]); @@ -111,8 +111,8 @@ describe("Test Battle Phase", () => { }, 20000); it("startBattle 2vs2 trainer", async() => { - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, @@ -122,8 +122,8 @@ describe("Test Battle Phase", () => { }, 20000); it("startBattle 4vs2 trainer", async() => { - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD, diff --git a/src/test/battlerTags/octolock.test.ts b/src/test/battlerTags/octolock.test.ts new file mode 100644 index 00000000000..4c1c58d4345 --- /dev/null +++ b/src/test/battlerTags/octolock.test.ts @@ -0,0 +1,62 @@ +import { describe, expect, it, vi } from "vitest"; +import Pokemon from "#app/field/pokemon.js"; +import BattleScene from "#app/battle-scene.js"; +import { BattlerTag, BattlerTagLapseType, OctolockTag, TrappedTag } from "#app/data/battler-tags.js"; +import { StatChangePhase } from "#app/phases.js"; +import { BattleStat } from "#app/data/battle-stat.js"; +import { BattlerTagType } from "#app/enums/battler-tag-type.js"; + +jest.mock("#app/battle-scene.js"); + +describe("BattlerTag - OctolockTag", () => { + describe("lapse behavior", () => { + it("unshifts a StatChangePhase with expected stat changes", { timeout: 10000 }, 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(StatChangePhase); + expect((phase as StatChangePhase)["levels"]).toEqual(-1); + expect((phase as StatChangePhase)["stats"]).toEqual([BattleStat.DEF, BattleStat.SPDEF]); + }); + + subject.lapse(mockPokemon, BattlerTagLapseType.TURN_END); + + expect(mockPokemon.scene.unshiftPhase).toBeCalledTimes(1); + }); + }); + + it ("traps its target (extends TrappedTag)", { timeout: 2000 }, async () => { + expect(new OctolockTag(1)).toBeInstanceOf(TrappedTag); + }); + + it("can be added to pokemon who are not octolocked", { timeout: 2000 }, 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", { timeout: 2000 }, 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/stockpiling.test.ts b/src/test/battlerTags/stockpiling.test.ts new file mode 100644 index 00000000000..5cf07c47ce1 --- /dev/null +++ b/src/test/battlerTags/stockpiling.test.ts @@ -0,0 +1,161 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; +import Pokemon, { PokemonSummonData } from "#app/field/pokemon.js"; +import BattleScene from "#app/battle-scene.js"; +import { StockpilingTag } from "#app/data/battler-tags.js"; +import { StatChangePhase } from "#app/phases.js"; +import { BattleStat } from "#app/data/battle-stat.js"; +import * as messages from "#app/messages.js"; + +beforeEach(() => { + vi.spyOn(messages, "getPokemonNameWithAffix").mockImplementation(() => ""); +}); + +describe("BattlerTag - StockpilingTag", () => { + describe("onAdd", () => { + it("unshifts a StatChangePhase with expected stat changes on add", { timeout: 10000 }, async () => { + const mockPokemon = { + scene: vi.mocked(new BattleScene()) as BattleScene, + getBattlerIndex: () => 0, + } as Pokemon; + + vi.spyOn(mockPokemon.scene, "queueMessage").mockImplementation(() => {}); + + const subject = new StockpilingTag(1); + + vi.spyOn(mockPokemon.scene, "unshiftPhase").mockImplementation(phase => { + expect(phase).toBeInstanceOf(StatChangePhase); + expect((phase as StatChangePhase)["levels"]).toEqual(1); + expect((phase as StatChangePhase)["stats"]).toEqual(expect.arrayContaining([BattleStat.DEF, BattleStat.SPDEF])); + + (phase as StatChangePhase)["onChange"](mockPokemon, [BattleStat.DEF, BattleStat.SPDEF], [1, 1]); + }); + + subject.onAdd(mockPokemon); + + expect(mockPokemon.scene.unshiftPhase).toBeCalledTimes(1); + }); + + it("unshifts a StatChangePhase with expected stat changes on add (one stat maxed)", { timeout: 10000 }, async () => { + const mockPokemon = { + scene: new BattleScene(), + summonData: new PokemonSummonData(), + getBattlerIndex: () => 0, + } as Pokemon; + + vi.spyOn(mockPokemon.scene, "queueMessage").mockImplementation(() => {}); + + mockPokemon.summonData.battleStats[BattleStat.DEF] = 6; + mockPokemon.summonData.battleStats[BattleStat.SPDEF] = 5; + + const subject = new StockpilingTag(1); + + vi.spyOn(mockPokemon.scene, "unshiftPhase").mockImplementation(phase => { + expect(phase).toBeInstanceOf(StatChangePhase); + expect((phase as StatChangePhase)["levels"]).toEqual(1); + expect((phase as StatChangePhase)["stats"]).toEqual(expect.arrayContaining([BattleStat.DEF, BattleStat.SPDEF])); + + (phase as StatChangePhase)["onChange"](mockPokemon, [BattleStat.DEF, BattleStat.SPDEF], [1, 1]); + }); + + subject.onAdd(mockPokemon); + + expect(mockPokemon.scene.unshiftPhase).toBeCalledTimes(1); + }); + }); + + describe("onOverlap", () => { + it("unshifts a StatChangePhase with expected stat changes on overlap", { timeout: 10000 }, async () => { + const mockPokemon = { + scene: new BattleScene(), + getBattlerIndex: () => 0, + } as Pokemon; + + vi.spyOn(mockPokemon.scene, "queueMessage").mockImplementation(() => {}); + + const subject = new StockpilingTag(1); + + vi.spyOn(mockPokemon.scene, "unshiftPhase").mockImplementation(phase => { + expect(phase).toBeInstanceOf(StatChangePhase); + expect((phase as StatChangePhase)["levels"]).toEqual(1); + expect((phase as StatChangePhase)["stats"]).toEqual(expect.arrayContaining([BattleStat.DEF, BattleStat.SPDEF])); + + (phase as StatChangePhase)["onChange"](mockPokemon, [BattleStat.DEF, BattleStat.SPDEF], [1, 1]); + }); + + subject.onOverlap(mockPokemon); + + expect(mockPokemon.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", { timeout: 10000 }, async () => { + const mockPokemon = { + scene: new BattleScene(), + summonData: new PokemonSummonData(), + getBattlerIndex: () => 0, + } as Pokemon; + + vi.spyOn(mockPokemon.scene, "queueMessage").mockImplementation(() => {}); + + mockPokemon.summonData.battleStats[BattleStat.DEF] = 5; + mockPokemon.summonData.battleStats[BattleStat.SPDEF] = 4; + + const subject = new StockpilingTag(1); + + vi.spyOn(mockPokemon.scene, "unshiftPhase").mockImplementationOnce(phase => { + expect(phase).toBeInstanceOf(StatChangePhase); + expect((phase as StatChangePhase)["levels"]).toEqual(1); + expect((phase as StatChangePhase)["stats"]).toEqual(expect.arrayContaining([BattleStat.DEF, BattleStat.SPDEF])); + + // def doesn't change + (phase as StatChangePhase)["onChange"](mockPokemon, [BattleStat.SPDEF], [1]); + }); + + subject.onAdd(mockPokemon); + expect(subject.stockpiledCount).toBe(1); + + vi.spyOn(mockPokemon.scene, "unshiftPhase").mockImplementationOnce(phase => { + expect(phase).toBeInstanceOf(StatChangePhase); + expect((phase as StatChangePhase)["levels"]).toEqual(1); + expect((phase as StatChangePhase)["stats"]).toEqual(expect.arrayContaining([BattleStat.DEF, BattleStat.SPDEF])); + + // def doesn't change + (phase as StatChangePhase)["onChange"](mockPokemon, [BattleStat.SPDEF], [1]); + }); + + subject.onOverlap(mockPokemon); + expect(subject.stockpiledCount).toBe(2); + + vi.spyOn(mockPokemon.scene, "unshiftPhase").mockImplementationOnce(phase => { + expect(phase).toBeInstanceOf(StatChangePhase); + expect((phase as StatChangePhase)["levels"]).toEqual(1); + expect((phase as StatChangePhase)["stats"]).toEqual(expect.arrayContaining([BattleStat.DEF, BattleStat.SPDEF])); + + // neither stat changes, stack count should still increase + }); + + subject.onOverlap(mockPokemon); + expect(subject.stockpiledCount).toBe(3); + + vi.spyOn(mockPokemon.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({ [BattleStat.DEF]: 0, [BattleStat.SPDEF]: 2 }); + + // removing tag should reverse stat changes + vi.spyOn(mockPokemon.scene, "unshiftPhase").mockImplementationOnce(phase => { + expect(phase).toBeInstanceOf(StatChangePhase); + expect((phase as StatChangePhase)["levels"]).toEqual(-2); + expect((phase as StatChangePhase)["stats"]).toEqual(expect.arrayContaining([BattleStat.SPDEF])); + }); + + subject.onRemove(mockPokemon); + expect(mockPokemon.scene.unshiftPhase).toHaveBeenCalledOnce(); // note that re-spying each add/overlap has been refreshing call count + }); + }); +}); diff --git a/src/test/eggs/egg.test.ts b/src/test/eggs/egg.test.ts index a098620f5eb..91d1153edfc 100644 --- a/src/test/eggs/egg.test.ts +++ b/src/test/eggs/egg.test.ts @@ -303,4 +303,11 @@ describe("Egg Generation Tests", () => { expect(result1).toBe(expectedTier1); expect(result2).toBe(expectedTier2); }); + + 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}); + + expect(egg.variantTier).toBe(VariantTier.EPIC); + }); }); diff --git a/src/test/evolution.test.ts b/src/test/evolution.test.ts new file mode 100644 index 00000000000..945e8363231 --- /dev/null +++ b/src/test/evolution.test.ts @@ -0,0 +1,87 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import { Species } from "#app/enums/species.js"; +import { Abilities } from "#app/enums/abilities.js"; +import Overrides from "#app/overrides"; +import { pokemonEvolutions } from "#app/data/pokemon-evolutions.js"; + +describe("Evolution", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + const TIMEOUT = 1000 * 20; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(60); + }); + + it("should keep hidden ability after evolving", async () => { + await game.runToSummon([Species.EEVEE, Species.TRAPINCH]); + + const eevee = game.scene.getParty()[0]; + const trapinch = game.scene.getParty()[1]; + eevee.abilityIndex = 2; + trapinch.abilityIndex = 2; + + eevee.evolve(pokemonEvolutions[Species.EEVEE][6], eevee.getSpeciesForm()); + expect(eevee.abilityIndex).toBe(2); + + trapinch.evolve(pokemonEvolutions[Species.TRAPINCH][0], trapinch.getSpeciesForm()); + expect(trapinch.abilityIndex).toBe(1); + }, TIMEOUT); + + it("should keep same ability slot after evolving", async () => { + await game.runToSummon([Species.BULBASAUR, Species.CHARMANDER]); + + const bulbasaur = game.scene.getParty()[0]; + const charmander = game.scene.getParty()[1]; + bulbasaur.abilityIndex = 0; + charmander.abilityIndex = 1; + + bulbasaur.evolve(pokemonEvolutions[Species.BULBASAUR][0], bulbasaur.getSpeciesForm()); + expect(bulbasaur.abilityIndex).toBe(0); + + charmander.evolve(pokemonEvolutions[Species.CHARMANDER][0], charmander.getSpeciesForm()); + expect(charmander.abilityIndex).toBe(1); + }, TIMEOUT); + + it("should handle illegal abilityIndex values", async () => { + await game.runToSummon([Species.SQUIRTLE]); + + const squirtle = game.scene.getPlayerPokemon(); + squirtle.abilityIndex = 5; + + squirtle.evolve(pokemonEvolutions[Species.SQUIRTLE][0], squirtle.getSpeciesForm()); + expect(squirtle.abilityIndex).toBe(0); + }, TIMEOUT); + + it("should handle nincada's unique evolution", async () => { + await game.runToSummon([Species.NINCADA]); + + const nincada = game.scene.getPlayerPokemon(); + nincada.abilityIndex = 2; + + nincada.evolve(pokemonEvolutions[Species.NINCADA][0], nincada.getSpeciesForm()); + const ninjask = game.scene.getParty()[0]; + const shedinja = game.scene.getParty()[1]; + expect(ninjask.abilityIndex).toBe(2); + expect(shedinja.abilityIndex).toBe(1); + }, TIMEOUT); +}); diff --git a/src/test/internals.test.ts b/src/test/internals.test.ts new file mode 100644 index 00000000000..a54b8b01544 --- /dev/null +++ b/src/test/internals.test.ts @@ -0,0 +1,43 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import { Species } from "#app/enums/species.js"; +import { Abilities } from "#app/enums/abilities.js"; + +describe("Internals", () => { + 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 provide Eevee with 3 defined abilities", async () => { + await game.runToSummon([Species.EEVEE]); + const eevee = game.scene.getPlayerPokemon(); + + expect(eevee.getSpeciesForm().getAbilityCount()).toBe(3); + + expect(eevee.getSpeciesForm().getAbility(0)).toBe(Abilities.RUN_AWAY); + expect(eevee.getSpeciesForm().getAbility(1)).toBe(Abilities.ADAPTABILITY); + expect(eevee.getSpeciesForm().getAbility(2)).toBe(Abilities.ANTICIPATION); + }); + + it("should set Eeeve abilityIndex between 0-2", async () => { + await game.runToSummon([Species.EEVEE]); + const eevee = game.scene.getPlayerPokemon(); + + expect(eevee.abilityIndex).toBeGreaterThanOrEqual(0); + expect(eevee.abilityIndex).toBeLessThanOrEqual(2); + }); +}); diff --git a/src/test/items/eviolite.test.ts b/src/test/items/eviolite.test.ts index 5b4561d4877..5cdcf2256c3 100644 --- a/src/test/items/eviolite.test.ts +++ b/src/test/items/eviolite.test.ts @@ -1,7 +1,7 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phase from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { Stat } from "#app/data/pokemon-stat"; import { EvolutionStatBoosterModifier } from "#app/modifier/modifier"; import { modifierTypes } from "#app/modifier/modifier-type"; @@ -26,11 +26,11 @@ describe("Items - Eviolite", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); }); it("EVIOLITE activates in battle correctly", async() => { - vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "EVIOLITE" }]); + vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "EVIOLITE" }]); const consoleSpy = vi.spyOn(console, "log"); await game.startBattle([ Species.PICHU diff --git a/src/test/items/exp_booster.test.ts b/src/test/items/exp_booster.test.ts new file mode 100644 index 00000000000..866bd6f08b6 --- /dev/null +++ b/src/test/items/exp_booster.test.ts @@ -0,0 +1,40 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phase from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import Overrides from "#app/overrides"; +import { Abilities } from "#app/enums/abilities.js"; +import { PokemonExpBoosterModifier } from "#app/modifier/modifier.js"; +import * as Utils from "#app/utils"; + +describe("EXP Modifier Items", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phase.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + }); + + it("EXP booster items stack additively", async() => { + vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "LUCKY_EGG"}, {name: "GOLDEN_EGG"}]); + await game.startBattle(); + + const partyMember = game.scene.getPlayerPokemon(); + const modifierBonusExp = new Utils.NumberHolder(1); + partyMember.scene.applyModifiers(PokemonExpBoosterModifier, true, partyMember, modifierBonusExp); + expect(modifierBonusExp.value).toBe(2.4); + }, 20000); +}); diff --git a/src/test/items/grip_claw.test.ts b/src/test/items/grip_claw.test.ts index ae621770da6..2aeb98253ab 100644 --- a/src/test/items/grip_claw.test.ts +++ b/src/test/items/grip_claw.test.ts @@ -1,7 +1,7 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phase from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { Moves } from "#app/enums/moves.js"; import { Species } from "#app/enums/species.js"; import { BerryType } from "#app/enums/berry-type.js"; @@ -30,18 +30,18 @@ describe("Items - Grip Claw", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.POPULATION_BOMB, Moves.SPLASH ]); - vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "GRIP_CLAW", count: 5}, {name: "MULTI_LENS", count: 3}]); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.KLUTZ); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); - vi.spyOn(overrides, "OPP_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([ + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.POPULATION_BOMB, Moves.SPLASH ]); + vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "GRIP_CLAW", count: 5}, {name: "MULTI_LENS", count: 3}]); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.KLUTZ); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); + vi.spyOn(Overrides, "OPP_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([ {name: "BERRY", type: BerryType.SITRUS, count: 2}, {name: "BERRY", type: BerryType.LUM, count: 2} ]); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); vi.spyOn(allMoves[Moves.POPULATION_BOMB], "accuracy", "get").mockReturnValue(100); }); diff --git a/src/test/items/leek.test.ts b/src/test/items/leek.test.ts new file mode 100644 index 00000000000..2781de45c08 --- /dev/null +++ b/src/test/items/leek.test.ts @@ -0,0 +1,205 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phase from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import Overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { Moves } from "#enums/moves"; +import { CritBoosterModifier } from "#app/modifier/modifier"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import * as Utils from "#app/utils"; +import { MoveEffectPhase, TurnStartPhase } from "#app/phases"; +import { BattlerIndex } from "#app/battle"; + +describe("Items - Leek", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phase.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); + vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + }); + + it("LEEK activates in battle correctly", async() => { + vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "LEEK" }]); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.POUND ]); + const consoleSpy = vi.spyOn(console, "log"); + await game.startBattle([ + Species.FARFETCHD + ]); + + game.doAttack(0); + + await game.phaseInterceptor.to(TurnStartPhase, false); + + vi.spyOn(game.scene.getCurrentPhase() as TurnStartPhase, "getOrder").mockReturnValue([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(consoleSpy).toHaveBeenCalledWith("Applied", "Leek", ""); + }, 20000); + + it("LEEK held by FARFETCHD", async() => { + await game.startBattle([ + Species.FARFETCHD + ]); + + const partyMember = game.scene.getPlayerPokemon(); + + // Making sure modifier is not applied without holding item + const critLevel = new Utils.IntegerHolder(0); + partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel); + + expect(critLevel.value).toBe(0); + + // Giving Leek to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.LEEK().newModifier(partyMember), true); + partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel); + + expect(critLevel.value).toBe(2); + }, 20000); + + it("LEEK held by GALAR_FARFETCHD", async() => { + await game.startBattle([ + Species.GALAR_FARFETCHD + ]); + + const partyMember = game.scene.getPlayerPokemon(); + + // Making sure modifier is not applied without holding item + const critLevel = new Utils.IntegerHolder(0); + partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel); + + expect(critLevel.value).toBe(0); + + // Giving Leek to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.LEEK().newModifier(partyMember), true); + partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel); + + expect(critLevel.value).toBe(2); + }, 20000); + + it("LEEK held by SIRFETCHD", async() => { + await game.startBattle([ + Species.SIRFETCHD + ]); + + const partyMember = game.scene.getPlayerPokemon(); + + // Making sure modifier is not applied without holding item + const critLevel = new Utils.IntegerHolder(0); + partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel); + + expect(critLevel.value).toBe(0); + + // Giving Leek to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.LEEK().newModifier(partyMember), true); + partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel); + + expect(critLevel.value).toBe(2); + }, 20000); + + it("LEEK held by fused FARFETCHD line (base)", async() => { + // Randomly choose from the Farfetch'd line + const species = [ Species.FARFETCHD, Species.GALAR_FARFETCHD, Species.SIRFETCHD ]; + + await game.startBattle([ + species[Utils.randInt(species.length)], + Species.PIKACHU, + ]); + + const party = game.scene.getParty(); + const partyMember = party[0]; + const ally = party[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; + + // Making sure modifier is not applied without holding item + const critLevel = new Utils.IntegerHolder(0); + partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel); + + expect(critLevel.value).toBe(0); + + // Giving Leek to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.LEEK().newModifier(partyMember), true); + partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel); + + expect(critLevel.value).toBe(2); + }, 20000); + + it("LEEK held by fused FARFETCHD line (part)", async() => { + // Randomly choose from the Farfetch'd line + const species = [ Species.FARFETCHD, Species.GALAR_FARFETCHD, Species.SIRFETCHD ]; + + await game.startBattle([ + Species.PIKACHU, + species[Utils.randInt(species.length)] + ]); + + const party = game.scene.getParty(); + const partyMember = party[0]; + const ally = party[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; + + // Making sure modifier is not applied without holding item + const critLevel = new Utils.IntegerHolder(0); + partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel); + + expect(critLevel.value).toBe(0); + + // Giving Leek to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.LEEK().newModifier(partyMember), true); + partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel); + + expect(critLevel.value).toBe(2); + }, 20000); + + it("LEEK not held by FARFETCHD line", async() => { + await game.startBattle([ + Species.PIKACHU + ]); + + const partyMember = game.scene.getPlayerPokemon(); + + // Making sure modifier is not applied without holding item + const critLevel = new Utils.IntegerHolder(0); + partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel); + + expect(critLevel.value).toBe(0); + + // Giving Leek to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.LEEK().newModifier(partyMember), true); + partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel); + + expect(critLevel.value).toBe(0); + }, 20000); +}); diff --git a/src/test/items/leftovers.test.ts b/src/test/items/leftovers.test.ts new file mode 100644 index 00000000000..1d564ae534c --- /dev/null +++ b/src/test/items/leftovers.test.ts @@ -0,0 +1,65 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import overrides from "#app/overrides"; +import { DamagePhase, TurnEndPhase } from "#app/phases"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; + + +describe("Items - Leftovers", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.UNNERVE); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.UNNERVE); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "LEFTOVERS", count: 1}]); + }); + + it("leftovers works", async() => { + await game.startBattle([Species.ARCANINE]); + + // Make sure leftovers are there + expect(game.scene.modifiers[0].type.id).toBe("LEFTOVERS"); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + // We should have full hp + expect(leadPokemon.isFullHp()).toBe(true); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + + // We should have less hp after the attack + await game.phaseInterceptor.to(DamagePhase, false); + expect(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); + + const leadHpAfterDamage = leadPokemon.hp; + + // Check if leftovers heal us + await game.phaseInterceptor.to(TurnEndPhase); + expect(leadPokemon.hp).toBeGreaterThan(leadHpAfterDamage); + }, 20000); +}); diff --git a/src/test/items/light_ball.test.ts b/src/test/items/light_ball.test.ts index 52fab7b044a..e693307e229 100644 --- a/src/test/items/light_ball.test.ts +++ b/src/test/items/light_ball.test.ts @@ -1,7 +1,7 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phase from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { Species } from "#enums/species"; import { Stat } from "#app/data/pokemon-stat"; import { SpeciesStatBoosterModifier } from "#app/modifier/modifier"; @@ -26,11 +26,11 @@ describe("Items - Light Ball", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); }); it("LIGHT_BALL activates in battle correctly", async() => { - vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "SPECIES_STAT_BOOSTER", type: "LIGHT_BALL" }]); + vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "SPECIES_STAT_BOOSTER", type: "LIGHT_BALL" }]); const consoleSpy = vi.spyOn(console, "log"); await game.startBattle([ Species.PIKACHU diff --git a/src/test/items/metal_powder.test.ts b/src/test/items/metal_powder.test.ts index 5aa2c517ac9..111bc6dfad1 100644 --- a/src/test/items/metal_powder.test.ts +++ b/src/test/items/metal_powder.test.ts @@ -1,7 +1,7 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phase from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { Species } from "#enums/species"; import { Stat } from "#app/data/pokemon-stat"; import { SpeciesStatBoosterModifier } from "#app/modifier/modifier"; @@ -26,11 +26,11 @@ describe("Items - Metal Powder", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); }); it("METAL_POWDER activates in battle correctly", async() => { - vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "SPECIES_STAT_BOOSTER", type: "METAL_POWDER" }]); + vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "SPECIES_STAT_BOOSTER", type: "METAL_POWDER" }]); const consoleSpy = vi.spyOn(console, "log"); await game.startBattle([ Species.DITTO diff --git a/src/test/items/quick_powder.test.ts b/src/test/items/quick_powder.test.ts index 753f62e36eb..cddddb0eeea 100644 --- a/src/test/items/quick_powder.test.ts +++ b/src/test/items/quick_powder.test.ts @@ -1,7 +1,7 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phase from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { Species } from "#enums/species"; import { Stat } from "#app/data/pokemon-stat"; import { SpeciesStatBoosterModifier } from "#app/modifier/modifier"; @@ -26,11 +26,11 @@ describe("Items - Quick Powder", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); }); it("QUICK_POWDER activates in battle correctly", async() => { - vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "SPECIES_STAT_BOOSTER", type: "QUICK_POWDER" }]); + vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "SPECIES_STAT_BOOSTER", type: "QUICK_POWDER" }]); const consoleSpy = vi.spyOn(console, "log"); await game.startBattle([ Species.DITTO diff --git a/src/test/items/scope_lens.test.ts b/src/test/items/scope_lens.test.ts new file mode 100644 index 00000000000..8f54a880c41 --- /dev/null +++ b/src/test/items/scope_lens.test.ts @@ -0,0 +1,75 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phase from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import Overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { Moves } from "#enums/moves"; +import { CritBoosterModifier } from "#app/modifier/modifier"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import * as Utils from "#app/utils"; +import { MoveEffectPhase, TurnStartPhase } from "#app/phases"; +import { BattlerIndex } from "#app/battle"; + +describe("Items - Scope Lens", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phase.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); + vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + }, 20000); + + it("SCOPE_LENS activates in battle correctly", async() => { + vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "SCOPE_LENS" }]); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.POUND ]); + const consoleSpy = vi.spyOn(console, "log"); + await game.startBattle([ + Species.GASTLY + ]); + + game.doAttack(0); + + await game.phaseInterceptor.to(TurnStartPhase, false); + + vi.spyOn(game.scene.getCurrentPhase() as TurnStartPhase, "getOrder").mockReturnValue([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(consoleSpy).toHaveBeenCalledWith("Applied", "Scope Lens", ""); + }, 20000); + + it("SCOPE_LENS held by random pokemon", async() => { + await game.startBattle([ + Species.GASTLY + ]); + + const partyMember = game.scene.getPlayerPokemon(); + + // Making sure modifier is not applied without holding item + const critLevel = new Utils.IntegerHolder(0); + partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel); + + expect(critLevel.value).toBe(0); + + // Giving Scope Lens to party member and testing if it applies + partyMember.scene.addModifier(modifierTypes.SCOPE_LENS().newModifier(partyMember), true); + partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel); + + expect(critLevel.value).toBe(1); + }, 20000); +}); diff --git a/src/test/items/thick_club.test.ts b/src/test/items/thick_club.test.ts index 3356196e8c5..a0a229a5d13 100644 --- a/src/test/items/thick_club.test.ts +++ b/src/test/items/thick_club.test.ts @@ -1,7 +1,7 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phase from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { Species } from "#enums/species"; import { Stat } from "#app/data/pokemon-stat"; import { SpeciesStatBoosterModifier } from "#app/modifier/modifier"; @@ -26,11 +26,11 @@ describe("Items - Thick Club", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); }); it("THICK_CLUB activates in battle correctly", async() => { - vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "SPECIES_STAT_BOOSTER", type: "THICK_CLUB" }]); + vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "SPECIES_STAT_BOOSTER", type: "THICK_CLUB" }]); const consoleSpy = vi.spyOn(console, "log"); await game.startBattle([ Species.CUBONE diff --git a/src/test/items/toxic_orb.test.ts b/src/test/items/toxic_orb.test.ts index 64dc3191d88..45662ac29cf 100644 --- a/src/test/items/toxic_orb.test.ts +++ b/src/test/items/toxic_orb.test.ts @@ -1,7 +1,7 @@ import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { CommandPhase, EnemyCommandPhase, @@ -36,14 +36,14 @@ describe("Items - Toxic orb", () => { game = new GameManager(phaserGame); const moveToUse = Moves.GROWTH; const oppMoveToUse = Moves.TACKLE; - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([oppMoveToUse, oppMoveToUse, oppMoveToUse, oppMoveToUse]); - vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([oppMoveToUse, oppMoveToUse, oppMoveToUse, oppMoveToUse]); + vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{ name: "TOXIC_ORB", }]); }); diff --git a/src/test/localization/battle-stat.test.ts b/src/test/localization/battle-stat.test.ts index d894d705947..ea2714b3852 100644 --- a/src/test/localization/battle-stat.test.ts +++ b/src/test/localization/battle-stat.test.ts @@ -1,37 +1,38 @@ import {beforeAll, describe, expect, it} from "vitest"; -import { getBattleStatName, getBattleStatLevelChangeDescription } from "#app/data/battle-stat.js"; -import { BattleStat } from "#app/data/battle-stat.js"; -import { pokemonInfo as enPokemonInfo } from "#app/locales/en/pokemon-info.js"; -import { battle as enBattleStat } from "#app/locales/en/battle.js"; -import { pokemonInfo as dePokemonInfo } from "#app/locales/de/pokemon-info.js"; -import { battle as deBattleStat } from "#app/locales/de/battle.js"; -import { pokemonInfo as esPokemonInfo } from "#app/locales/es/pokemon-info.js"; -import { battle as esBattleStat } from "#app/locales/es/battle.js"; -import { pokemonInfo as frPokemonInfo } from "#app/locales/fr/pokemon-info.js"; -import { battle as frBattleStat } from "#app/locales/fr/battle.js"; -import { pokemonInfo as itPokemonInfo } from "#app/locales/it/pokemon-info.js"; -import { battle as itBattleStat } from "#app/locales/it/battle.js"; -import { pokemonInfo as koPokemonInfo } from "#app/locales/ko/pokemon-info.js"; -import { battle as koBattleStat } from "#app/locales/ko/battle.js"; -import { pokemonInfo as ptBrPokemonInfo } from "#app/locales/pt_BR/pokemon-info.js"; -import { battle as ptBrBattleStat } from "#app/locales/pt_BR/battle.js"; -import { pokemonInfo as zhCnPokemonInfo } from "#app/locales/zh_CN/pokemon-info.js"; -import { battle as zhCnBattleStat } from "#app/locales/zh_CN/battle.js"; -import { pokemonInfo as zhTwPokemonInfo } from "#app/locales/zh_TW/pokemon-info.js"; -import { battle as zhTwBattleStat } from "#app/locales/zh_TW/battle.js"; +import {getBattleStatName, getBattleStatLevelChangeDescription} from "#app/data/battle-stat.js"; +import {BattleStat} from "#app/data/battle-stat.js"; +import {pokemonInfo as enPokemonInfo} from "#app/locales/en/pokemon-info.js"; +import {battle as enBattleStat} from "#app/locales/en/battle.js"; +import {pokemonInfo as dePokemonInfo} from "#app/locales/de/pokemon-info.js"; +import {battle as deBattleStat} from "#app/locales/de/battle.js"; +import {pokemonInfo as esPokemonInfo} from "#app/locales/es/pokemon-info.js"; +import {battle as esBattleStat} from "#app/locales/es/battle.js"; +import {pokemonInfo as frPokemonInfo} from "#app/locales/fr/pokemon-info.js"; +import {battle as frBattleStat} from "#app/locales/fr/battle.js"; +import {pokemonInfo as itPokemonInfo} from "#app/locales/it/pokemon-info.js"; +import {battle as itBattleStat} from "#app/locales/it/battle.js"; +import {pokemonInfo as koPokemonInfo} from "#app/locales/ko/pokemon-info.js"; +import {battle as koBattleStat} from "#app/locales/ko/battle.js"; +import {pokemonInfo as ptBrPokemonInfo} from "#app/locales/pt_BR/pokemon-info.js"; +import {battle as ptBrBattleStat} from "#app/locales/pt_BR/battle.js"; +import {pokemonInfo as zhCnPokemonInfo} from "#app/locales/zh_CN/pokemon-info.js"; +import {battle as zhCnBattleStat} from "#app/locales/zh_CN/battle.js"; +import {pokemonInfo as zhTwPokemonInfo} from "#app/locales/zh_TW/pokemon-info.js"; +import {battle as zhTwBattleStat} from "#app/locales/zh_TW/battle.js"; import i18next, {initI18n} from "#app/plugins/i18n"; -import { KoreanPostpositionProcessor } from "i18next-korean-postposition-processor"; +import {KoreanPostpositionProcessor} from "i18next-korean-postposition-processor"; interface BattleStatTestUnit { - stat: BattleStat, - key: string + stat: BattleStat, + key: string } interface BattleStatLevelTestUnit { - levels: integer, - up: boolean, - key: string + levels: integer, + up: boolean, + key: string + changedStats: integer } function testBattleStatName(stat: BattleStat, expectMessage: string) { @@ -40,8 +41,8 @@ function testBattleStatName(stat: BattleStat, expectMessage: string) { expect(message).toBe(expectMessage); } -function testBattleStatLevelChangeDescription(levels: integer, up: boolean, expectMessage: string) { - const message = getBattleStatLevelChangeDescription("{{pokemonNameWithAffix}}", "{{stats}}", levels, up); +function testBattleStatLevelChangeDescription(levels: integer, up: boolean, expectMessage: string, changedStats: integer) { + const message = getBattleStatLevelChangeDescription("{{pokemonNameWithAffix}}", "{{stats}}", levels, up, changedStats); console.log(`message ${message}, expected ${expectMessage}`); expect(message).toBe(expectMessage); } @@ -53,28 +54,28 @@ describe("Test for BattleStat Localization", () => { beforeAll(() => { initI18n(); - battleStatUnits.push({ stat: BattleStat.ATK, key: "Stat.ATK" }); - battleStatUnits.push({ stat: BattleStat.DEF, key: "Stat.DEF" }); - battleStatUnits.push({ stat: BattleStat.SPATK, key: "Stat.SPATK" }); - battleStatUnits.push({ stat: BattleStat.SPDEF, key: "Stat.SPDEF" }); - battleStatUnits.push({ stat: BattleStat.SPD, key: "Stat.SPD" }); - battleStatUnits.push({ stat: BattleStat.ACC, key: "Stat.ACC" }); - battleStatUnits.push({ stat: BattleStat.EVA, key: "Stat.EVA" }); + battleStatUnits.push({stat: BattleStat.ATK, key: "Stat.ATK"}); + battleStatUnits.push({stat: BattleStat.DEF, key: "Stat.DEF"}); + battleStatUnits.push({stat: BattleStat.SPATK, key: "Stat.SPATK"}); + battleStatUnits.push({stat: BattleStat.SPDEF, key: "Stat.SPDEF"}); + battleStatUnits.push({stat: BattleStat.SPD, key: "Stat.SPD"}); + battleStatUnits.push({stat: BattleStat.ACC, key: "Stat.ACC"}); + battleStatUnits.push({stat: BattleStat.EVA, key: "Stat.EVA"}); - battleStatLevelUnits.push({ levels: 1, up: true, key: "statRose" }); - battleStatLevelUnits.push({ levels: 2, up: true, key: "statSharplyRose" }); - battleStatLevelUnits.push({ levels: 3, up: true, key: "statRoseDrastically" }); - battleStatLevelUnits.push({ levels: 4, up: true, key: "statRoseDrastically" }); - battleStatLevelUnits.push({ levels: 5, up: true, key: "statRoseDrastically" }); - battleStatLevelUnits.push({ levels: 6, up: true, key: "statRoseDrastically" }); - battleStatLevelUnits.push({ levels: 7, up: true, key: "statWontGoAnyHigher" }); - battleStatLevelUnits.push({ levels: 1, up: false, key: "statFell" }); - battleStatLevelUnits.push({ levels: 2, up: false, key: "statHarshlyFell" }); - battleStatLevelUnits.push({ levels: 3, up: false, key: "statSeverelyFell" }); - battleStatLevelUnits.push({ levels: 4, up: false, key: "statSeverelyFell" }); - battleStatLevelUnits.push({ levels: 5, up: false, key: "statSeverelyFell" }); - battleStatLevelUnits.push({ levels: 6, up: false, key: "statSeverelyFell" }); - battleStatLevelUnits.push({ levels: 7, up: false, key: "statWontGoAnyLower" }); + battleStatLevelUnits.push({levels: 1, up: true, key: "statRose_one", changedStats: 1}); + battleStatLevelUnits.push({levels: 2, up: true, key: "statSharplyRose_one", changedStats: 1}); + battleStatLevelUnits.push({levels: 3, up: true, key: "statRoseDrastically_one", changedStats: 1}); + battleStatLevelUnits.push({levels: 4, up: true, key: "statRoseDrastically_one", changedStats: 1}); + battleStatLevelUnits.push({levels: 5, up: true, key: "statRoseDrastically_one", changedStats: 1}); + battleStatLevelUnits.push({levels: 6, up: true, key: "statRoseDrastically_one", changedStats: 1}); + battleStatLevelUnits.push({levels: 7, up: true, key: "statWontGoAnyHigher_one", changedStats: 1}); + battleStatLevelUnits.push({levels: 1, up: false, key: "statFell_one", changedStats: 1}); + battleStatLevelUnits.push({levels: 2, up: false, key: "statHarshlyFell_one", changedStats: 1}); + battleStatLevelUnits.push({levels: 3, up: false, key: "statSeverelyFell_one", changedStats: 1}); + battleStatLevelUnits.push({levels: 4, up: false, key: "statSeverelyFell_one", changedStats: 1}); + battleStatLevelUnits.push({levels: 5, up: false, key: "statSeverelyFell_one", changedStats: 1}); + battleStatLevelUnits.push({levels: 6, up: false, key: "statSeverelyFell_one", changedStats: 1}); + battleStatLevelUnits.push({levels: 7, up: false, key: "statWontGoAnyLower_one", changedStats: 1}); }); it("Test getBattleStatName() in English", async () => { @@ -87,7 +88,7 @@ describe("Test for BattleStat Localization", () => { it("Test getBattleStatLevelChangeDescription() in English", async () => { i18next.changeLanguage("en"); battleStatLevelUnits.forEach(unit => { - testBattleStatLevelChangeDescription(unit.levels, unit.up, enBattleStat[unit.key]); + testBattleStatLevelChangeDescription(unit.levels, unit.up, enBattleStat[unit.key], unit.changedStats); }); }); @@ -101,7 +102,7 @@ describe("Test for BattleStat Localization", () => { it("Test getBattleStatLevelChangeDescription() in Español", async () => { i18next.changeLanguage("es"); battleStatLevelUnits.forEach(unit => { - testBattleStatLevelChangeDescription(unit.levels, unit.up, esBattleStat[unit.key]); + testBattleStatLevelChangeDescription(unit.levels, unit.up, esBattleStat[unit.key], unit.changedStats); }); }); @@ -115,7 +116,7 @@ describe("Test for BattleStat Localization", () => { it("Test getBattleStatLevelChangeDescription() in Italiano", async () => { i18next.changeLanguage("it"); battleStatLevelUnits.forEach(unit => { - testBattleStatLevelChangeDescription(unit.levels, unit.up, itBattleStat[unit.key]); + testBattleStatLevelChangeDescription(unit.levels, unit.up, itBattleStat[unit.key], unit.changedStats); }); }); @@ -129,7 +130,7 @@ describe("Test for BattleStat Localization", () => { it("Test getBattleStatLevelChangeDescription() in Français", async () => { i18next.changeLanguage("fr"); battleStatLevelUnits.forEach(unit => { - testBattleStatLevelChangeDescription(unit.levels, unit.up, frBattleStat[unit.key]); + testBattleStatLevelChangeDescription(unit.levels, unit.up, frBattleStat[unit.key], unit.changedStats); }); }); @@ -143,7 +144,7 @@ describe("Test for BattleStat Localization", () => { it("Test getBattleStatLevelChangeDescription() in Deutsch", async () => { i18next.changeLanguage("de"); battleStatLevelUnits.forEach(unit => { - testBattleStatLevelChangeDescription(unit.levels, unit.up, deBattleStat[unit.key]); + testBattleStatLevelChangeDescription(unit.levels, unit.up, deBattleStat[unit.key], unit.changedStats); }); }); @@ -157,7 +158,7 @@ describe("Test for BattleStat Localization", () => { it("Test getBattleStatLevelChangeDescription() in Português (BR)", async () => { i18next.changeLanguage("pt-BR"); battleStatLevelUnits.forEach(unit => { - testBattleStatLevelChangeDescription(unit.levels, unit.up, ptBrBattleStat[unit.key]); + testBattleStatLevelChangeDescription(unit.levels, unit.up, ptBrBattleStat[unit.key], unit.changedStats); }); }); @@ -171,7 +172,9 @@ describe("Test for BattleStat Localization", () => { it("Test getBattleStatLevelChangeDescription() in 简体中文", async () => { i18next.changeLanguage("zh-CN"); battleStatLevelUnits.forEach(unit => { - testBattleStatLevelChangeDescription(unit.levels, unit.up, zhCnBattleStat[unit.key]); + // In i18next, the pluralization rules are language-specific, and Chinese only supports the _other suffix. + unit.key = unit.key.replace("one", "other"); + testBattleStatLevelChangeDescription(unit.levels, unit.up, zhCnBattleStat[unit.key], unit.changedStats); }); }); @@ -185,7 +188,9 @@ describe("Test for BattleStat Localization", () => { it("Test getBattleStatLevelChangeDescription() in 繁體中文", async () => { i18next.changeLanguage("zh-TW"); battleStatLevelUnits.forEach(unit => { - testBattleStatLevelChangeDescription(unit.levels, unit.up, zhTwBattleStat[unit.key]); + // In i18next, the pluralization rules are language-specific, and Chinese only supports the _other suffix. + unit.key = unit.key.replace("one", "other"); + testBattleStatLevelChangeDescription(unit.levels, unit.up, zhTwBattleStat[unit.key], unit.changedStats); }); }); @@ -201,7 +206,7 @@ describe("Test for BattleStat Localization", () => { battleStatLevelUnits.forEach(unit => { const processor = new KoreanPostpositionProcessor(); const message = processor.process(koBattleStat[unit.key]); - testBattleStatLevelChangeDescription(unit.levels, unit.up, message); + testBattleStatLevelChangeDescription(unit.levels, unit.up, message, unit.changedStats); }); }); }); diff --git a/src/test/localization/terrain.test.ts b/src/test/localization/terrain.test.ts index 89884290e00..08292bcdda7 100644 --- a/src/test/localization/terrain.test.ts +++ b/src/test/localization/terrain.test.ts @@ -1,7 +1,7 @@ import { beforeAll, describe, beforeEach, afterEach, expect, it, vi } from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { Species } from "#enums/species"; import { TerrainType, getTerrainName } from "#app/data/terrain"; import { getTerrainStartMessage, getTerrainClearMessage, getTerrainBlockMessage } from "#app/data/weather"; @@ -21,7 +21,7 @@ describe("terrain", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); }); describe("NONE", () => { diff --git a/src/test/moves/astonish.test.ts b/src/test/moves/astonish.test.ts new file mode 100644 index 00000000000..4ce2f16715b --- /dev/null +++ b/src/test/moves/astonish.test.ts @@ -0,0 +1,73 @@ +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; +import GameManager from "../utils/gameManager"; +import Overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "../utils/gameManagerUtils"; +import { BerryPhase, CommandPhase, MoveEndPhase, TurnEndPhase } from "#app/phases.js"; +import { BattlerTagType } from "#app/enums/battler-tag-type.js"; +import { allMoves } from "#app/data/move.js"; + +const TIMEOUT = 20 * 1000; + +describe("Moves - Astonish", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ASTONISH, Moves.SPLASH]); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.BLASTOISE); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(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]); + + const leadPokemon = game.scene.getPlayerPokemon(); + expect(leadPokemon).toBeDefined(); + + const enemyPokemon = game.scene.getEnemyPokemon(); + expect(enemyPokemon).toBeDefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.ASTONISH)); + + await game.phaseInterceptor.to(MoveEndPhase, false); + + expect(enemyPokemon.getTag(BattlerTagType.FLINCHED)).toBeDefined(); + + await game.phaseInterceptor.to(TurnEndPhase); + + expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(enemyPokemon.getTag(BattlerTagType.FLINCHED)).toBeUndefined(); + + await game.phaseInterceptor.to(CommandPhase, false); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(leadPokemon.hp).toBeLessThan(leadPokemon.getMaxHp()); + }, TIMEOUT + ); +}); diff --git a/src/test/moves/aurora_veil.test.ts b/src/test/moves/aurora_veil.test.ts index e9c3d920717..dad8d277b7f 100644 --- a/src/test/moves/aurora_veil.test.ts +++ b/src/test/moves/aurora_veil.test.ts @@ -1,7 +1,7 @@ import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { TurnEndPhase, } from "#app/phases"; @@ -35,14 +35,14 @@ describe("Moves - Aurora Veil", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ABSORB, Moves.ROCK_SLIDE, Moves.TACKLE]); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL]); - vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "WEATHER_OVERRIDE", "get").mockReturnValue(WeatherType.HAIL); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ABSORB, Moves.ROCK_SLIDE, Moves.TACKLE]); + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL, Moves.AURORA_VEIL]); + vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "WEATHER_OVERRIDE", "get").mockReturnValue(WeatherType.HAIL); }); it("reduces damage of physical attacks by half in a single battle", async() => { @@ -58,8 +58,7 @@ describe("Moves - Aurora Veil", () => { }); it("reduces damage of physical attacks by a third in a double battle", async() => { - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); const moveToUse = Moves.ROCK_SLIDE; await game.startBattle([Species.SHUCKLE, Species.SHUCKLE]); @@ -87,8 +86,7 @@ describe("Moves - Aurora Veil", () => { }); it("reduces damage of special attacks by a third in a double battle", async() => { - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); const moveToUse = Moves.DAZZLING_GLEAM; await game.startBattle([Species.SHUCKLE, Species.SHUCKLE]); diff --git a/src/test/moves/ceaseless_edge.test.ts b/src/test/moves/ceaseless_edge.test.ts index 6443e34d8d2..a59d6e8f535 100644 --- a/src/test/moves/ceaseless_edge.test.ts +++ b/src/test/moves/ceaseless_edge.test.ts @@ -1,7 +1,7 @@ import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { MoveEffectPhase, TurnEndPhase @@ -32,14 +32,14 @@ describe("Moves - Ceaseless Edge", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.RUN_AWAY); - vi.spyOn(overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.RUN_AWAY); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.CEASELESS_EDGE, Moves.SPLASH, Moves.ROAR ]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH,Moves.SPLASH,Moves.SPLASH,Moves.SPLASH]); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.RUN_AWAY); + vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.RUN_AWAY); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.CEASELESS_EDGE, Moves.SPLASH, Moves.ROAR ]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH,Moves.SPLASH,Moves.SPLASH,Moves.SPLASH]); vi.spyOn(allMoves[Moves.CEASELESS_EDGE], "accuracy", "get").mockReturnValue(100); }); @@ -75,7 +75,7 @@ describe("Moves - Ceaseless Edge", () => { test( "move should hit twice with multi lens and apply two layers of spikes", async () => { - vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS"}]); + vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS"}]); await game.startBattle([ Species.ILLUMISE ]); const leadPokemon = game.scene.getPlayerPokemon(); @@ -104,8 +104,8 @@ describe("Moves - Ceaseless Edge", () => { test( "trainer - move should hit twice, apply two layers of spikes, force switch opponent - opponent takes damage", async () => { - vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS"}]); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); + vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS"}]); + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); await game.startBattle([ Species.ILLUMISE ]); diff --git a/src/test/moves/double_team.test.ts b/src/test/moves/double_team.test.ts new file mode 100644 index 00000000000..de9bd01fd5b --- /dev/null +++ b/src/test/moves/double_team.test.ts @@ -0,0 +1,55 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import Overrides from "#app/overrides"; +import { Species } from "#enums/species"; +import { + TurnEndPhase, +} from "#app/phases"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { BattleStat } from "#app/data/battle-stat.js"; +import { Abilities } from "#app/enums/abilities.js"; + +describe("Moves - Double Team", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DOUBLE_TEAM]); + vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SHUCKLE); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); + }); + + it("increases the user's evasion by one stage.", async () => { + await game.startBattle([Species.MAGIKARP]); + + const ally = game.scene.getPlayerPokemon(); + const enemy = game.scene.getEnemyPokemon(); + + vi.spyOn(enemy, "getAccuracyMultiplier"); + expect(ally.summonData.battleStats[BattleStat.EVA]).toBe(0); + + game.doAttack(getMovePosition(game.scene, 0, Moves.DOUBLE_TEAM)); + await game.phaseInterceptor.to(TurnEndPhase); + await game.toNextTurn(); + + expect(ally.summonData.battleStats[BattleStat.EVA]).toBe(1); + expect(enemy.getAccuracyMultiplier).toHaveReturnedWith(.75); + }); +}); diff --git a/src/test/moves/dragon_rage.test.ts b/src/test/moves/dragon_rage.test.ts new file mode 100644 index 00000000000..a6044044aa4 --- /dev/null +++ b/src/test/moves/dragon_rage.test.ts @@ -0,0 +1,132 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import Overrides from "#app/overrides"; +import { TurnEndPhase } from "#app/phases"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#enums/abilities"; +import { Species } from "#app/enums/species.js"; +import { Type } from "#app/data/type"; +import { BattleStat } from "#app/data/battle-stat"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; +import { modifierTypes } from "#app/modifier/modifier-type"; + +describe("Moves - Dragon Rage", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + let partyPokemon: PlayerPokemon; + let enemyPokemon: EnemyPokemon; + + const dragonRageDamage = 40; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(async () => { + game = new GameManager(phaserGame); + + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + + vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DRAGON_RAGE]); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + + await game.startBattle(); + + partyPokemon = game.scene.getParty()[0]; + enemyPokemon = game.scene.getEnemyPokemon(); + + // remove berries + game.scene.removePartyMemberModifiers(0); + game.scene.clearEnemyHeldItemModifiers(); + }); + + it("ignores weaknesses", async () => { + vi.spyOn(enemyPokemon, "getTypes").mockReturnValue([Type.DRAGON]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.DRAGON_RAGE)); + await game.phaseInterceptor.to(TurnEndPhase); + const damageDealt = enemyPokemon.getMaxHp() - enemyPokemon.hp; + + expect(damageDealt).toBe(dragonRageDamage); + }); + + it("ignores resistances", async () => { + vi.spyOn(enemyPokemon, "getTypes").mockReturnValue([Type.STEEL]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.DRAGON_RAGE)); + await game.phaseInterceptor.to(TurnEndPhase); + const damageDealt = enemyPokemon.getMaxHp() - enemyPokemon.hp; + + expect(damageDealt).toBe(dragonRageDamage); + }); + + it("ignores stat changes", async () => { + partyPokemon.summonData.battleStats[BattleStat.SPATK] = 2; + + game.doAttack(getMovePosition(game.scene, 0, Moves.DRAGON_RAGE)); + await game.phaseInterceptor.to(TurnEndPhase); + const damageDealt = enemyPokemon.getMaxHp() - enemyPokemon.hp; + + expect(damageDealt).toBe(dragonRageDamage); + }); + + it("ignores stab", async () => { + vi.spyOn(partyPokemon, "getTypes").mockReturnValue([Type.DRAGON]); + + game.doAttack(getMovePosition(game.scene, 0, Moves.DRAGON_RAGE)); + await game.phaseInterceptor.to(TurnEndPhase); + const damageDealt = enemyPokemon.getMaxHp() - enemyPokemon.hp; + + expect(damageDealt).toBe(dragonRageDamage); + }); + + it("ignores criticals", async () => { + partyPokemon.removeTag(BattlerTagType.NO_CRIT); + partyPokemon.addTag(BattlerTagType.ALWAYS_CRIT, 99); + + game.doAttack(getMovePosition(game.scene, 0, Moves.DRAGON_RAGE)); + await game.phaseInterceptor.to(TurnEndPhase); + const damageDealt = enemyPokemon.getMaxHp() - enemyPokemon.hp; + + expect(damageDealt).toBe(dragonRageDamage); + }); + + it("ignores damage modification from abilities such as ice scales", async () => { + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.ICE_SCALES); + + game.doAttack(getMovePosition(game.scene, 0, Moves.DRAGON_RAGE)); + await game.phaseInterceptor.to(TurnEndPhase); + const damageDealt = enemyPokemon.getMaxHp() - enemyPokemon.hp; + + expect(damageDealt).toBe(dragonRageDamage); + }); + + it("ignores multi hit", async () => { + game.scene.addModifier(modifierTypes.MULTI_LENS().newModifier(partyPokemon), false); + + game.doAttack(getMovePosition(game.scene, 0, Moves.DRAGON_RAGE)); + await game.phaseInterceptor.to(TurnEndPhase); + const damageDealt = enemyPokemon.getMaxHp() - enemyPokemon.hp; + + expect(damageDealt).toBe(dragonRageDamage); + }); +}); diff --git a/src/test/moves/dynamax_cannon.test.ts b/src/test/moves/dynamax_cannon.test.ts new file mode 100644 index 00000000000..aab1b210f68 --- /dev/null +++ b/src/test/moves/dynamax_cannon.test.ts @@ -0,0 +1,175 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import Overrides from "#app/overrides"; +import { MoveEffectPhase, DamagePhase, TurnStartPhase } from "#app/phases"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { allMoves } from "#app/data/move"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { BattlerIndex } from "#app/battle"; + +describe("Moves - Dynamax Cannon", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + const dynamaxCannon = allMoves[Moves.DYNAMAX_CANNON]; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ dynamaxCannon.id ]); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(200); + + // Note that, for Waves 1-10, the level cap is 10 + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(1); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]); + + vi.spyOn(dynamaxCannon, "calculateBattlePower"); + }); + + it("should return 100 power against an enemy below level cap", async() => { + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(1); + await game.startBattle([ + Species.ETERNATUS, + ]); + + game.doAttack(getMovePosition(game.scene, 0, 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); + expect(dynamaxCannon.calculateBattlePower).toHaveLastReturnedWith(100); + }, 20000); + + it("should return 100 power against an enemy at level cap", async() => { + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(10); + await game.startBattle([ + Species.ETERNATUS, + ]); + + game.doAttack(getMovePosition(game.scene, 0, 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); + expect(dynamaxCannon.calculateBattlePower).toHaveLastReturnedWith(100); + }, 20000); + + it("should return 120 power against an enemy 1% above level cap", async() => { + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(101); + await game.startBattle([ + Species.ETERNATUS, + ]); + + game.doAttack(getMovePosition(game.scene, 0, dynamaxCannon.id)); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + 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); + expect(dynamaxCannon.calculateBattlePower).toHaveLastReturnedWith(120); + }, 20000); + + it("should return 140 power against an enemy 2% above level capp", async() => { + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(102); + await game.startBattle([ + Species.ETERNATUS, + ]); + + game.doAttack(getMovePosition(game.scene, 0, dynamaxCannon.id)); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + 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); + expect(dynamaxCannon.calculateBattlePower).toHaveLastReturnedWith(140); + }, 20000); + + it("should return 160 power against an enemy 3% above level cap", async() => { + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(103); + await game.startBattle([ + Species.ETERNATUS, + ]); + + game.doAttack(getMovePosition(game.scene, 0, dynamaxCannon.id)); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + 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); + expect(dynamaxCannon.calculateBattlePower).toHaveLastReturnedWith(160); + }, 20000); + + it("should return 180 power against an enemy 4% above level cap", async() => { + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(104); + await game.startBattle([ + Species.ETERNATUS, + ]); + + game.doAttack(getMovePosition(game.scene, 0, dynamaxCannon.id)); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + 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); + expect(dynamaxCannon.calculateBattlePower).toHaveLastReturnedWith(180); + }, 20000); + + it("should return 200 power against an enemy 5% above level cap", async() => { + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(105); + await game.startBattle([ + Species.ETERNATUS, + ]); + + game.doAttack(getMovePosition(game.scene, 0, dynamaxCannon.id)); + + await game.phaseInterceptor.to(MoveEffectPhase, false); + 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); + expect(dynamaxCannon.calculateBattlePower).toHaveLastReturnedWith(200); + }, 20000); + + it("should return 200 power against an enemy way above level cap", async() => { + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(999); + await game.startBattle([ + Species.ETERNATUS, + ]); + + game.doAttack(getMovePosition(game.scene, 0, dynamaxCannon.id)); + + await game.phaseInterceptor.to(TurnStartPhase, false); + // Force user to act before enemy + vi.spyOn((game.scene.getCurrentPhase() as TurnStartPhase), "getOrder").mockReturnValue([ 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); + expect(dynamaxCannon.calculateBattlePower).toHaveLastReturnedWith(200); + }, 20000); +}); diff --git a/src/test/moves/fissure.test.ts b/src/test/moves/fissure.test.ts new file mode 100644 index 00000000000..f91c01ebbe2 --- /dev/null +++ b/src/test/moves/fissure.test.ts @@ -0,0 +1,90 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import Overrides from "#app/overrides"; +import { DamagePhase, TurnEndPhase } from "#app/phases"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#enums/abilities"; +import { Species } from "#app/enums/species.js"; +import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; +import { BattleStat } from "#app/data/battle-stat"; + +describe("Moves - Fissure", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + let partyPokemon: PlayerPokemon; + let enemyPokemon: EnemyPokemon; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(async () => { + game = new GameManager(phaserGame); + + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + + vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.FISSURE]); + vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + + await game.startBattle(); + + partyPokemon = game.scene.getParty()[0]; + enemyPokemon = game.scene.getEnemyPokemon(); + + // remove berries + game.scene.removePartyMemberModifiers(0); + game.scene.clearEnemyHeldItemModifiers(); + }); + + it("ignores damage modification from abilities such as fur coat", async () => { + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NO_GUARD); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.FUR_COAT); + + game.doAttack(getMovePosition(game.scene, 0, Moves.FISSURE)); + await game.phaseInterceptor.to(DamagePhase, true); + + expect(enemyPokemon.isFainted()).toBe(true); + }); + + it("ignores accuracy stat", async () => { + vi.spyOn(partyPokemon, "getAccuracyMultiplier"); + + enemyPokemon.summonData.battleStats[BattleStat.ACC] = -6; + + game.doAttack(getMovePosition(game.scene, 0, Moves.FISSURE)); + + // wait for TurnEndPhase instead of DamagePhase as fissure might not actually inflict damage + await game.phaseInterceptor.to(TurnEndPhase); + + expect(partyPokemon.getAccuracyMultiplier).toHaveReturnedWith(1); + }); + + it("ignores evasion stat", async () => { + vi.spyOn(partyPokemon, "getAccuracyMultiplier"); + + enemyPokemon.summonData.battleStats[BattleStat.EVA] = 6; + + game.doAttack(getMovePosition(game.scene, 0, Moves.FISSURE)); + + // wait for TurnEndPhase instead of DamagePhase as fissure might not actually inflict damage + await game.phaseInterceptor.to(TurnEndPhase); + + expect(partyPokemon.getAccuracyMultiplier).toHaveReturnedWith(1); + }); +}); diff --git a/src/test/moves/flower_shield.test.ts b/src/test/moves/flower_shield.test.ts index f94af93fc66..c36a45790c7 100644 --- a/src/test/moves/flower_shield.test.ts +++ b/src/test/moves/flower_shield.test.ts @@ -1,7 +1,7 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { Species } from "#enums/species"; import { TurnEndPhase, @@ -30,15 +30,15 @@ describe("Moves - Flower Shield", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.FLOWER_SHIELD, Moves.SPLASH]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.FLOWER_SHIELD, Moves.SPLASH]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); }); it("increases defense of all Grass-type Pokemon on the field by one stage - single battle", async () => { - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.CHERRIM); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.CHERRIM); await game.startBattle([Species.MAGIKARP]); const cherrim = game.scene.getEnemyPokemon(); @@ -55,10 +55,9 @@ describe("Moves - Flower Shield", () => { }); it("increases defense of all Grass-type Pokemon on the field by one stage - double battle", async () => { - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); - vi.spyOn(overrides, "STARTING_BIOME_OVERRIDE", "get").mockReturnValue(Biome.GRASS); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(Overrides, "STARTING_BIOME_OVERRIDE", "get").mockReturnValue(Biome.GRASS); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); await game.startBattle([Species.CHERRIM, Species.MAGIKARP]); const field = game.scene.getField(true); @@ -81,9 +80,9 @@ describe("Moves - Flower Shield", () => { * See semi-vulnerable state tags. {@linkcode SemiInvulnerableTag} */ it("does not increase defense of a pokemon in semi-vulnerable state", async () => { - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.PARAS); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DIG, Moves.DIG, Moves.DIG, Moves.DIG]); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(50); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.PARAS); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DIG, Moves.DIG, Moves.DIG, Moves.DIG]); + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(50); await game.startBattle([Species.CHERRIM]); const paras = game.scene.getEnemyPokemon(); @@ -102,7 +101,7 @@ describe("Moves - Flower Shield", () => { }); it("does nothing if there are no Grass-type pokemon on the field", async () => { - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); await game.startBattle([Species.MAGIKARP]); const enemy = game.scene.getEnemyPokemon(); diff --git a/src/test/moves/follow_me.test.ts b/src/test/moves/follow_me.test.ts index f0b80ab90c0..738c9b6e837 100644 --- a/src/test/moves/follow_me.test.ts +++ b/src/test/moves/follow_me.test.ts @@ -1,7 +1,7 @@ import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { CommandPhase, SelectTargetPhase, @@ -32,13 +32,13 @@ describe("Moves - Follow Me", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.AMOONGUSS); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK ]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.AMOONGUSS); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK ]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); test( @@ -101,9 +101,9 @@ describe("Moves - Follow Me", () => { test( "move effect should be bypassed by Stalwart", async () => { - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.STALWART); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.QUICK_ATTACK ]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME ]); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.STALWART); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.QUICK_ATTACK ]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME ]); await game.startBattle([ Species.AMOONGUSS, Species.CHARIZARD ]); @@ -136,8 +136,8 @@ describe("Moves - Follow Me", () => { test( "move effect should be bypassed by Snipe Shot", async () => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.SNIPE_SHOT ]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME ]); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.SNIPE_SHOT ]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME ]); await game.startBattle([ Species.AMOONGUSS, Species.CHARIZARD ]); diff --git a/src/test/moves/gastro_acid.test.ts b/src/test/moves/gastro_acid.test.ts index 063a17aead9..c8f6ab6cc6a 100644 --- a/src/test/moves/gastro_acid.test.ts +++ b/src/test/moves/gastro_acid.test.ts @@ -3,7 +3,7 @@ import GameManager from "../utils/gameManager"; import { Moves } from "#app/enums/moves.js"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { Abilities } from "#app/enums/abilities.js"; import { BattlerIndex } from "#app/battle.js"; import { getMovePosition } from "../utils/gameManagerUtils"; @@ -29,14 +29,14 @@ describe("Moves - Gastro Acid", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(1); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.GASTRO_ACID, Moves.WATER_GUN, Moves.SPLASH, Moves.CORE_ENFORCER]); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.BIDOOF); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WATER_ABSORB); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(1); + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.GASTRO_ACID, Moves.WATER_GUN, Moves.SPLASH, Moves.CORE_ENFORCER]); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.BIDOOF); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.WATER_ABSORB); }); it("suppresses effect of ability", async () => { @@ -68,11 +68,11 @@ describe("Moves - Gastro Acid", () => { await game.phaseInterceptor.to("TurnEndPhase"); expect(enemyField[0].hp).toBeLessThan(enemyField[0].getMaxHp()); - expect(enemyField[1].hp).toBe(enemyField[1].getMaxHp()); + expect(enemyField[1].isFullHp()).toBe(true); }, TIMEOUT); it("fails if used on an enemy with an already-suppressed ability", async () => { - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue(null); await game.startBattle(); diff --git a/src/test/moves/glaive_rush.test.ts b/src/test/moves/glaive_rush.test.ts new file mode 100644 index 00000000000..8cc2dc73b72 --- /dev/null +++ b/src/test/moves/glaive_rush.test.ts @@ -0,0 +1,132 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import Overrides from "#app/overrides"; +import { DamagePhase, TurnEndPhase } from "#app/phases"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Abilities } from "#app/enums/abilities.js"; +import { allMoves } from "#app/data/move.js"; + + +describe("Moves - Glaive Rush", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(Array(4).fill(Moves.GLAIVE_RUSH)); + vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.KLINK); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.UNNERVE); + vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.FUR_COAT); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SHADOW_SNEAK, Moves.AVALANCHE, Moves.SPLASH, Moves.GLAIVE_RUSH]); + }); + + it("takes double damage from attacks", async() => { + await game.startBattle(); + const enemy = game.scene.getEnemyPokemon(); + enemy.hp = 1000; + + vi.spyOn(game.scene, "randBattleSeedInt").mockReturnValue(0); + game.doAttack(getMovePosition(game.scene, 0, Moves.SHADOW_SNEAK)); + await game.phaseInterceptor.to(DamagePhase); + const damageDealt = 1000 - enemy.hp; + await game.phaseInterceptor.to(TurnEndPhase); + game.doAttack(getMovePosition(game.scene, 0, Moves.SHADOW_SNEAK)); + await game.phaseInterceptor.to(DamagePhase); + expect(enemy.hp).toBeLessThanOrEqual(1001 - (damageDealt * 3)); + + }, 20000); + + it("always gets hit by attacks", async() => { + await game.startBattle(); + const enemy = game.scene.getEnemyPokemon(); + enemy.hp = 1000; + + allMoves[Moves.AVALANCHE].accuracy = 0; + game.doAttack(getMovePosition(game.scene, 0, Moves.AVALANCHE)); + await game.phaseInterceptor.to(TurnEndPhase); + expect(enemy.hp).toBeLessThan(1000); + + }, 20000); + + it("interacts properly with multi-lens", async() => { + vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([{name: "MULTI_LENS", count: 2}]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(Array(4).fill(Moves.AVALANCHE)); + await game.startBattle(); + const player = game.scene.getPlayerPokemon(); + const enemy = game.scene.getEnemyPokemon(); + enemy.hp = 1000; + player.hp = 1000; + + allMoves[Moves.AVALANCHE].accuracy = 0; + game.doAttack(getMovePosition(game.scene, 0, Moves.GLAIVE_RUSH)); + await game.phaseInterceptor.to(TurnEndPhase); + expect(player.hp).toBeLessThan(1000); + player.hp = 1000; + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + await game.phaseInterceptor.to(TurnEndPhase); + expect(player.hp).toBe(1000); + + }, 20000); + + it("secondary effects only last until next move", async() => { + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(Array(4).fill(Moves.SHADOW_SNEAK)); + await game.startBattle(); + const player = game.scene.getPlayerPokemon(); + const enemy = game.scene.getEnemyPokemon(); + enemy.hp = 1000; + player.hp = 1000; + allMoves[Moves.SHADOW_SNEAK].accuracy = 0; + + game.doAttack(getMovePosition(game.scene, 0, Moves.GLAIVE_RUSH)); + await game.phaseInterceptor.to(TurnEndPhase); + expect(player.hp).toBe(1000); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + await game.phaseInterceptor.to(TurnEndPhase); + const damagedHp = player.hp; + expect(player.hp).toBeLessThan(1000); + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + await game.phaseInterceptor.to(TurnEndPhase); + expect(player.hp).toBe(damagedHp); + + }, 20000); + + it("secondary effects are removed upon switching", async() => { + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(Array(4).fill(Moves.SHADOW_SNEAK)); + vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(0); + await game.startBattle([Species.KLINK, Species.FEEBAS]); + const player = game.scene.getPlayerPokemon(); + const enemy = game.scene.getEnemyPokemon(); + enemy.hp = 1000; + allMoves[Moves.SHADOW_SNEAK].accuracy = 0; + + game.doAttack(getMovePosition(game.scene, 0, Moves.GLAIVE_RUSH)); + await game.phaseInterceptor.to(TurnEndPhase); + expect(player.hp).toBe(player.getMaxHp()); + + game.doSwitchPokemon(1); + await game.phaseInterceptor.to(TurnEndPhase); + game.doSwitchPokemon(1); + await game.phaseInterceptor.to(TurnEndPhase); + expect(player.hp).toBe(player.getMaxHp()); + + }, 20000); +}); diff --git a/src/test/moves/growth.test.ts b/src/test/moves/growth.test.ts index 4e5add26207..6068c114fc3 100644 --- a/src/test/moves/growth.test.ts +++ b/src/test/moves/growth.test.ts @@ -1,7 +1,7 @@ import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { CommandPhase, EnemyCommandPhase, @@ -34,13 +34,13 @@ describe("Moves - Growth", () => { beforeEach(() => { game = new GameManager(phaserGame); const moveToUse = Moves.GROWTH; - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MOXIE); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.MOXIE); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); it("GROWTH", async() => { diff --git a/src/test/moves/hard_press.test.ts b/src/test/moves/hard_press.test.ts index c6f071a699f..8800d66bd9a 100644 --- a/src/test/moves/hard_press.test.ts +++ b/src/test/moves/hard_press.test.ts @@ -1,23 +1,22 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { Species } from "#enums/species"; import { - MoveEffectPhase, + MoveEffectPhase } from "#app/phases"; import { Moves } from "#enums/moves"; import { getMovePosition } from "#app/test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; -import { NumberHolder } from "#app/utils.js"; -import Move from "#app/data/move.js"; -import Pokemon from "#app/field/pokemon.js"; -import { allMoves, OpponentHighHpPowerAttr } from "#app/data/move.js"; +import { allMoves } from "#app/data/move.js"; describe("Moves - Hard Press", () => { let phaserGame: Phaser.Game; let game: GameManager; + const moveToCheck = allMoves[Moves.HARD_PRESS]; + beforeAll(() => { phaserGame = new Phaser.Game({ type: Phaser.HEADLESS, @@ -30,54 +29,60 @@ describe("Moves - Hard Press", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.HARD_PRESS]); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MUNCHLAX); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.HARD_PRESS]); + vi.spyOn(moveToCheck, "calculateBattlePower"); }); - it("power varies between 1 and 100, and is greater the more HP the target has", async () => { - await game.startBattle([Species.GRAVELER]); - const moveToBeUsed = allMoves[Moves.HARD_PRESS]; + it("should return 100 power if target HP ratio is at 100%", async () => { + await game.startBattle([Species.PIKACHU]); - game.doAttack(getMovePosition(game.scene, 0, moveToBeUsed)); + game.doAttack(getMovePosition(game.scene, 0, Moves.HARD_PRESS)); await game.phaseInterceptor.to(MoveEffectPhase); - const enemy = game.scene.getEnemyPokemon(); - const movePower = getMockedMovePower(enemy, game.scene.getPlayerPokemon(), moveToBeUsed); - const moveMaxBasePower = getMoveMaxBasePower(moveToBeUsed); + expect(moveToCheck.calculateBattlePower).toHaveReturnedWith(100); + }); - expect(movePower).toBe(moveMaxBasePower * enemy.getHpRatio()); + it("should return 50 power if target HP ratio is at 50%", async () => { + await game.startBattle([Species.PIKACHU]); + const targetHpRatio = .5; + const enemy = game.scene.getEnemyPokemon(); + + vi.spyOn(enemy, "getHpRatio").mockReturnValue(targetHpRatio); + + game.doAttack(getMovePosition(game.scene, 0, Moves.HARD_PRESS)); + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(moveToCheck.calculateBattlePower).toHaveReturnedWith(50); + }); + + it("should return 1 power if target HP ratio is at 1%", async () => { + await game.startBattle([Species.PIKACHU]); + const targetHpRatio = .01; + const enemy = game.scene.getEnemyPokemon(); + + vi.spyOn(enemy, "getHpRatio").mockReturnValue(targetHpRatio); + + game.doAttack(getMovePosition(game.scene, 0, Moves.HARD_PRESS)); + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(moveToCheck.calculateBattlePower).toHaveReturnedWith(1); + }); + + it("should return 1 power if target HP ratio is less than 1%", async () => { + await game.startBattle([Species.PIKACHU]); + const targetHpRatio = .005; + const enemy = game.scene.getEnemyPokemon(); + + vi.spyOn(enemy, "getHpRatio").mockReturnValue(targetHpRatio); + + game.doAttack(getMovePosition(game.scene, 0, Moves.HARD_PRESS)); + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(moveToCheck.calculateBattlePower).toHaveReturnedWith(1); }); }); - -/** - * Calculates the mocked move power based on the attributes of the move and the opponent's high HP. - * - * @param defender - The defending Pokémon. - * @param attacker - The attacking Pokémon. - * @param move - The move being used. - * @returns The calculated move power. - */ -const getMockedMovePower = (defender: Pokemon, attacker: Pokemon, move: Move) => { - const powerHolder = new NumberHolder(move.power); - - if (move.hasAttr(OpponentHighHpPowerAttr)) { - const attr = move.getAttrs(OpponentHighHpPowerAttr); - attr[0].apply(attacker, defender, move, [ powerHolder ]); - } - - return powerHolder.value; -}; - -/** - * Retrieves the maximum base power of a move based on its attributes. - * - * @param move - The move which maximum base power is being retrieved. - * @returns The maximum base power of the move. - */ -const getMoveMaxBasePower = (move: Move) => { - const attr = move.getAttrs(OpponentHighHpPowerAttr); - - return (attr[0] as OpponentHighHpPowerAttr)["maxBasePower"]; -}; diff --git a/src/test/moves/hyper_beam.test.ts b/src/test/moves/hyper_beam.test.ts new file mode 100644 index 00000000000..2a6486c0de5 --- /dev/null +++ b/src/test/moves/hyper_beam.test.ts @@ -0,0 +1,72 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import overrides from "#app/overrides"; +import { Abilities } from "#app/enums/abilities.js"; +import { Species } from "#app/enums/species.js"; +import { Moves } from "#app/enums/moves.js"; +import { allMoves } from "#app/data/move.js"; +import { getMovePosition } from "../utils/gameManagerUtils"; +import { BerryPhase, TurnEndPhase } from "#app/phases.js"; +import { BattlerTagType } from "#app/enums/battler-tag-type.js"; + +const TIMEOUT = 20 * 1000; // 20 sec timeout for all tests + +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); + + vi.spyOn(overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(Array(4).fill(Moves.SPLASH)); + + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([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.doAttack(getMovePosition(game.scene, 0, 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.doAttack(getMovePosition(game.scene, 0, Moves.TACKLE)); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(enemyPokemon.hp).toBeLessThan(enemyPostAttackHp); + }, TIMEOUT + ); +}); diff --git a/src/test/moves/light_screen.test.ts b/src/test/moves/light_screen.test.ts index 30a27ce4412..5269ec6d8ee 100644 --- a/src/test/moves/light_screen.test.ts +++ b/src/test/moves/light_screen.test.ts @@ -1,7 +1,7 @@ import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { TurnEndPhase, } from "#app/phases"; @@ -34,13 +34,13 @@ describe("Moves - Light Screen", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ABSORB, Moves.DAZZLING_GLEAM, Moves.TACKLE]); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN]); - vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ABSORB, Moves.DAZZLING_GLEAM, Moves.TACKLE]); + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN, Moves.LIGHT_SCREEN]); + vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); }); it("reduces damage of special attacks by half in a single battle", async() => { @@ -57,8 +57,7 @@ describe("Moves - Light Screen", () => { }); it("reduces damage of special attacks by a third in a double battle", async() => { - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); const moveToUse = Moves.DAZZLING_GLEAM; await game.startBattle([Species.SHUCKLE, Species.SHUCKLE]); diff --git a/src/test/moves/magnet_rise.test.ts b/src/test/moves/magnet_rise.test.ts index 7ed5b84654c..2b06867f0a7 100644 --- a/src/test/moves/magnet_rise.test.ts +++ b/src/test/moves/magnet_rise.test.ts @@ -1,7 +1,7 @@ import {beforeAll, afterEach, beforeEach, describe, vi, it, expect} from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import {Moves} from "#enums/moves"; import {Species} from "#enums/species"; import {CommandPhase, TurnEndPhase} from "#app/phases.js"; @@ -23,13 +23,13 @@ describe("Moves - Magnet Rise", () => { beforeEach(() => { game = new GameManager(phaserGame); const moveToUse = Moves.MAGNET_RISE; - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGNEZONE); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DRILL_RUN, Moves.DRILL_RUN, Moves.DRILL_RUN, Moves.DRILL_RUN]); - vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(1); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse, Moves.SPLASH, Moves.GRAVITY, Moves.BATON_PASS]); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGNEZONE); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DRILL_RUN, Moves.DRILL_RUN, Moves.DRILL_RUN, Moves.DRILL_RUN]); + vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(1); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse, Moves.SPLASH, Moves.GRAVITY, Moves.BATON_PASS]); }); it("MAGNET RISE", async () => { diff --git a/src/test/moves/make_it_rain.test.ts b/src/test/moves/make_it_rain.test.ts index a700ff10aae..c578a70bb9c 100644 --- a/src/test/moves/make_it_rain.test.ts +++ b/src/test/moves/make_it_rain.test.ts @@ -1,7 +1,7 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { Species } from "#enums/species"; import { CommandPhase, @@ -31,13 +31,13 @@ describe("Moves - Make It Rain", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.MAKE_IT_RAIN, Moves.SPLASH]); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.MAKE_IT_RAIN, Moves.SPLASH]); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); }); it("should only reduce Sp. Atk. once in a double battle", async () => { @@ -62,9 +62,8 @@ describe("Moves - Make It Rain", () => { }, TIMEOUT); it("should apply effects even if the target faints", async () => { - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(1); // ensures the enemy will faint - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(1); // ensures the enemy will faint + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); await game.startBattle([Species.CHARIZARD]); @@ -83,7 +82,7 @@ describe("Moves - Make It Rain", () => { }, TIMEOUT); it("should reduce Sp. Atk. once after KOing two enemies", async () => { - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(1); // ensures the enemy will faint + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(1); // ensures the enemy will faint await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); diff --git a/src/test/moves/multi_target.test.ts b/src/test/moves/multi_target.test.ts new file mode 100644 index 00000000000..7548e9529d1 --- /dev/null +++ b/src/test/moves/multi_target.test.ts @@ -0,0 +1,180 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import Overrides from "#app/overrides"; +import { Moves } from "#enums/moves"; +import { getMoveTargets } from "#app/data/move.js"; +import { Abilities } from "#app/enums/abilities.js"; +import { Species } from "#app/enums/species.js"; +import { getMovePosition } from "../utils/gameManagerUtils"; +import { TurnEndPhase } from "#app/phases.js"; + +const TIMEOUT = 20 * 1000; + +describe("Moves - Multi target", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + afterTrial(game); + }); + + beforeEach(() => { + game = beforeTrial(phaserGame); + }); + + it("2v2 - target all near others - check modifier", () => checkTargetMultiplier(game, Moves.EARTHQUAKE, false, false, true), TIMEOUT); + + it("2v2 - target all near others - damage decrase", () => checkDamageDecrease(game, Moves.EARTHQUAKE, false, false, true), TIMEOUT); + + it("2v1 - target all near others - check modifier", () => checkTargetMultiplier(game, Moves.EARTHQUAKE, false, true, true), TIMEOUT); + + it("2v1 - target all near others - damage decrase", () => checkDamageDecrease(game, Moves.EARTHQUAKE, false, true, true), TIMEOUT); + + it("1v2 - target all near others - check modifier", () => checkTargetMultiplier(game, Moves.EARTHQUAKE, true, false, true), TIMEOUT); + + it("1v2 - target all near others - damage decrase", () => checkDamageDecrease(game, Moves.EARTHQUAKE, true, false, true), TIMEOUT); + + it("1v1 - target all near others - check modifier", () => checkTargetMultiplier(game, Moves.EARTHQUAKE, true, true, false), TIMEOUT); + + it("2v2 (immune) - target all near others - check modifier", () => checkTargetMultiplier(game, Moves.EARTHQUAKE, false, false, true, Abilities.LEVITATE), TIMEOUT); + + it("2v2 (immune) - target all near others - damage decrase", () => checkDamageDecrease(game, Moves.EARTHQUAKE, false, false, true, Abilities.LEVITATE), TIMEOUT); + + it("2v2 - target all near enemies - check modifier", () => checkTargetMultiplier(game, Moves.HYPER_VOICE, false, false, true), TIMEOUT); + + it("2v2 - target all near enemies - damage decrase", () => checkDamageDecrease(game, Moves.HYPER_VOICE, false, false, true), TIMEOUT); + + it("2v1 - target all near enemies - check modifier", () => checkTargetMultiplier(game, Moves.HYPER_VOICE, false, true, false), TIMEOUT); + + it("2v1 - target all near enemies - no damage decrase", () => checkDamageDecrease(game, Moves.HYPER_VOICE, false, true, false), TIMEOUT); + + it("1v2 - target all near enemies - check modifier", () => checkTargetMultiplier(game, Moves.HYPER_VOICE, true, false, true), TIMEOUT); + + it("1v2 - target all near enemies - damage decrase", () => checkDamageDecrease(game, Moves.HYPER_VOICE, true, false, true), TIMEOUT); + + it("1v1 - target all near enemies - check modifier", () => checkTargetMultiplier(game, Moves.HYPER_VOICE, true, true, false), TIMEOUT); + + it("2v2 (immune) - target all near enemies - check modifier", () => checkTargetMultiplier(game, Moves.HYPER_VOICE, false, false, true, Abilities.SOUNDPROOF), TIMEOUT); + + it("2v2 (immune) - target all near enemies - damage decrase", () => checkDamageDecrease(game, Moves.HYPER_VOICE, false, false, true, Abilities.SOUNDPROOF), TIMEOUT); + +}); + +async function checkTargetMultiplier(game: GameManager, attackMove: Moves, killAlly: boolean, killSecondEnemy: boolean, shouldMultiplied: boolean, oppAbility?: Abilities) { + // play an attack and check target count + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(oppAbility ? oppAbility : Abilities.BALL_FETCH); + await game.startBattle(); + + const playerPokemonRepr = game.scene.getPlayerField(); + expect(playerPokemonRepr).not.toBeUndefined(); + + killAllyAndEnemy(game, killAlly, killSecondEnemy); + + const targetCount = getMoveTargets(playerPokemonRepr[0], attackMove).targets.length; + const targetMultiplier = targetCount > 1 ? 0.75 : 1; + + if (shouldMultiplied) { + expect(targetMultiplier).toBe(0.75); + } else { + expect(targetMultiplier).toBe(1); + } +} + +async function checkDamageDecrease(game: GameManager, attackMove: Moves, killAlly: boolean, killSecondEnemy: boolean, shouldDecreased: boolean, ability?: Abilities) { + // Tested combination on first turn, 1v1 on second turn + await game.runToSummon([Species.EEVEE, Species.EEVEE]); + + if (ability !== undefined) { + game.scene.getPlayerField()[1].abilityIndex = ability; + game.scene.getEnemyField()[1].abilityIndex = ability; + } + + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + + + await game.phaseInterceptor.to(TurnEndPhase); + + killAllyAndEnemy(game, killAlly, killSecondEnemy); + await game.toNextTurn(); + + const initialHp = game.scene.getEnemyField()[0].hp; + game.doAttack(getMovePosition(game.scene, 0, attackMove)); + if (!killAlly) { + game.doAttack(getMovePosition(game.scene, 1, Moves.SPLASH)); + } + + await game.phaseInterceptor.to(TurnEndPhase); + const afterHp = game.scene.getEnemyField()[0].hp; + + killAllyAndEnemy(game, true, true); + await game.toNextTurn(); + + game.scene.getEnemyField()[0].hp = initialHp; + + const initialHp1v1 = game.scene.getEnemyField()[0].hp; + game.doAttack(getMovePosition(game.scene, 0, attackMove)); + + await game.phaseInterceptor.to(TurnEndPhase); + const afterHp1v1 = game.scene.getEnemyField()[0].hp; + + if (shouldDecreased) { + expect(initialHp - afterHp).toBeLessThan(0.75 * (initialHp1v1 - afterHp1v1) + 2); + expect(initialHp - afterHp).toBeGreaterThan(0.75 * (initialHp1v1 - afterHp1v1) - 2); + } else { + expect(initialHp - afterHp).toBeLessThan(initialHp1v1 - afterHp1v1 + 2); + expect(initialHp - afterHp).toBeGreaterThan(initialHp1v1 - afterHp1v1 - 2); + } + +} + +// To simulate the situation where all of the enemies or the player's Pokemons dies except for one. +function killAllyAndEnemy(game: GameManager, killAlly: boolean, killSecondEnemy: boolean) { + if (killAlly) { + leaveOnePlayerPokemon(game); + expect(game.scene.getPlayerField().filter(p => p.isActive()).length).toBe(1); + } + if (killSecondEnemy) { + leaveOneEnemyPokemon(game); + expect(game.scene.getEnemyField().filter(p => p.isActive()).length).toBe(1); + } +} + +function leaveOnePlayerPokemon(game: GameManager) { + const playerPokemons = game.scene.getParty(); + for (let i = 1; i < playerPokemons.length; i++) { + playerPokemons[i].hp = 0; + } + expect(playerPokemons.filter(pokemon => pokemon.hp > 0).length).toBe(1); +} + +function leaveOneEnemyPokemon(game: GameManager) { + const enemyPokemons = game.scene.getEnemyParty(); + for (let i = 1; i < enemyPokemons.length; i++) { + enemyPokemons[i].hp = 0; + } +} + +function beforeTrial(phaserGame: Phaser.Game, single: boolean = false) { + const game = new GameManager(phaserGame); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.EARTHQUAKE, Moves.HYPER_VOICE, Moves.SURF, Moves.SPLASH]); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(50); + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(40); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.EEVEE); + return game; +} + +function afterTrial(game: GameManager) { + game.phaseInterceptor.restoreOg(); +} diff --git a/src/test/moves/octolock.test.ts b/src/test/moves/octolock.test.ts new file mode 100644 index 00000000000..af96c2dc872 --- /dev/null +++ b/src/test/moves/octolock.test.ts @@ -0,0 +1,78 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import Overrides from "#app/overrides"; +import { CommandPhase, MoveEndPhase, TurnInitPhase } from "#app/phases"; +import {getMovePosition} from "#app/test/utils/gameManagerUtils"; +import {BattleStat} from "#app/data/battle-stat"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { TrappedTag } from "#app/data/battler-tags.js"; + +describe("Moves - Octolock", () => { + describe("integration tests", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.OCTOLOCK, Moves.SPLASH]); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + }); + + it("Reduces DEf and SPDEF by 1 each turn", { timeout: 10000 }, async () => { + await game.startBattle([Species.GRAPPLOCT]); + + const enemyPokemon = game.scene.getEnemyField(); + + // use Octolock and advance to init phase of next turn to check for stat changes + game.doAttack(getMovePosition(game.scene, 0, Moves.OCTOLOCK)); + await game.phaseInterceptor.to(TurnInitPhase); + + expect(enemyPokemon[0].summonData.battleStats[BattleStat.DEF]).toBe(-1); + expect(enemyPokemon[0].summonData.battleStats[BattleStat.SPDEF]).toBe(-1); + + // take a second turn to make sure stat changes occur again + await game.phaseInterceptor.to(CommandPhase); + game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH)); + + await game.phaseInterceptor.to(TurnInitPhase); + expect(enemyPokemon[0].summonData.battleStats[BattleStat.DEF]).toBe(-2); + expect(enemyPokemon[0].summonData.battleStats[BattleStat.SPDEF]).toBe(-2); + }); + + it("Traps the target pokemon", { timeout: 10000 }, async () => { + await game.startBattle([Species.GRAPPLOCT]); + + const enemyPokemon = game.scene.getEnemyField(); + + // before Octolock - enemy should not be trapped + expect(enemyPokemon[0].findTag(t => t instanceof TrappedTag)).toBeUndefined(); + + game.doAttack(getMovePosition(game.scene, 0, Moves.OCTOLOCK)); + + // after Octolock - enemy should be trapped + await game.phaseInterceptor.to(MoveEndPhase); + expect(enemyPokemon[0].findTag(t => t instanceof TrappedTag)).toBeDefined(); + }); + }); +}); diff --git a/src/test/moves/purify.test.ts b/src/test/moves/purify.test.ts index 21ebb3d5515..282d33f85f9 100644 --- a/src/test/moves/purify.test.ts +++ b/src/test/moves/purify.test.ts @@ -1,7 +1,7 @@ import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { MoveEndPhase, } from "#app/phases"; @@ -29,15 +29,15 @@ describe("Moves - Purify", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); - vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.PYUKUMUKU); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(10); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.PURIFY, Moves.SIZZLY_SLIDE]); + vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.PYUKUMUKU); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(10); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.PURIFY, Moves.SIZZLY_SLIDE]); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(10); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(10); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]); }); test( @@ -55,7 +55,7 @@ describe("Moves - Purify", () => { await game.phaseInterceptor.to(MoveEndPhase); expect(enemyPokemon.status).toBe(undefined); - expect(playerPokemon.hp).toBe(playerPokemon.getMaxHp()); + expect(playerPokemon.isFullHp()).toBe(true); }, TIMEOUT ); diff --git a/src/test/moves/rage_powder.test.ts b/src/test/moves/rage_powder.test.ts index 1116810f743..3c315447b23 100644 --- a/src/test/moves/rage_powder.test.ts +++ b/src/test/moves/rage_powder.test.ts @@ -1,7 +1,7 @@ import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { CommandPhase, SelectTargetPhase, @@ -31,19 +31,19 @@ describe("Moves - Rage Powder", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.AMOONGUSS); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK ]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.AMOONGUSS); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK ]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); test( "move effect should be bypassed by Grass type", async () => { - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.RAGE_POWDER, Moves.RAGE_POWDER, Moves.RAGE_POWDER, Moves.RAGE_POWDER ]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.RAGE_POWDER, Moves.RAGE_POWDER, Moves.RAGE_POWDER, Moves.RAGE_POWDER ]); await game.startBattle([ Species.AMOONGUSS, Species.VENUSAUR ]); @@ -76,8 +76,8 @@ describe("Moves - Rage Powder", () => { test( "move effect should be bypassed by Overcoat", async () => { - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.OVERCOAT); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.RAGE_POWDER, Moves.RAGE_POWDER, Moves.RAGE_POWDER, Moves.RAGE_POWDER ]); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.OVERCOAT); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.RAGE_POWDER, Moves.RAGE_POWDER, Moves.RAGE_POWDER, Moves.RAGE_POWDER ]); // Test with two non-Grass type player Pokemon await game.startBattle([ Species.BLASTOISE, Species.CHARIZARD ]); diff --git a/src/test/moves/reflect.test.ts b/src/test/moves/reflect.test.ts index 00fb9a69f2f..9b57b3cdee3 100644 --- a/src/test/moves/reflect.test.ts +++ b/src/test/moves/reflect.test.ts @@ -1,7 +1,7 @@ import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { TurnEndPhase, } from "#app/phases"; @@ -34,13 +34,13 @@ describe("Moves - Reflect", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ABSORB, Moves.ROCK_SLIDE, Moves.TACKLE]); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.REFLECT, Moves.REFLECT, Moves.REFLECT, Moves.REFLECT]); - vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ABSORB, Moves.ROCK_SLIDE, Moves.TACKLE]); + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.REFLECT, Moves.REFLECT, Moves.REFLECT, Moves.REFLECT]); + vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); }); it("reduces damage of physical attacks by half in a single battle", async() => { @@ -56,8 +56,7 @@ describe("Moves - Reflect", () => { }); it("reduces damage of physical attacks by a third in a double battle", async() => { - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); const moveToUse = Moves.ROCK_SLIDE; await game.startBattle([Species.SHUCKLE, Species.SHUCKLE]); diff --git a/src/test/moves/rollout.test.ts b/src/test/moves/rollout.test.ts new file mode 100644 index 00000000000..6d8828455e4 --- /dev/null +++ b/src/test/moves/rollout.test.ts @@ -0,0 +1,82 @@ +import { allMoves } from "#app/data/move.js"; +import Overrides from "#app/overrides"; +import { CommandPhase } from "#app/phases"; +import GameManager from "#app/test/utils/gameManager"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { SPLASH_ONLY } from "../utils/testUtils"; + +describe("Moves - Rollout", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.BIDOOF); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(SPLASH_ONLY); + }); + + it("should double it's dmg on sequential uses but reset after 5", async () => { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ROLLOUT]); + vi.spyOn(allMoves[Moves.ROLLOUT], "accuracy", "get").mockReturnValue(100); //always hit + + const variance = 5; + const turns = 6; + const dmgHistory: number[] = []; + + 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 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, "getHeldItems").mockReturnValue([]); //no berries + + enemyPkm.hp = enemyPkm.getMaxHp(); + let previousHp = enemyPkm.hp; + + for (let i = 0; i < turns; i++) { + game.doAttack(getMovePosition(game.scene, 0, Moves.ROLLOUT)); + await game.phaseInterceptor.to(CommandPhase); + + dmgHistory.push(previousHp - enemyPkm.hp); + previousHp = enemyPkm.hp; + } + + const [turn1Dmg, turn2Dmg, turn3Dmg, turn4Dmg, turn5Dmg, turn6Dmg] = dmgHistory; + + expect(turn2Dmg).toBeGreaterThanOrEqual(turn1Dmg * 2 - variance); + expect(turn2Dmg).toBeLessThanOrEqual(turn1Dmg * 2 + variance); + expect(turn3Dmg).toBeGreaterThanOrEqual(turn2Dmg * 2 - variance); + expect(turn3Dmg).toBeLessThanOrEqual(turn2Dmg * 2 + variance); + expect(turn4Dmg).toBeGreaterThanOrEqual(turn3Dmg * 2 - variance); + expect(turn4Dmg).toBeLessThanOrEqual(turn3Dmg * 2 + variance); + expect(turn5Dmg).toBeGreaterThanOrEqual(turn4Dmg * 2 - variance); + expect(turn5Dmg).toBeLessThanOrEqual(turn4Dmg * 2 + variance); + // reset + expect(turn6Dmg).toBeGreaterThanOrEqual(turn1Dmg - variance); + expect(turn6Dmg).toBeLessThanOrEqual(turn1Dmg + variance); + }); +}); diff --git a/src/test/moves/roost.test.ts b/src/test/moves/roost.test.ts index db9363313a1..7f8495e1632 100644 --- a/src/test/moves/roost.test.ts +++ b/src/test/moves/roost.test.ts @@ -1,7 +1,7 @@ import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { Species } from "#app/enums/species.js"; import { Moves } from "#app/enums/moves.js"; import { getMovePosition } from "../utils/gameManagerUtils"; @@ -27,13 +27,13 @@ describe("Moves - Roost", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.STARAPTOR); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.STOMPING_TANTRUM ]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ROOST,Moves.ROOST,Moves.ROOST,Moves.ROOST]); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.STARAPTOR); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.STOMPING_TANTRUM ]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.ROOST,Moves.ROOST,Moves.ROOST,Moves.ROOST]); }); test( diff --git a/src/test/moves/spikes.test.ts b/src/test/moves/spikes.test.ts index 0544442f31e..44f365ea689 100644 --- a/src/test/moves/spikes.test.ts +++ b/src/test/moves/spikes.test.ts @@ -1,7 +1,7 @@ import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { CommandPhase } from "#app/phases"; @@ -27,15 +27,15 @@ describe("Moves - Spikes", () => { beforeEach(() => { game = new GameManager(phaserGame); game.scene.battleStyle = 1; - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH,Moves.SPLASH,Moves.SPLASH,Moves.SPLASH]); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPIKES,Moves.SPLASH, Moves.ROAR]); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.HYDRATION); + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH,Moves.SPLASH,Moves.SPLASH,Moves.SPLASH]); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPIKES,Moves.SPLASH, Moves.ROAR]); }); it("single - wild - stay on field - no damage", async() => { @@ -86,7 +86,7 @@ describe("Moves - Spikes", () => { }, 20000); it("trainer - wild - force switch opponent - should take damage", async() => { - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); // player set spikes on the field and do splash for 3 turns // opponent do splash for 4 turns // nobody should take damage @@ -104,9 +104,9 @@ describe("Moves - Spikes", () => { }, 20000); it("trainer - wild - force switch by himself opponent - should take damage", async() => { - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(5000); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(0); + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(5); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(5000); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(0); // turn 1: player set spikes, opponent do splash // turn 2: player do splash, opponent switch pokemon // opponent pokemon should trigger spikes and lose HP diff --git a/src/test/moves/spit_up.test.ts b/src/test/moves/spit_up.test.ts new file mode 100644 index 00000000000..f136d8f1e2b --- /dev/null +++ b/src/test/moves/spit_up.test.ts @@ -0,0 +1,201 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import overrides from "#app/overrides"; +import { MovePhase, TurnInitPhase } from "#app/phases"; +import { BattleStat } from "#app/data/battle-stat"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { StockpilingTag } from "#app/data/battler-tags.js"; +import { MoveResult, TurnMove } from "#app/field/pokemon.js"; +import { BattlerTagType } from "#app/enums/battler-tag-type.js"; +import { allMoves } from "#app/data/move.js"; + +describe("Moves - Spit 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); + + vi.spyOn(overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(2000); + + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPIT_UP, Moves.SPIT_UP, Moves.SPIT_UP, Moves.SPIT_UP]); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + }); + + describe("consumes all stockpile stacks to deal damage (scaling with stacks)", () => { + it("1 stack -> 100 power", { timeout: 10000 }, async () => { + const stacksToSetup = 1; + const expectedPower = 100; + + await game.startBattle([Species.ABOMASNOW]); + + const pokemon = game.scene.getPlayerPokemon(); + pokemon.addTag(BattlerTagType.STOCKPILING); + + const stockpilingTag = pokemon.getTag(StockpilingTag); + expect(stockpilingTag).toBeDefined(); + expect(stockpilingTag.stockpiledCount).toBe(stacksToSetup); + + vi.spyOn(allMoves[Moves.SPIT_UP], "calculateBattlePower"); + + game.doAttack(0); + await game.phaseInterceptor.to(TurnInitPhase); + + expect(allMoves[Moves.SPIT_UP].calculateBattlePower).toHaveBeenCalledOnce(); + expect(allMoves[Moves.SPIT_UP].calculateBattlePower).toHaveReturnedWith(expectedPower); + + expect(pokemon.getTag(StockpilingTag)).toBeUndefined(); + }); + + it("2 stacks -> 200 power", { timeout: 10000 }, async () => { + const stacksToSetup = 2; + const expectedPower = 200; + + await game.startBattle([Species.ABOMASNOW]); + + const pokemon = game.scene.getPlayerPokemon(); + pokemon.addTag(BattlerTagType.STOCKPILING); + pokemon.addTag(BattlerTagType.STOCKPILING); + + const stockpilingTag = pokemon.getTag(StockpilingTag); + expect(stockpilingTag).toBeDefined(); + expect(stockpilingTag.stockpiledCount).toBe(stacksToSetup); + + vi.spyOn(allMoves[Moves.SPIT_UP], "calculateBattlePower"); + + game.doAttack(0); + await game.phaseInterceptor.to(TurnInitPhase); + + expect(allMoves[Moves.SPIT_UP].calculateBattlePower).toHaveBeenCalledOnce(); + expect(allMoves[Moves.SPIT_UP].calculateBattlePower).toHaveReturnedWith(expectedPower); + + expect(pokemon.getTag(StockpilingTag)).toBeUndefined(); + }); + + it("3 stacks -> 300 power", { timeout: 10000 }, async () => { + const stacksToSetup = 3; + const expectedPower = 300; + + await game.startBattle([Species.ABOMASNOW]); + + const pokemon = game.scene.getPlayerPokemon(); + pokemon.addTag(BattlerTagType.STOCKPILING); + pokemon.addTag(BattlerTagType.STOCKPILING); + pokemon.addTag(BattlerTagType.STOCKPILING); + + const stockpilingTag = pokemon.getTag(StockpilingTag); + expect(stockpilingTag).toBeDefined(); + expect(stockpilingTag.stockpiledCount).toBe(stacksToSetup); + + vi.spyOn(allMoves[Moves.SPIT_UP], "calculateBattlePower"); + + game.doAttack(0); + await game.phaseInterceptor.to(TurnInitPhase); + + expect(allMoves[Moves.SPIT_UP].calculateBattlePower).toHaveBeenCalledOnce(); + expect(allMoves[Moves.SPIT_UP].calculateBattlePower).toHaveReturnedWith(expectedPower); + + expect(pokemon.getTag(StockpilingTag)).toBeUndefined(); + }); + }); + + it("fails without stacks", { timeout: 10000 }, async () => { + await game.startBattle([Species.ABOMASNOW]); + + const pokemon = game.scene.getPlayerPokemon(); + + const stockpilingTag = pokemon.getTag(StockpilingTag); + expect(stockpilingTag).toBeUndefined(); + + vi.spyOn(allMoves[Moves.SPIT_UP], "calculateBattlePower"); + + game.doAttack(0); + await game.phaseInterceptor.to(TurnInitPhase); + + expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ move: Moves.SPIT_UP, result: MoveResult.FAIL }); + + expect(allMoves[Moves.SPIT_UP].calculateBattlePower).not.toHaveBeenCalled(); + }); + + describe("restores stat boosts granted by stacks", () => { + it("decreases stats based on stored values (both boosts equal)", { timeout: 10000 }, async () => { + await game.startBattle([Species.ABOMASNOW]); + + const pokemon = game.scene.getPlayerPokemon(); + pokemon.addTag(BattlerTagType.STOCKPILING); + + const stockpilingTag = pokemon.getTag(StockpilingTag); + expect(stockpilingTag).toBeDefined(); + + vi.spyOn(allMoves[Moves.SPIT_UP], "calculateBattlePower"); + + game.doAttack(0); + await game.phaseInterceptor.to(MovePhase); + + expect(pokemon.summonData.battleStats[BattleStat.DEF]).toBe(1); + expect(pokemon.summonData.battleStats[BattleStat.SPDEF]).toBe(1); + + await game.phaseInterceptor.to(TurnInitPhase); + + expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ move: Moves.SPIT_UP, result: MoveResult.SUCCESS }); + + expect(allMoves[Moves.SPIT_UP].calculateBattlePower).toHaveBeenCalledOnce(); + + expect(pokemon.summonData.battleStats[BattleStat.DEF]).toBe(0); + expect(pokemon.summonData.battleStats[BattleStat.SPDEF]).toBe(0); + + expect(pokemon.getTag(StockpilingTag)).toBeUndefined(); + }); + + it("decreases stats based on stored values (different boosts)", { timeout: 10000 }, async () => { + await game.startBattle([Species.ABOMASNOW]); + + const pokemon = game.scene.getPlayerPokemon(); + pokemon.addTag(BattlerTagType.STOCKPILING); + + const stockpilingTag = pokemon.getTag(StockpilingTag); + expect(stockpilingTag).toBeDefined(); + + // for the sake of simplicity (and because other tests cover the setup), set boost amounts directly + stockpilingTag.statChangeCounts = { + [BattleStat.DEF]: -1, + [BattleStat.SPDEF]: 2, + }; + + expect(stockpilingTag.statChangeCounts).toMatchObject({ + [BattleStat.DEF]: -1, + [BattleStat.SPDEF]: 2, + }); + + vi.spyOn(allMoves[Moves.SPIT_UP], "calculateBattlePower"); + + game.doAttack(0); + await game.phaseInterceptor.to(TurnInitPhase); + + expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ move: Moves.SPIT_UP, result: MoveResult.SUCCESS }); + + expect(allMoves[Moves.SPIT_UP].calculateBattlePower).toHaveBeenCalledOnce(); + + expect(pokemon.summonData.battleStats[BattleStat.DEF]).toBe(1); + expect(pokemon.summonData.battleStats[BattleStat.SPDEF]).toBe(-2); + + expect(pokemon.getTag(StockpilingTag)).toBeUndefined(); + }); + }); +}); diff --git a/src/test/moves/spotlight.test.ts b/src/test/moves/spotlight.test.ts index ec3f4977007..88d276d3d61 100644 --- a/src/test/moves/spotlight.test.ts +++ b/src/test/moves/spotlight.test.ts @@ -1,7 +1,7 @@ import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { CommandPhase, SelectTargetPhase, @@ -31,13 +31,13 @@ describe("Moves - Spotlight", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.AMOONGUSS); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK ]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.AMOONGUSS); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK ]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); test( @@ -73,7 +73,7 @@ describe("Moves - Spotlight", () => { test( "move should cause other redirection moves to fail", async () => { - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME ]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME ]); await game.startBattle([ Species.AMOONGUSS, Species.CHARIZARD ]); diff --git a/src/test/moves/stockpile.test.ts b/src/test/moves/stockpile.test.ts new file mode 100644 index 00000000000..1a23017c6b3 --- /dev/null +++ b/src/test/moves/stockpile.test.ts @@ -0,0 +1,116 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import overrides from "#app/overrides"; +import { CommandPhase, TurnInitPhase } from "#app/phases"; +import { getMovePosition } from "#app/test/utils/gameManagerUtils"; +import { BattleStat } from "#app/data/battle-stat"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { StockpilingTag } from "#app/data/battler-tags.js"; +import { MoveResult, TurnMove } from "#app/field/pokemon.js"; + +describe("Moves - Stockpile", () => { + describe("integration tests", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ type: Phaser.HEADLESS }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + vi.spyOn(overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + + vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STOCKPILE, Moves.SPLASH]); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + }); + + it("Gains a stockpile stack and increases DEF and SPDEF by 1 on each use, fails at max stacks (3)", { timeout: 10000 }, async () => { + await game.startBattle([Species.ABOMASNOW]); + + const user = game.scene.getPlayerPokemon(); + + // Unfortunately, Stockpile stacks are not directly queryable (i.e. there is no pokemon.getStockpileStacks()), + // we just have to know that they're implemented as a BattlerTag. + + expect(user.getTag(StockpilingTag)).toBeUndefined(); + expect(user.summonData.battleStats[BattleStat.DEF]).toBe(0); + expect(user.summonData.battleStats[BattleStat.SPDEF]).toBe(0); + + // use Stockpile four times + for (let i = 0; i < 4; i++) { + if (i !== 0) { + await game.phaseInterceptor.to(CommandPhase); + } + + game.doAttack(getMovePosition(game.scene, 0, Moves.STOCKPILE)); + await game.phaseInterceptor.to(TurnInitPhase); + + const stockpilingTag = user.getTag(StockpilingTag); + const def = user.summonData.battleStats[BattleStat.DEF]; + const spdef = user.summonData.battleStats[BattleStat.SPDEF]; + + if (i < 3) { // first three uses should behave normally + expect(def).toBe(i + 1); + expect(spdef).toBe(i + 1); + expect(stockpilingTag).toBeDefined(); + expect(stockpilingTag.stockpiledCount).toBe(i + 1); + + } else { // fourth should have failed + expect(def).toBe(3); + expect(spdef).toBe(3); + expect(stockpilingTag).toBeDefined(); + expect(stockpilingTag.stockpiledCount).toBe(3); + expect(user.getMoveHistory().at(-1)).toMatchObject({ result: MoveResult.FAIL, move: Moves.STOCKPILE }); + } + } + }); + + it("Gains a stockpile stack even if DEF and SPDEF are at +6", { timeout: 10000 }, async () => { + await game.startBattle([Species.ABOMASNOW]); + + const user = game.scene.getPlayerPokemon(); + + user.summonData.battleStats[BattleStat.DEF] = 6; + user.summonData.battleStats[BattleStat.SPDEF] = 6; + + expect(user.getTag(StockpilingTag)).toBeUndefined(); + expect(user.summonData.battleStats[BattleStat.DEF]).toBe(6); + expect(user.summonData.battleStats[BattleStat.SPDEF]).toBe(6); + + game.doAttack(getMovePosition(game.scene, 0, Moves.STOCKPILE)); + await game.phaseInterceptor.to(TurnInitPhase); + + const stockpilingTag = user.getTag(StockpilingTag); + expect(stockpilingTag).toBeDefined(); + expect(stockpilingTag.stockpiledCount).toBe(1); + expect(user.summonData.battleStats[BattleStat.DEF]).toBe(6); + expect(user.summonData.battleStats[BattleStat.SPDEF]).toBe(6); + + // do it again, just for good measure + await game.phaseInterceptor.to(CommandPhase); + + game.doAttack(getMovePosition(game.scene, 0, Moves.STOCKPILE)); + await game.phaseInterceptor.to(TurnInitPhase); + + const stockpilingTagAgain = user.getTag(StockpilingTag); + expect(stockpilingTagAgain).toBeDefined(); + expect(stockpilingTagAgain.stockpiledCount).toBe(2); + expect(user.summonData.battleStats[BattleStat.DEF]).toBe(6); + expect(user.summonData.battleStats[BattleStat.SPDEF]).toBe(6); + }); + }); +}); diff --git a/src/test/moves/swallow.test.ts b/src/test/moves/swallow.test.ts new file mode 100644 index 00000000000..0dd4237c232 --- /dev/null +++ b/src/test/moves/swallow.test.ts @@ -0,0 +1,197 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import overrides from "#app/overrides"; +import { MovePhase, TurnInitPhase } from "#app/phases"; +import { BattleStat } from "#app/data/battle-stat"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { StockpilingTag } from "#app/data/battler-tags.js"; +import { MoveResult, TurnMove } from "#app/field/pokemon.js"; +import { BattlerTagType } from "#app/enums/battler-tag-type.js"; + +describe("Moves - Swallow", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ type: Phaser.HEADLESS }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + vi.spyOn(overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + + vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(2000); + + vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SWALLOW, Moves.SWALLOW, Moves.SWALLOW, Moves.SWALLOW]); + vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.NONE); + }); + + describe("consumes all stockpile stacks to heal (scaling with stacks)", () => { + it("1 stack -> 25% heal", { timeout: 10000 }, async () => { + const stacksToSetup = 1; + const expectedHeal = 25; + + await game.startBattle([Species.ABOMASNOW]); + + const pokemon = game.scene.getPlayerPokemon(); + vi.spyOn(pokemon, "getMaxHp").mockReturnValue(100); + pokemon["hp"] = 1; + + pokemon.addTag(BattlerTagType.STOCKPILING); + + const stockpilingTag = pokemon.getTag(StockpilingTag); + expect(stockpilingTag).toBeDefined(); + expect(stockpilingTag.stockpiledCount).toBe(stacksToSetup); + + vi.spyOn(pokemon, "heal"); + + game.doAttack(0); + await game.phaseInterceptor.to(TurnInitPhase); + + expect(pokemon.heal).toHaveBeenCalledOnce(); + expect(pokemon.heal).toHaveReturnedWith(expectedHeal); + + expect(pokemon.getTag(StockpilingTag)).toBeUndefined(); + }); + + it("2 stacks -> 50% heal", { timeout: 10000 }, async () => { + const stacksToSetup = 2; + const expectedHeal = 50; + + await game.startBattle([Species.ABOMASNOW]); + + const pokemon = game.scene.getPlayerPokemon(); + vi.spyOn(pokemon, "getMaxHp").mockReturnValue(100); + pokemon["hp"] = 1; + + pokemon.addTag(BattlerTagType.STOCKPILING); + pokemon.addTag(BattlerTagType.STOCKPILING); + + const stockpilingTag = pokemon.getTag(StockpilingTag); + expect(stockpilingTag).toBeDefined(); + expect(stockpilingTag.stockpiledCount).toBe(stacksToSetup); + + vi.spyOn(pokemon, "heal"); + + game.doAttack(0); + await game.phaseInterceptor.to(TurnInitPhase); + + expect(pokemon.heal).toHaveBeenCalledOnce(); + expect(pokemon.heal).toHaveReturnedWith(expectedHeal); + + expect(pokemon.getTag(StockpilingTag)).toBeUndefined(); + }); + + it("3 stacks -> 100% heal", { timeout: 10000 }, async () => { + const stacksToSetup = 3; + const expectedHeal = 100; + + await game.startBattle([Species.ABOMASNOW]); + + const pokemon = game.scene.getPlayerPokemon(); + vi.spyOn(pokemon, "getMaxHp").mockReturnValue(100); + pokemon["hp"] = 0.0001; + + pokemon.addTag(BattlerTagType.STOCKPILING); + pokemon.addTag(BattlerTagType.STOCKPILING); + pokemon.addTag(BattlerTagType.STOCKPILING); + + const stockpilingTag = pokemon.getTag(StockpilingTag); + expect(stockpilingTag).toBeDefined(); + expect(stockpilingTag.stockpiledCount).toBe(stacksToSetup); + + vi.spyOn(pokemon, "heal"); + + game.doAttack(0); + await game.phaseInterceptor.to(TurnInitPhase); + + expect(pokemon.heal).toHaveBeenCalledOnce(); + expect(pokemon.heal).toHaveReturnedWith(expect.closeTo(expectedHeal)); + + expect(pokemon.getTag(StockpilingTag)).toBeUndefined(); + }); + }); + + it("fails without stacks", { timeout: 10000 }, async () => { + await game.startBattle([Species.ABOMASNOW]); + + const pokemon = game.scene.getPlayerPokemon(); + + const stockpilingTag = pokemon.getTag(StockpilingTag); + expect(stockpilingTag).toBeUndefined(); + + game.doAttack(0); + await game.phaseInterceptor.to(TurnInitPhase); + + expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ move: Moves.SWALLOW, result: MoveResult.FAIL }); + }); + + describe("restores stat boosts granted by stacks", () => { + it("decreases stats based on stored values (both boosts equal)", { timeout: 10000 }, async () => { + await game.startBattle([Species.ABOMASNOW]); + + const pokemon = game.scene.getPlayerPokemon(); + pokemon.addTag(BattlerTagType.STOCKPILING); + + const stockpilingTag = pokemon.getTag(StockpilingTag); + expect(stockpilingTag).toBeDefined(); + + game.doAttack(0); + await game.phaseInterceptor.to(MovePhase); + + expect(pokemon.summonData.battleStats[BattleStat.DEF]).toBe(1); + expect(pokemon.summonData.battleStats[BattleStat.SPDEF]).toBe(1); + + await game.phaseInterceptor.to(TurnInitPhase); + + expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ move: Moves.SWALLOW, result: MoveResult.SUCCESS }); + + expect(pokemon.summonData.battleStats[BattleStat.DEF]).toBe(0); + expect(pokemon.summonData.battleStats[BattleStat.SPDEF]).toBe(0); + + expect(pokemon.getTag(StockpilingTag)).toBeUndefined(); + }); + + it("decreases stats based on stored values (different boosts)", { timeout: 10000 }, async () => { + await game.startBattle([Species.ABOMASNOW]); + + const pokemon = game.scene.getPlayerPokemon(); + pokemon.addTag(BattlerTagType.STOCKPILING); + + const stockpilingTag = pokemon.getTag(StockpilingTag); + expect(stockpilingTag).toBeDefined(); + + // for the sake of simplicity (and because other tests cover the setup), set boost amounts directly + stockpilingTag.statChangeCounts = { + [BattleStat.DEF]: -1, + [BattleStat.SPDEF]: 2, + }; + + expect(stockpilingTag.statChangeCounts).toMatchObject({ + [BattleStat.DEF]: -1, + [BattleStat.SPDEF]: 2, + }); + + game.doAttack(0); + await game.phaseInterceptor.to(TurnInitPhase); + + expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ move: Moves.SWALLOW, result: MoveResult.SUCCESS }); + + expect(pokemon.summonData.battleStats[BattleStat.DEF]).toBe(1); + expect(pokemon.summonData.battleStats[BattleStat.SPDEF]).toBe(-2); + + expect(pokemon.getTag(StockpilingTag)).toBeUndefined(); + }); + }); +}); diff --git a/src/test/moves/tackle.test.ts b/src/test/moves/tackle.test.ts index dabf7db5f7e..f4b335d9576 100644 --- a/src/test/moves/tackle.test.ts +++ b/src/test/moves/tackle.test.ts @@ -1,7 +1,7 @@ import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { CommandPhase, EnemyCommandPhase, TurnEndPhase, @@ -31,18 +31,18 @@ describe("Moves - Tackle", () => { beforeEach(() => { game = new GameManager(phaserGame); const moveToUse = Moves.TACKLE; - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(1); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(97); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.GROWTH,Moves.GROWTH,Moves.GROWTH,Moves.GROWTH]); - vi.spyOn(overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(1); + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(97); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.GROWTH,Moves.GROWTH,Moves.GROWTH,Moves.GROWTH]); + vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); }); it("TACKLE against ghost", async() => { const moveToUse = Moves.TACKLE; - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.GENGAR); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.GENGAR); await game.startBattle([ Species.MIGHTYENA, ]); diff --git a/src/test/moves/tail_whip.test.ts b/src/test/moves/tail_whip.test.ts index 3e89e9cb14e..662746db4eb 100644 --- a/src/test/moves/tail_whip.test.ts +++ b/src/test/moves/tail_whip.test.ts @@ -1,7 +1,7 @@ import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { CommandPhase, EnemyCommandPhase, @@ -33,13 +33,13 @@ describe("Moves - Tail whip", () => { beforeEach(() => { game = new GameManager(phaserGame); const moveToUse = Moves.TAIL_WHIP; - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.RATTATA); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.INSOMNIA); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(2000); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([moveToUse]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TACKLE,Moves.TACKLE,Moves.TACKLE,Moves.TACKLE]); }); it("TAIL_WHIP", async() => { diff --git a/src/test/moves/tailwind.test.ts b/src/test/moves/tailwind.test.ts index efba97f8fe1..535d0a1e525 100644 --- a/src/test/moves/tailwind.test.ts +++ b/src/test/moves/tailwind.test.ts @@ -1,7 +1,7 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { Species } from "#enums/species"; import { TurnEndPhase, @@ -28,9 +28,9 @@ describe("Abilities - Wind Rider", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("double"); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); }); it("doubles the Speed stat of the Pokemons on its side", async () => { @@ -55,8 +55,7 @@ describe("Abilities - Wind Rider", () => { }); it("lasts for 4 turns", async () => { - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); await game.startBattle([Species.MAGIKARP]); @@ -79,8 +78,7 @@ describe("Abilities - Wind Rider", () => { }); it("does not affect the opposing side", async () => { - vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(false); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); await game.startBattle([Species.MAGIKARP]); diff --git a/src/test/moves/thousand_arrows.test.ts b/src/test/moves/thousand_arrows.test.ts index c641643593e..950e5228928 100644 --- a/src/test/moves/thousand_arrows.test.ts +++ b/src/test/moves/thousand_arrows.test.ts @@ -1,10 +1,10 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, test, vi} from "vitest"; +import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { - MoveEffectPhase, - TurnEndPhase + BerryPhase, + MoveEffectPhase } from "#app/phases"; import {getMovePosition} from "#app/test/utils/gameManagerUtils"; import { Moves } from "#enums/moves"; @@ -30,26 +30,20 @@ describe("Moves - Thousand Arrows", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.TOGETIC); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.THOUSAND_ARROWS ]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH,Moves.SPLASH,Moves.SPLASH,Moves.SPLASH]); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.TOGETIC); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([ Moves.THOUSAND_ARROWS ]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH,Moves.SPLASH,Moves.SPLASH,Moves.SPLASH]); }); - test( + it( "move should hit and ground Flying-type targets", async () => { await game.startBattle([ Species.ILLUMISE ]); - const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).toBeDefined(); - - const enemyStartingHp = enemyPokemon.hp; game.doAttack(getMovePosition(game.scene, 0, Moves.THOUSAND_ARROWS)); @@ -57,28 +51,22 @@ describe("Moves - Thousand Arrows", () => { // Enemy should not be grounded before move effect is applied expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeUndefined(); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to(BerryPhase, false); expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeDefined(); - expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); }, TIMEOUT ); - test( + it( "move should hit and ground targets with Levitate", async () => { - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.LEVITATE); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.LEVITATE); await game.startBattle([ Species.ILLUMISE ]); - const leadPokemon = game.scene.getPlayerPokemon(); - expect(leadPokemon).toBeDefined(); - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon).toBeDefined(); - - const enemyStartingHp = enemyPokemon.hp; game.doAttack(getMovePosition(game.scene, 0, Moves.THOUSAND_ARROWS)); @@ -86,10 +74,31 @@ describe("Moves - Thousand Arrows", () => { // Enemy should not be grounded before move effect is applied expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeUndefined(); - await game.phaseInterceptor.to(TurnEndPhase, false); + await game.phaseInterceptor.to(BerryPhase, false); expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeDefined(); - expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); }, TIMEOUT ); + + it( + "move should hit and ground targets under the effects of Magnet Rise", + async () => { + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.SNORLAX); + + await game.startBattle([ Species.ILLUMISE ]); + + const enemyPokemon = game.scene.getEnemyPokemon(); + + enemyPokemon.addTag(BattlerTagType.MAGNET_RISEN, null, Moves.MAGNET_RISE); + + game.doAttack(getMovePosition(game.scene, 0, Moves.THOUSAND_ARROWS)); + + await game.phaseInterceptor.to(BerryPhase, false); + + expect(enemyPokemon.getTag(BattlerTagType.MAGNET_RISEN)).toBeUndefined(); + expect(enemyPokemon.getTag(BattlerTagType.IGNORE_FLYING)).toBeDefined(); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + } + ); }); diff --git a/src/test/moves/tidy_up.test.ts b/src/test/moves/tidy_up.test.ts index 78b72492e04..16312ce431a 100644 --- a/src/test/moves/tidy_up.test.ts +++ b/src/test/moves/tidy_up.test.ts @@ -1,7 +1,7 @@ import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { MoveEndPhase, TurnEndPhase } from "#app/phases"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; @@ -27,19 +27,19 @@ describe("Moves - Tidy Up", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); - vi.spyOn(overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); - vi.spyOn(overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.FEEBAS); - vi.spyOn(overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TIDY_UP]); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(50); + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]); + vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(Species.FEEBAS); + vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(Abilities.BALL_FETCH); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TIDY_UP]); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(50); }); it("spikes are cleared", async() => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPIKES, Moves.TIDY_UP]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPIKES, Moves.SPIKES, Moves.SPIKES, Moves.SPIKES]); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPIKES, Moves.TIDY_UP]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPIKES, Moves.SPIKES, Moves.SPIKES, Moves.SPIKES]); await game.startBattle(); game.doAttack(getMovePosition(game.scene, 0, Moves.SPIKES)); @@ -51,8 +51,8 @@ describe("Moves - Tidy Up", () => { }, 20000); it("stealth rocks are cleared", async() => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STEALTH_ROCK, Moves.TIDY_UP]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STEALTH_ROCK, Moves.STEALTH_ROCK, Moves.STEALTH_ROCK, Moves.STEALTH_ROCK]); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STEALTH_ROCK, Moves.TIDY_UP]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STEALTH_ROCK, Moves.STEALTH_ROCK, Moves.STEALTH_ROCK, Moves.STEALTH_ROCK]); await game.startBattle(); game.doAttack(getMovePosition(game.scene, 0, Moves.STEALTH_ROCK)); @@ -64,8 +64,8 @@ describe("Moves - Tidy Up", () => { }, 20000); it("toxic spikes are cleared", async() => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TOXIC_SPIKES, Moves.TIDY_UP]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TOXIC_SPIKES, Moves.TOXIC_SPIKES, Moves.TOXIC_SPIKES, Moves.TOXIC_SPIKES]); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TOXIC_SPIKES, Moves.TIDY_UP]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.TOXIC_SPIKES, Moves.TOXIC_SPIKES, Moves.TOXIC_SPIKES, Moves.TOXIC_SPIKES]); await game.startBattle(); game.doAttack(getMovePosition(game.scene, 0, Moves.TOXIC_SPIKES)); @@ -77,8 +77,8 @@ describe("Moves - Tidy Up", () => { }, 20000); it("sticky webs are cleared", async() => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STICKY_WEB, Moves.TIDY_UP]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STICKY_WEB, Moves.STICKY_WEB, Moves.STICKY_WEB, Moves.STICKY_WEB]); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STICKY_WEB, Moves.TIDY_UP]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.STICKY_WEB, Moves.STICKY_WEB, Moves.STICKY_WEB, Moves.STICKY_WEB]); await game.startBattle(); @@ -91,8 +91,8 @@ describe("Moves - Tidy Up", () => { }, 20000); it.skip("substitutes are cleared", async() => { - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SUBSTITUTE, Moves.TIDY_UP]); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SUBSTITUTE, Moves.SUBSTITUTE, Moves.SUBSTITUTE, Moves.SUBSTITUTE]); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SUBSTITUTE, Moves.TIDY_UP]); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SUBSTITUTE, Moves.SUBSTITUTE, Moves.SUBSTITUTE, Moves.SUBSTITUTE]); await game.startBattle(); diff --git a/src/test/pre.test.ts b/src/test/pre.test.ts new file mode 100644 index 00000000000..6ed29dce481 --- /dev/null +++ b/src/test/pre.test.ts @@ -0,0 +1,6 @@ +import Overrides, { defaultOverrides } from "#app/overrides"; +import { expect, test } from "vitest"; + +test("Overrides are default values", () => { + expect(Overrides).toEqual(defaultOverrides); +}); diff --git a/src/test/ui/starter-select.test.ts b/src/test/ui/starter-select.test.ts index 2b5df315a70..95a4605fd68 100644 --- a/src/test/ui/starter-select.test.ts +++ b/src/test/ui/starter-select.test.ts @@ -54,6 +54,7 @@ describe("UI - Starter select", () => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { const handler = game.scene.ui.getHandler() as StarterSelectUiHandler; handler.processInput(Button.RIGHT); + handler.processInput(Button.LEFT); handler.processInput(Button.ACTION); game.phaseInterceptor.unlock(); }); @@ -113,6 +114,7 @@ describe("UI - Starter select", () => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { const handler = game.scene.ui.getHandler() as StarterSelectUiHandler; handler.processInput(Button.RIGHT); + handler.processInput(Button.LEFT); handler.processInput(Button.CYCLE_GENDER); handler.processInput(Button.ACTION); game.phaseInterceptor.unlock(); @@ -174,6 +176,7 @@ describe("UI - Starter select", () => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { const handler = game.scene.ui.getHandler() as StarterSelectUiHandler; handler.processInput(Button.RIGHT); + handler.processInput(Button.LEFT); handler.processInput(Button.CYCLE_GENDER); handler.processInput(Button.CYCLE_NATURE); handler.processInput(Button.CYCLE_ABILITY); @@ -237,6 +240,7 @@ describe("UI - Starter select", () => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { const handler = game.scene.ui.getHandler() as StarterSelectUiHandler; handler.processInput(Button.RIGHT); + handler.processInput(Button.LEFT); handler.processInput(Button.CYCLE_GENDER); handler.processInput(Button.ACTION); game.phaseInterceptor.unlock(); @@ -297,6 +301,7 @@ describe("UI - Starter select", () => { game.onNextPrompt("SelectStarterPhase", Mode.STARTER_SELECT, () => { const handler = game.scene.ui.getHandler() as StarterSelectUiHandler; handler.processInput(Button.RIGHT); + handler.processInput(Button.LEFT); handler.processInput(Button.CYCLE_SHINY); handler.processInput(Button.ACTION); game.phaseInterceptor.unlock(); @@ -356,6 +361,7 @@ describe("UI - Starter select", () => { game.onNextPrompt("SelectStarterPhase", Mode.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.ACTION); @@ -416,6 +422,7 @@ describe("UI - Starter select", () => { game.onNextPrompt("SelectStarterPhase", Mode.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.V); @@ -479,7 +486,6 @@ describe("UI - Starter select", () => { handler.processInput(Button.RIGHT); handler.processInput(Button.RIGHT); handler.processInput(Button.RIGHT); - handler.processInput(Button.RIGHT); handler.processInput(Button.ACTION); game.phaseInterceptor.unlock(); }); @@ -509,10 +515,10 @@ describe("UI - Starter select", () => { }); }); - expect(starterSelectUiHandler.starterGens[0]).toBe(0); - expect(starterSelectUiHandler.starterCursors[0]).toBe(3); - expect(starterSelectUiHandler.cursorObj.x).toBe(132 + 4 * 18); - expect(starterSelectUiHandler.cursorObj.y).toBe(10); + // expect(starterSelectUiHandler.starterGens[0]).toBe(0); + // expect(starterSelectUiHandler.starterCursors[0]).toBe(3); + // expect(starterSelectUiHandler.cursorObj.x).toBe(132 + 4 * 18); + // expect(starterSelectUiHandler.cursorObj.y).toBe(10); game.onNextPrompt("SelectStarterPhase", Mode.CONFIRM, () => { const handler = game.scene.ui.getHandler() as StarterSelectUiHandler; @@ -544,7 +550,6 @@ describe("UI - Starter select", () => { handler.processInput(Button.RIGHT); handler.processInput(Button.RIGHT); handler.processInput(Button.RIGHT); - handler.processInput(Button.RIGHT); handler.processInput(Button.DOWN); handler.processInput(Button.ACTION); game.phaseInterceptor.unlock(); @@ -575,10 +580,11 @@ describe("UI - Starter select", () => { }); }); - expect(starterSelectUiHandler.starterGens[0]).toBe(0); - expect(starterSelectUiHandler.starterCursors[0]).toBe(12); - expect(starterSelectUiHandler.cursorObj.x).toBe(132 + 4 * 18); - expect(starterSelectUiHandler.cursorObj.y).toBe(28); + expect(starterSelectUiHandler.starterSpecies.length).toBe(1); + expect(starterSelectUiHandler.starterSpecies[0].generation).toBe(1); + expect(starterSelectUiHandler.starterSpecies[0].speciesId).toBe(32); + expect(starterSelectUiHandler.cursorObj.x).toBe(53); + expect(starterSelectUiHandler.cursorObj.y).toBe(31); game.onNextPrompt("SelectStarterPhase", Mode.CONFIRM, () => { const handler = game.scene.ui.getHandler() as StarterSelectUiHandler; diff --git a/src/test/ui/transfer-item.test.ts b/src/test/ui/transfer-item.test.ts index e0cf1819be3..61e1a502a81 100644 --- a/src/test/ui/transfer-item.test.ts +++ b/src/test/ui/transfer-item.test.ts @@ -2,7 +2,7 @@ import { BerryType } from "#app/enums/berry-type"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { Button } from "#app/enums/buttons"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; import { BattleEndPhase, SelectModifierPhase, } from "#app/phases"; @@ -32,17 +32,17 @@ describe("UI - Transfer Items", () => { beforeEach(async () => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true); - vi.spyOn(overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(1); - vi.spyOn(overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([ + vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue("single"); + vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(100); + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(1); + vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue([ { name: "BERRY", count: 1, type: BerryType.SITRUS }, { name: "BERRY", count: 2, type: BerryType.APICOT }, { name: "BERRY", count: 2, type: BerryType.LUM }, ]); - vi.spyOn(overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DRAGON_CLAW]); - vi.spyOn(overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); - vi.spyOn(overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([Moves.DRAGON_CLAW]); + vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(Species.MAGIKARP); + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([Moves.SPLASH]); await game.startBattle([Species.RAYQUAZA, Species.RAYQUAZA, Species.RAYQUAZA]); diff --git a/src/test/utils/gameManager.ts b/src/test/utils/gameManager.ts index a8bd8ee3404..476569e98ff 100644 --- a/src/test/utils/gameManager.ts +++ b/src/test/utils/gameManager.ts @@ -8,7 +8,8 @@ import { LoginPhase, NewBattlePhase, SelectStarterPhase, - TitlePhase, TurnInitPhase, + SelectTargetPhase, + TitlePhase, TurnEndPhase, TurnInitPhase, TurnStartPhase, } from "#app/phases"; import BattleScene from "#app/battle-scene.js"; @@ -211,6 +212,15 @@ export default class GameManager { this.onNextPrompt("CommandPhase", Mode.FIGHT, () => { (this.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, movePosition, false); }); + + // Confirm target selection if move is multi-target + 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(); + if (move.isMultiTarget()) { + handler.processInput(Button.ACTION); + } + }, () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(TurnEndPhase)); } /** diff --git a/src/test/utils/gameManagerUtils.ts b/src/test/utils/gameManagerUtils.ts index 0cd576cd106..34cf4a69c43 100644 --- a/src/test/utils/gameManagerUtils.ts +++ b/src/test/utils/gameManagerUtils.ts @@ -6,6 +6,8 @@ import {Starter} from "#app/ui/starter-select-ui-handler"; import {GameModes, getGameMode} from "#app/game-mode"; import {getPokemonSpecies, getPokemonSpeciesForm} from "#app/data/pokemon-species"; import {PlayerPokemon} from "#app/field/pokemon"; +import { Moves } from "#app/enums/moves"; +import BattleScene from "#app/battle-scene"; import Battle, {BattleType} from "#app/battle"; export function blobToString(blob) { @@ -80,10 +82,11 @@ export function waitUntil(truth) { }); } -export function getMovePosition(scene, pokemonIndex, moveIndex) { +/** 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) { const playerPokemon = scene.getPlayerField()[pokemonIndex]; const moveSet = playerPokemon.getMoveset(); - const index = moveSet.findIndex((move) => move.moveId === moveIndex); + const index = moveSet.findIndex((m) => m.moveId === move); return index; } diff --git a/src/test/utils/mocks/mocksContainer/mockSprite.ts b/src/test/utils/mocks/mocksContainer/mockSprite.ts index ab61f88605b..fb7f84741e8 100644 --- a/src/test/utils/mocks/mocksContainer/mockSprite.ts +++ b/src/test/utils/mocks/mocksContainer/mockSprite.ts @@ -91,6 +91,10 @@ export default class MockSprite { return this.phaserSprite.setPosition(x, y); } + setRotation(radians) { + return this.phaserSprite.setRotation(radians); + } + stop() { return this.phaserSprite.stop(); } diff --git a/src/test/utils/mocks/mocksContainer/mockText.ts b/src/test/utils/mocks/mocksContainer/mockText.ts index 2509c38b182..a42f8821f81 100644 --- a/src/test/utils/mocks/mocksContainer/mockText.ts +++ b/src/test/utils/mocks/mocksContainer/mockText.ts @@ -8,6 +8,7 @@ export default class MockText { private textureManager; public list = []; public style; + public text = ""; constructor(textureManager, x, y, content, styleOptions) { this.scene = textureManager.scene; @@ -18,6 +19,8 @@ export default class MockText { // Phaser.Textures.TextureManager.prototype.addCanvas = () => {}; UI.prototype.showText = this.showText; UI.prototype.showDialogue = this.showDialogue; + this.text = ""; + this.phaserText = ""; // super(scene, x, y); // this.phaserText = new Phaser.GameObjects.Text(scene, x, y, content, styleOptions); } @@ -158,7 +161,8 @@ export default class MockText { setText(text) { // Sets the text this Game Object will display. - // return this.phaserText.setText(text); + // return this.phaserText.setText\(text); + this.text = text; } setAngle(angle) { diff --git a/src/test/utils/overridesHelper.ts b/src/test/utils/overridesHelper.ts index bd4744503e0..5b190a9d6a9 100644 --- a/src/test/utils/overridesHelper.ts +++ b/src/test/utils/overridesHelper.ts @@ -1,14 +1,13 @@ import { Weather, WeatherType } from "#app/data/weather"; import { Biome } from "#app/enums/biome"; -import * as Overrides from "#app/overrides"; import { MockInstance, vi } from "vitest"; import GameManager from "#test/utils/gameManager"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import * as overrides from "#app/overrides"; import * as GameMode from "#app/game-mode"; import { GameModes, getGameMode } from "#app/game-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { ModifierOverride } from "#app/overrides"; +import Overrides from "#app/overrides"; +import { ModifierOverride } from "#app/modifier/modifier-type"; /** * Helper to handle overrides in tests @@ -49,7 +48,7 @@ export class OverridesHelper { * @returns spy instance */ mysteryEncounter(encounterType: MysteryEncounterType) { - const spy = vi.spyOn(overrides, "MYSTERY_ENCOUNTER_OVERRIDE", "get").mockReturnValue(encounterType); + const spy = vi.spyOn(Overrides, "MYSTERY_ENCOUNTER_OVERRIDE", "get").mockReturnValue(encounterType); this.log(`Mystery encounter override set to ${encounterType}!`); return spy; } diff --git a/src/test/utils/saves/everything.prsv b/src/test/utils/saves/everything.prsv index 2e4a851eb8f..1985a6649ca 100644 --- a/src/test/utils/saves/everything.prsv +++ b/src/test/utils/saves/everything.prsv @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/src/test/utils/testUtils.ts b/src/test/utils/testUtils.ts index b922fc9c61c..0a9be16a4b5 100644 --- a/src/test/utils/testUtils.ts +++ b/src/test/utils/testUtils.ts @@ -1,6 +1,10 @@ +import { Moves } from "#app/enums/moves.js"; import i18next, { type ParseKeys } from "i18next"; import { vi } from "vitest"; +/** Ready to use array of Moves.SPLASH x4 */ +export const SPLASH_ONLY = [Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]; + /** * Sets up the i18next mock. * Includes a i18next.t mocked implementation only returning the raw key (`(key) => key`) @@ -21,3 +25,4 @@ export function mockI18next() { export function arrayOfRange(start: integer, end: integer) { return Array.from({ length: end - start }, (_v, k) => k + start); } + diff --git a/src/test/vitest.setup.ts b/src/test/vitest.setup.ts index 37c533a33db..ce465a215b0 100644 --- a/src/test/vitest.setup.ts +++ b/src/test/vitest.setup.ts @@ -14,7 +14,17 @@ import { initAchievements } from "#app/system/achv"; import { initStatsKeys } from "#app/ui/game-stats-ui-handler"; import { initMysteryEncounters } from "#app/data/mystery-encounters/mystery-encounters"; import { beforeAll, beforeEach, vi } from "vitest"; -import * as overrides from "#app/overrides"; +import Overrides from "#app/overrides"; + +/** Mock the override import to always return default values, ignoring any custom overrides. */ +vi.mock("#app/overrides", async (importOriginal) => { + const { defaultOverrides } = await importOriginal(); + + return { + default: defaultOverrides, + defaultOverrides + } satisfies typeof import("#app/overrides"); +}); initVouchers(); initAchievements(); @@ -42,5 +52,5 @@ beforeAll(() => { // Disables Mystery Encounters on all tests (can be overridden at test level) beforeEach( () => { - vi.spyOn(overrides, "MYSTERY_ENCOUNTER_RATE_OVERRIDE", "get").mockReturnValue(0); + vi.spyOn(Overrides, "MYSTERY_ENCOUNTER_RATE_OVERRIDE", "get").mockReturnValue(0); }); diff --git a/src/ui/ability-bar.ts b/src/ui/ability-bar.ts index a0b249695b9..7a4ae559975 100644 --- a/src/ui/ability-bar.ts +++ b/src/ui/ability-bar.ts @@ -1,3 +1,4 @@ +import { getPokemonNameWithAffix } from "#app/messages.js"; import BattleScene from "../battle-scene"; import Pokemon from "../field/pokemon"; import { TextStyle, addTextObject } from "./text"; @@ -36,7 +37,7 @@ export default class AbilityBar extends Phaser.GameObjects.Container { } showAbility(pokemon: Pokemon, passive: boolean = false): void { - this.abilityBarText.setText(`${i18next.t("fightUiHandler:abilityFlyInText", { pokemonName: pokemon.name, passive: passive ? i18next.t("fightUiHandler:passive") : "", abilityName: !passive ? pokemon.getAbility().name : pokemon.getPassiveAbility().name })}`); + 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; diff --git a/src/ui/arena-flyout.ts b/src/ui/arena-flyout.ts index 9c0a2e7c8ce..882c15d3d8c 100644 --- a/src/ui/arena-flyout.ts +++ b/src/ui/arena-flyout.ts @@ -9,6 +9,7 @@ import { BattleSceneEventType, TurnEndEvent } 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"; /** Enum used to differentiate {@linkcode Arena} effects */ enum ArenaEffectType { @@ -33,7 +34,17 @@ interface ArenaEffectInfo { tagType?: ArenaTagType; } -export default class ArenaFlyout extends Phaser.GameObjects.Container { +export function getFieldEffectText(arenaTagType: string): string { + if (!arenaTagType || arenaTagType === ArenaTagType.NONE) { + return arenaTagType; + } + const effectName = Utils.toCamelCaseString(arenaTagType); + const i18nKey = `arenaFlyout:${effectName}` as ParseKeys; + const resultName = i18next.t(i18nKey); + 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; @@ -111,7 +122,7 @@ export default class ArenaFlyout extends Phaser.GameObjects.Container { this.flyoutContainer.add(this.flyoutWindowHeader); - this.flyoutTextHeader = addTextObject(this.scene, this.flyoutWidth / 2, 0, "Active Battle Effects", TextStyle.BATTLE_INFO); + this.flyoutTextHeader = addTextObject(this.scene, this.flyoutWidth / 2, 0, i18next.t("arenaFlyout:activeBattleEffects"), TextStyle.BATTLE_INFO); this.flyoutTextHeader.setFontSize(54); this.flyoutTextHeader.setAlign("center"); this.flyoutTextHeader.setOrigin(); @@ -121,21 +132,21 @@ export default class ArenaFlyout extends Phaser.GameObjects.Container { this.timeOfDayWidget = new TimeOfDayWidget(this.scene, (this.flyoutWidth / 2) + (this.flyoutWindowHeader.displayWidth / 2)); this.flyoutContainer.add(this.timeOfDayWidget); - this.flyoutTextHeaderPlayer = addTextObject(this.scene, 6, 5, "Player", TextStyle.SUMMARY_BLUE); + this.flyoutTextHeaderPlayer = addTextObject(this.scene, 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, "Neutral", TextStyle.SUMMARY_GREEN); + this.flyoutTextHeaderField = addTextObject(this.scene, 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, "Enemy", TextStyle.SUMMARY_RED); + this.flyoutTextHeaderEnemy = addTextObject(this.scene, this.flyoutWidth - 6, 5, i18next.t("arenaFlyout:enemy"), TextStyle.SUMMARY_RED); this.flyoutTextHeaderEnemy.setFontSize(54); this.flyoutTextHeaderEnemy.setAlign("right"); this.flyoutTextHeaderEnemy.setOrigin(1, 0); @@ -221,10 +232,7 @@ export default class ArenaFlyout extends Phaser.GameObjects.Container { break; } - textObject.text += Utils.formatText(fieldEffectInfo.name); - if (fieldEffectInfo.effecType === ArenaEffectType.TERRAIN) { - textObject.text += " Terrain"; // Adds 'Terrain' since the enum does not contain it - } + textObject.text += fieldEffectInfo.name; if (fieldEffectInfo.maxDuration !== 0) { textObject.text += " " + fieldEffectInfo.duration + "/" + fieldEffectInfo.maxDuration; @@ -260,7 +268,7 @@ export default class ArenaFlyout extends Phaser.GameObjects.Container { } const existingTrapTagIndex = isArenaTrapTag ? this.fieldEffectInfo.findIndex(e => tagAddedEvent.arenaTagType === e.tagType && arenaEffectType === e.effecType) : -1; - let name: string = ArenaTagType[tagAddedEvent.arenaTagType]; + let name: string = getFieldEffectText(ArenaTagType[tagAddedEvent.arenaTagType]); if (isArenaTrapTag) { if (existingTrapTagIndex !== -1) { @@ -295,15 +303,15 @@ export default class ArenaFlyout extends Phaser.GameObjects.Container { // Stores the old Weather/Terrain name in case it's in the array already const oldName = - fieldEffectChangedEvent instanceof WeatherChangedEvent - ? WeatherType[fieldEffectChangedEvent.oldWeatherType] - : TerrainType[fieldEffectChangedEvent.oldTerrainType]; + getFieldEffectText(fieldEffectChangedEvent instanceof WeatherChangedEvent + ? WeatherType[fieldEffectChangedEvent.oldWeatherType] + : TerrainType[fieldEffectChangedEvent.oldTerrainType]); // Stores the new Weather/Terrain info const newInfo = { name: - fieldEffectChangedEvent instanceof WeatherChangedEvent + getFieldEffectText(fieldEffectChangedEvent instanceof WeatherChangedEvent ? WeatherType[fieldEffectChangedEvent.newWeatherType] - : TerrainType[fieldEffectChangedEvent.newTerrainType], + : TerrainType[fieldEffectChangedEvent.newTerrainType]), effecType: fieldEffectChangedEvent instanceof WeatherChangedEvent ? ArenaEffectType.WEATHER : ArenaEffectType.TERRAIN, diff --git a/src/ui/battle-flyout.ts b/src/ui/battle-flyout.ts index 5b34a6b5411..fdce9661793 100644 --- a/src/ui/battle-flyout.ts +++ b/src/ui/battle-flyout.ts @@ -7,6 +7,7 @@ import { BattleSceneEventType, BerryUsedEvent, MoveUsedEvent } from "../events/b import { BerryType } from "#enums/berry-type"; import { Moves } from "#enums/moves"; import { UiTheme } from "#enums/ui-theme"; +import { getPokemonNameWithAffix } from "#app/messages.js"; /** Container for info about a {@linkcode Move} */ interface MoveInfo { @@ -113,8 +114,8 @@ export default class BattleFlyout extends Phaser.GameObjects.Container { initInfo(pokemon: Pokemon) { this.pokemon = pokemon; - this.name = `Flyout ${this.pokemon.name}`; - this.flyoutParent.name = `Flyout Parent ${this.pokemon.name}`; + 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); diff --git a/src/ui/battle-info.ts b/src/ui/battle-info.ts index 3b889228e27..d78b05a569f 100644 --- a/src/ui/battle-info.ts +++ b/src/ui/battle-info.ts @@ -118,7 +118,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.championRibbon.setName("icon_champion_ribbon"); this.championRibbon.setVisible(false); this.championRibbon.setOrigin(0, 0); - this.championRibbon.setPositionRelative(this.nameText, 11.75, 11.75); + this.championRibbon.setPositionRelative(this.nameText, 8, 11.75); this.add(this.championRibbon); } @@ -278,8 +278,8 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.updateNameText(pokemon); const nameTextWidth = this.nameText.displayWidth; - this.name = pokemon.name; - this.box.name = pokemon.name; + this.name = pokemon.getNameToRender(); + this.box.name = pokemon.getNameToRender(); this.flyoutMenu?.initInfo(pokemon); @@ -329,6 +329,11 @@ 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(null, i18next.t("battleInfo:generation", { generation: i18next.t(`starterSelectUiHandler:gen${pokemon.species.generation}`) }))); + this.nameText.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); + } + const dexEntry = pokemon.scene.gameData.dexData[pokemon.species.speciesId]; this.ownedIcon.setVisible(!!dexEntry.caughtAttr); const opponentPokemonDexAttr = pokemon.getDexAttr(); @@ -341,18 +346,21 @@ export default class BattleInfo extends Phaser.GameObjects.Container { // Check if Player owns all genders and forms of the Pokemon const missingDexAttrs = ((dexEntry.caughtAttr & opponentPokemonDexAttr) < opponentPokemonDexAttr); - /** - * If the opposing Pokemon only has 1 normal ability and is using the hidden ability it should have the same behavior - * if it had 2 normal abilities. This code checks if that is the case and uses the correct opponent Pokemon abilityIndex (2) - * for calculations so it aligns with where the hidden ability is stored in the starter data's abilityAttr (4) - */ - const opponentPokemonOneNormalAbility = (pokemon.species.getAbilityCount() === 2); - const opponentPokemonAbilityIndex = (opponentPokemonOneNormalAbility && pokemon.abilityIndex === 1) ? 2 : pokemon.abilityIndex; - const opponentPokemonAbilityAttr = Math.pow(2, opponentPokemonAbilityIndex); + const ownedAbilityAttrs = pokemon.scene.gameData.starterData[pokemon.species.getRootSpeciesId()].abilityAttr; - const rootFormHasHiddenAbility = pokemon.scene.gameData.starterData[pokemon.species.getRootSpeciesId()].abilityAttr & opponentPokemonAbilityAttr; + let playerOwnsThisAbility = false; + // Check if the player owns ability for the root form + if ((ownedAbilityAttrs & 1) > 0 && pokemon.hasSameAbilityInRootForm(0)) { + playerOwnsThisAbility = true; + } + if ((ownedAbilityAttrs & 2) > 0 && pokemon.hasSameAbilityInRootForm(1)) { + playerOwnsThisAbility = true; + } + if ((ownedAbilityAttrs & 4) > 0 && pokemon.hasSameAbilityInRootForm(2)) { + playerOwnsThisAbility = true; + } - if (missingDexAttrs || !rootFormHasHiddenAbility) { + if (missingDexAttrs || !playerOwnsThisAbility) { this.ownedIcon.setTint(0x808080); } @@ -502,7 +510,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { return resolve(); } - const nameUpdated = this.lastName !== pokemon.name; + const nameUpdated = this.lastName !== pokemon.getNameToRender(); if (nameUpdated) { this.updateNameText(pokemon); @@ -533,11 +541,11 @@ export default class BattleInfo extends Phaser.GameObjects.Container { if (this.lastStatus !== StatusEffect.NONE) { this.statusIndicator.setFrame(StatusEffect[this.lastStatus].toLowerCase()); } - this.statusIndicator.setVisible(!!this.lastStatus); - if (!this.player && this.ownedIcon.visible) { - this.ownedIcon.setAlpha(this.statusIndicator.visible ? 0 : 1); - } + const offsetX = !this.player ? (this.ownedIcon.visible ? 8 : 0) + (this.championRibbon.visible ? 8 : 0) : 0; + this.statusIndicator.setPositionRelative(this.nameText, offsetX, 11.5); + + this.statusIndicator.setVisible(!!this.lastStatus); } const types = pokemon.getTypes(true); @@ -629,7 +637,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { } updateNameText(pokemon: Pokemon): void { - let displayName = pokemon.name.replace(/[♂♀]/g, ""); + let displayName = pokemon.getNameToRender().replace(/[♂♀]/g, ""); let nameTextWidth: number; const nameSizeTest = addTextObject(this.scene, 0, 0, displayName, TextStyle.BATTLE_INFO); @@ -644,7 +652,11 @@ export default class BattleInfo extends Phaser.GameObjects.Container { nameSizeTest.destroy(); this.nameText.setText(displayName); - this.lastName = pokemon.name; + 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); + } } updatePokemonExp(pokemon: Pokemon, instant?: boolean, levelDurationMultiplier: number = 1): Promise { diff --git a/src/ui/bgm-bar.ts b/src/ui/bgm-bar.ts index f4366ef9c65..076eec26a8e 100644 --- a/src/ui/bgm-bar.ts +++ b/src/ui/bgm-bar.ts @@ -45,9 +45,6 @@ export default class BgmBar extends Phaser.GameObjects.Container { */ setBgmToBgmBar(bgmName: string): void { this.musicText.setText(`${i18next.t("bgmName:music")}${this.getRealBgmName(bgmName)}`); - if (!(this.scene as BattleScene).showBgmBar) { - return; - } this.musicText.width = this.bg.width - 20; this.musicText.setWordWrapWidth(this.defaultWidth * 4); @@ -65,6 +62,16 @@ export default class BgmBar extends Phaser.GameObjects.Container { @param {boolean} visible Whether to show or hide the BGM bar. */ public toggleBgmBar(visible: boolean): void { + /* + Prevents the bar from being displayed if musicText is completely empty. + This can be the case, for example, when the game's 1st music track takes a long time to reach the client, + and the menu is opened before it is played. + */ + if (this.musicText.text === "") { + this.setVisible(false); + return; + } + if (!(this.scene as BattleScene).showBgmBar) { this.setVisible(false); return; diff --git a/src/ui/challenges-select-ui-handler.ts b/src/ui/challenges-select-ui-handler.ts index dce04276a4d..6dcc359ef31 100644 --- a/src/ui/challenges-select-ui-handler.ts +++ b/src/ui/challenges-select-ui-handler.ts @@ -6,7 +6,7 @@ import { addWindow } from "./ui-theme"; import {Button} from "#enums/buttons"; import i18next from "i18next"; import { SelectStarterPhase, TitlePhase } from "#app/phases.js"; -import { Challenge, ChallengeType } from "#app/data/challenge.js"; +import { Challenge } from "#app/data/challenge.js"; import * as Utils from "../utils"; import { Challenges } from "#app/enums/challenges.js"; import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; @@ -27,7 +27,8 @@ export default class GameChallengesUiHandler extends UiHandler { private descriptionText: BBCodeText; - private challengeLabels: Array<{ label: Phaser.GameObjects.Text, value: Phaser.GameObjects.Text | Phaser.GameObjects.Sprite }>; + private challengeLabels: Array<{ label: Phaser.GameObjects.Text, value: Phaser.GameObjects.Text }>; + private monoTypeValue: Phaser.GameObjects.Sprite; private cursorObj: Phaser.GameObjects.NineSlice; @@ -120,33 +121,30 @@ export default class GameChallengesUiHandler extends UiHandler { this.challengeLabels = []; - for (let i = 0; i < Object.keys(ChallengeType).length; i++) { + for (let i = 0; i < 9; i++) { const label = addTextObject(this.scene, 8, 28 + i * 16, "", TextStyle.SETTINGS_LABEL); label.setName(`text-challenge-label-${i}`); label.setOrigin(0, 0); this.valuesContainer.add(label); - let value; - if (i === Challenges.SINGLE_TYPE) { - const type = `types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`; - value = this.scene.add.sprite(8, 98, type); - value.setName("sprite-single-type"); - value.setScale(0.86); - value.setPositionRelative(label, 113, 8); - } else { - value = addTextObject(this.scene, 0, 28 + i * 16, "", TextStyle.SETTINGS_LABEL); - value.setName(`text-challenge-value-label-${i}`); - value.setPositionRelative(label, 100, 0); - } - + const value = addTextObject(this.scene, 0, 28 + i * 16, "", TextStyle.SETTINGS_LABEL); + value.setName(`challenge-value-text-${i}`); + value.setPositionRelative(label, 100, 0); this.valuesContainer.add(value); + this.challengeLabels[i] = { label: label, value: value }; } + this.monoTypeValue = this.scene.add.sprite(8, 98, `types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`); + this.monoTypeValue.setName("challenge-value-monotype-sprite"); + this.monoTypeValue.setScale(0.86); + this.monoTypeValue.setVisible(false); + this.valuesContainer.add(this.monoTypeValue); + this.challengesContainer.add(headerBg); this.challengesContainer.add(headerText); // this.challengesContainer.add(difficultyBg); @@ -181,32 +179,39 @@ export default class GameChallengesUiHandler extends UiHandler { * init all challenge labels */ initLabels(): void { - this.setDescription(this.scene.gameMode.challenges[this.cursor].getDescription()); - this.scene.gameMode.challenges.forEach((challenge, i) => { - this.challengeLabels[i].label.setVisible(true); - this.challengeLabels[i].value.setVisible(true); - this.challengeLabels[i].label.setText(challenge.getName()); - if (this.challengeLabels[i].value.type.toLowerCase() === "sprite") { - (this.challengeLabels[i].value as Phaser.GameObjects.Sprite).setFrame(challenge.getValue()); - } else { - (this.challengeLabels[i].value as Phaser.GameObjects.Text).setText(challenge.getValue()); + this.setDescription(this.scene.gameMode.challenges[0].getDescription()); + for (let i = 0; i < 9; i++) { + if (i < this.scene.gameMode.challenges.length) { + this.challengeLabels[i].label.setVisible(true); + this.challengeLabels[i].value.setVisible(true); } - }); + } } /** * update the text the cursor is on */ updateText(): void { - const challenge = this.getActiveChallenge(); - const { id } = challenge; this.setDescription(this.getActiveChallenge().getDescription()); - - if (this.challengeLabels[id].value.type.toLowerCase() === "sprite") { - (this.challengeLabels[id].value as Phaser.GameObjects.Sprite).setFrame(challenge.getValue()); - } else { - (this.challengeLabels[id].value as Phaser.GameObjects.Text).setText(challenge.getValue()); + 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]; + this.challengeLabels[i].label.setText(challenge.getName()); + if (challenge.id === Challenges.SINGLE_TYPE) { + this.monoTypeValue.setPositionRelative(this.challengeLabels[i].label, 113, 8); + this.monoTypeValue.setFrame(challenge.getValue()); + this.monoTypeValue.setVisible(true); + this.challengeLabels[i].value.setVisible(false); + monoTypeVisible = true; + } else { + this.challengeLabels[i].value.setText(challenge.getValue()); + this.challengeLabels[i].value.setVisible(true); + } } + if (!monoTypeVisible) { + this.monoTypeValue.setVisible(false); + } + // 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}` : ""); @@ -221,6 +226,7 @@ export default class GameChallengesUiHandler extends UiHandler { this.setCursor(0); this.initLabels(); + this.updateText(); this.getUi().moveTo(this.challengesContainer, this.getUi().length - 1); diff --git a/src/ui/command-ui-handler.ts b/src/ui/command-ui-handler.ts index 8ccd05675c8..f083acd2f5b 100644 --- a/src/ui/command-ui-handler.ts +++ b/src/ui/command-ui-handler.ts @@ -6,6 +6,7 @@ import { Mode } from "./ui"; import UiHandler from "./ui-handler"; import i18next from "i18next"; import {Button} from "#enums/buttons"; +import { getPokemonNameWithAffix } from "#app/messages.js"; export enum Command { FIGHT = 0, @@ -66,7 +67,7 @@ export default class CommandUiHandler extends UiHandler { messageHandler.commandWindow.setVisible(true); messageHandler.movesWindowContainer.setVisible(false); messageHandler.message.setWordWrapWidth(1110); - messageHandler.showText(i18next.t("commandUiHandler:actionMessage", {pokemonName: commandPhase.getPokemon().name}), 0); + messageHandler.showText(i18next.t("commandUiHandler:actionMessage", {pokemonName: getPokemonNameWithAffix(commandPhase.getPokemon())}), 0); this.setCursor(this.getCursor()); return true; diff --git a/src/ui/confirm-ui-handler.ts b/src/ui/confirm-ui-handler.ts index 953ed4972ac..2d83508384b 100644 --- a/src/ui/confirm-ui-handler.ts +++ b/src/ui/confirm-ui-handler.ts @@ -4,6 +4,7 @@ import { Mode } from "./ui"; import i18next from "i18next"; import {Button} from "#enums/buttons"; + export default class ConfirmUiHandler extends AbstractOptionSelectUiHandler { public static readonly windowWidth: integer = 48; @@ -20,7 +21,44 @@ export default class ConfirmUiHandler extends AbstractOptionSelectUiHandler { } show(args: any[]): boolean { - if (args.length >= 2 && args[0] instanceof Function && args[1] instanceof Function) { + if (args.length === 4 && args[0] instanceof Function && args[1] instanceof Function && args[2] instanceof Function && args[3] === "fullParty") { + const config: OptionSelectConfig = { + options: [ + { + label: i18next.t("partyUiHandler:SUMMARY"), + handler: () => { + args[0](); + return false; + }, + }, { + 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 + }; + + super.show([ config ]); + + 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); + + this.optionSelectContainer.setPosition((this.scene.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) { const config: OptionSelectConfig = { options: [ { @@ -54,7 +92,6 @@ export default class ConfirmUiHandler extends AbstractOptionSelectUiHandler { return true; } - return false; } diff --git a/src/ui/dropdown.ts b/src/ui/dropdown.ts new file mode 100644 index 00000000000..34ff96d66ee --- /dev/null +++ b/src/ui/dropdown.ts @@ -0,0 +1,255 @@ +import BattleScene from "#app/battle-scene.js"; +import { SceneBase } from "#app/scene-base.js"; +import { addTextObject, TextStyle } from "./text"; +import { addWindow, WindowVariant } from "./ui-theme"; + +export enum DropDownState { + ON = 0, + OFF +} + +export enum DropDownType { + MULTI = 0, + SINGLE +} + +export enum SortDirection { + ASC = -1, + DESC = 1 +} + +export class DropDownOption extends Phaser.GameObjects.Container { + public state: DropDownState = DropDownState.ON; + public toggle: Phaser.GameObjects.Sprite; + public text: Phaser.GameObjects.Text; + public sprite?: Phaser.GameObjects.Sprite; + public val: any; + public dir: SortDirection = SortDirection.ASC; + + constructor(scene: SceneBase, val: any, text: string, sprite?: Phaser.GameObjects.Sprite, state: DropDownState = DropDownState.ON) { + super(scene); + this.val = val; + if (text) { + this.text = addTextObject(scene, 0, 0, text, TextStyle.TOOLTIP_CONTENT); + this.text.setOrigin(0, 0.5); + this.add(this.text); + } + + if (sprite) { + this.sprite = sprite.setOrigin(0, 0.5); + this.add(this.sprite); + } + this.state = state; + } + + public setupToggle(type: DropDownType): void { + if (type === DropDownType.MULTI) { + this.toggle = this.scene.add.sprite(0, 0, "candy"); + this.toggle.setScale(0.3); + this.toggle.setOrigin(0, 0.5); + } else { + this.toggle = this.scene.add.sprite(0, 0, "cursor"); + this.toggle.setScale(0.5); + this.toggle.setOrigin(0, 0.5); + this.toggle.setRotation(Math.PI / 180 * -90); + } + this.add(this.toggle); + } + + public setOptionState(state: DropDownState): DropDownState { + this.state = state % 2; + if (this.state === DropDownState.OFF) { + this.toggle.setTint(0x272727); + } else { + this.toggle.setTint(0x55ff55); + } + return this.state; + } + + public toggleOptionState(): DropDownState { + return this.setOptionState(this.state + 1); + } + + public setDirection(dir: SortDirection): void { + this.dir = dir; + this.toggle.flipX = this.dir === SortDirection.DESC; + } + + public toggleDirection(): void { + this.setDirection(this.dir * -1); + } +} + +export class DropDown extends Phaser.GameObjects.Container { + public options: DropDownOption[]; + private window: Phaser.GameObjects.NineSlice; + private cursorObj: Phaser.GameObjects.Image; + private dropDownType: DropDownType = DropDownType.MULTI; + public cursor: integer = 0; + private onChange: () => void; + private lastDir: SortDirection = SortDirection.ASC; + + constructor(scene: BattleScene, x: number, y: number, options: DropDownOption[], onChange: () => void, type: DropDownType = DropDownType.MULTI, optionSpacing: number = 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); + this.options = options; + this.dropDownType = type; + this.onChange = onChange; + + this.cursorObj = scene.add.image(optionPaddingX + 3, 0, "cursor"); + this.cursorObj.setScale(0.5); + this.cursorObj.setOrigin(0, 0.5); + this.cursorObj.setVisible(false); + + if (this.dropDownType === DropDownType.MULTI) { + this.options.unshift(new DropDownOption(scene, "ALL", "All", null, this.checkForAllOn() ? DropDownState.ON : DropDownState.OFF)); + } + + options.forEach((option, index) => { + option.setupToggle(type); + if (type === DropDownType.SINGLE && option.state === DropDownState.OFF) { + option.toggle.setVisible(false); + } + option.setOptionState(option.state); + + option.width = optionWidth; + option.y = index * optionHeight + index * optionSpacing + optionPaddingY; + + if (option.text) { + option.text.x = cursorOffset + optionPaddingX + 3 + 8; + option.text.y = optionHeight / 2; + } + if (option.sprite) { + option.sprite.x = cursorOffset + optionPaddingX + 3 + 8; + option.sprite.y = optionHeight / 2; + } + option.toggle.x = cursorOffset + optionPaddingX + 3 + (type === DropDownType.MULTI ? 0 : 3); + option.toggle.y = optionHeight / 2 + (type === DropDownType.MULTI ? 0 : 1); + }); + this.window = addWindow(scene, 0, 0, optionWidth, options[options.length - 1].y + optionHeight + optionPaddingY, false, false, null, null, WindowVariant.XTHIN); + this.add(this.window); + this.add(options); + this.add(this.cursorObj); + this.setVisible(false); + } + + toggle(): void { + this.setVisible(!this.visible); + } + + setCursor(cursor: integer): boolean { + this.cursor = cursor; + if (cursor < 0) { + cursor = 0; + this.cursorObj.setVisible(false); + return false; + } else 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); + } + return true; + } + + toggleOptionState(): void { + if (this.dropDownType === DropDownType.MULTI) { + const newState = this.options[this.cursor].toggleOptionState(); + + if (this.cursor === 0) { + this.options.forEach((option, index) => { + if (index !== this.cursor) { + option.setOptionState(newState); + } + }); + } else { + if (this.checkForAllOff()) { + this.options[0].setOptionState(DropDownState.OFF); + } else if (this.checkForAllOn()) { + this.options[0].setOptionState(DropDownState.ON); + } else { + this.options[0].setOptionState(DropDownState.OFF); + } + } + } else { + if (this.options[this.cursor].state === DropDownState.OFF) { + this.options.forEach((option) => { + option.setOptionState(DropDownState.OFF); + option.setDirection(SortDirection.ASC); + option.toggle.setVisible(false); + }); + this.options[this.cursor].setOptionState(DropDownState.ON); + this.options[this.cursor].setDirection(this.lastDir); + this.options[this.cursor].toggle.setVisible(true); + } else { + this.options[this.cursor].toggleDirection(); + this.lastDir = this.options[this.cursor].dir; + } + } + this.onChange(); + } + + setVisible(value: boolean): this { + super.setVisible(value); + + if (value) { + this.autoSize(); + } + + return this; + } + + checkForAllOn(): boolean { + return this.options.every((option, i) => i === 0 || option.state === DropDownState.ON); + } + + checkForAllOff(): boolean { + return this.options.every((option, i) => i === 0 || option.state === DropDownState.OFF); + } + + getVals(): any[] { + if (this.dropDownType === DropDownType.MULTI) { + return this.options.filter((option, i) => i > 0 && option.state === DropDownState.ON).map((option) => option.val); + } else { + return this.options.filter((option, i) => option.state === DropDownState.ON).map((option) => { + return {val: option.val, dir: option.dir}; + }); + } + } + + autoSize(): void { + let maxWidth = 0; + let x = 0; + for (let i = 0; i < this.options.length; i++) { + if (this.options[i].sprite) { + if (this.options[i].sprite.displayWidth > maxWidth) { + maxWidth = this.options[i].sprite.displayWidth; + x = this.options[i].sprite.x; + } + } else { + if (this.options[i].text.displayWidth > maxWidth) { + maxWidth = this.options[i].text.displayWidth; + x = this.options[i].text.x; + } + } + } + this.window.width = maxWidth + x - this.window.x + 6; + + if (this.x + this.window.width > this.parentContainer.width) { + this.x = this.parentContainer.width - this.window.width; + } + } + + isActive(): boolean { + return this.options.some((option) => option.state === DropDownState.ON); + } +} diff --git a/src/ui/egg-gacha-ui-handler.ts b/src/ui/egg-gacha-ui-handler.ts index b5335ed8f2e..ae9d531a245 100644 --- a/src/ui/egg-gacha-ui-handler.ts +++ b/src/ui/egg-gacha-ui-handler.ts @@ -9,7 +9,7 @@ import { getPokemonSpecies } from "../data/pokemon-species"; import { addWindow } from "./ui-theme"; import { Tutorial, handleTutorial } from "../tutorial"; import {Button} from "#enums/buttons"; -import * as Overrides from "../overrides"; +import Overrides from "#app/overrides"; import { GachaType } from "#app/enums/gacha-types"; import i18next from "i18next"; import { EggTier } from "#enums/egg-type"; diff --git a/src/ui/filter-bar.ts b/src/ui/filter-bar.ts new file mode 100644 index 00000000000..cc4723799d5 --- /dev/null +++ b/src/ui/filter-bar.ts @@ -0,0 +1,201 @@ +import BattleScene from "#app/battle-scene.js"; +import { DropDown } from "./dropdown"; +import { StarterContainer } from "./starter-container"; +import { addTextObject, TextStyle } from "./text"; +import { addWindow, WindowVariant } from "./ui-theme"; + +export enum DropDownColumn { + GEN, + TYPES, + UNLOCKS, + WIN, + SORT +} + +export class FilterBar extends Phaser.GameObjects.Container { + private window: Phaser.GameObjects.NineSlice; + public labels: Phaser.GameObjects.Text[] = []; + public dropDowns: DropDown[] = []; + public cursorObj: Phaser.GameObjects.Image; + public numFilters: number = 0; + public openDropDown: boolean = false; + private lastCursor: number = -1; + public defaultGenVals: any[] = []; + public defaultTypeVals: any[] = []; + public defaultUnlockVals: any[] = []; + public defaultWinVals: any[] = []; + public defaultSortVals: any[] = []; + + constructor(scene: BattleScene, x: number, y: number, width: number, height: number) { + super(scene, x, y); + + this.width = width; + this.height = height; + + this.window = addWindow(scene, 0, 0, width, height, false, false, null, null, WindowVariant.THIN); + this.add(this.window); + + this.cursorObj = this.scene.add.image(1, 1, "cursor"); + this.cursorObj.setScale(0.5); + this.cursorObj.setVisible(false); + this.cursorObj.setOrigin(0, 0); + this.add(this.cursorObj); + } + + addFilter(text: string, dropDown: DropDown): void { + const filterTypesLabel = addTextObject(this.scene, 0, 3, text, TextStyle.TOOLTIP_CONTENT); + this.labels.push(filterTypesLabel); + this.add(filterTypesLabel); + this.dropDowns.push(dropDown); + this.add(dropDown); + + this.calcFilterPositions(); + this.numFilters++; + } + + + updateFilterLabels(): void { + const genVals = this.getVals(DropDownColumn.GEN); + const typeVals = this.getVals(DropDownColumn.TYPES); + const unlockVals = this.getVals(DropDownColumn.UNLOCKS); + const winVals = this.getVals(DropDownColumn.WIN); + const sortVals = this.getVals(DropDownColumn.SORT); + + // onColor is Yellow, offColor is White + const onColor = 0xffef5c; + const offColor = 0xffffff; + + // if genVals and defaultGenVals has same elements, set the label to White else set it to Green + if (genVals.length === this.defaultGenVals.length && genVals.every((value, index) => value === this.defaultGenVals[index])) { + this.labels[DropDownColumn.GEN].setTint(offColor); + } else { + this.labels[DropDownColumn.GEN].setTint(onColor); + } + + // if typeVals and defaultTypeVals has same elements, set the label to White else set it to Green + if (typeVals.length === this.defaultTypeVals.length && typeVals.every((value, index) => value === this.defaultTypeVals[index])) { + this.labels[DropDownColumn.TYPES].setTint(offColor); + } else { + this.labels[DropDownColumn.TYPES].setTint(onColor); + } + + // if unlockVals and defaultUnlockVals has same elements, set the label to White else set it to Green + if (unlockVals.length === this.defaultUnlockVals.length && unlockVals.every((value, index) => value === this.defaultUnlockVals[index])) { + this.labels[DropDownColumn.UNLOCKS].setTint(offColor); + } else { + this.labels[DropDownColumn.UNLOCKS].setTint(onColor); + } + + // if winVals and defaultWinVals has same elements, set the label to White else set it to Green + if (winVals.length === this.defaultWinVals.length && winVals.every((value, index) => value === this.defaultWinVals[index])) { + this.labels[DropDownColumn.WIN].setTint(offColor); + } else { + this.labels[DropDownColumn.WIN].setTint(onColor); + } + + // if sortVals and defaultSortVals has same value and dir, set the label to White else set it to Green + if (sortVals[0]["dir"] === this.defaultSortVals[0]["dir"] && sortVals[0]["val"] === this.defaultSortVals[0]["val"]) { + this.labels[DropDownColumn.SORT].setTint(offColor); + } else { + this.labels[DropDownColumn.SORT].setTint(onColor); + } + } + + calcFilterPositions(): void { + const paddingX = 6; + const cursorOffset = 8; + + // position labels with even space across the width of the container + let totalWidth = paddingX * 2 + cursorOffset; + this.labels.forEach(label => { + totalWidth += label.displayWidth + cursorOffset; + }); + const spacing = (this.width - totalWidth) / (this.labels.length - 1); + for (let i=0; i -1) { + if (this.dropDowns[this.lastCursor].visible) { + this.dropDowns[this.lastCursor].setVisible(false); + this.dropDowns[cursor].setVisible(true); + this.dropDowns[cursor].setCursor(0); + } + } + + const cursorOffset = 8; + this.cursorObj.setPosition(this.labels[cursor].x - cursorOffset + 2, 6); + this.lastCursor = cursor; + } + + toggleDropDown(index: number): void { + this.dropDowns[index].toggle(); + this.openDropDown = this.dropDowns[index].visible; + this.dropDowns[index].setCursor(0); + } + + hideDropDowns(): void { + this.dropDowns.forEach(dropDown => { + dropDown.setVisible(false); + }); + this.openDropDown = false; + } + + incDropDownCursor(): boolean { + 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); + } + } + + decDropDownCursor(): boolean { + 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); + } + } + + toggleOptionState(): void { + this.dropDowns[this.lastCursor].toggleOptionState(); + } + + getVals(col: DropDownColumn): any[] { + return this.dropDowns[col].getVals(); + } + + getNearestFilter(container: StarterContainer): number { + // find the nearest filter to the x position + const midx = container.x + container.icon.displayWidth / 2; + let nearest = 0; + let nearestDist = 1000; + for (let i=0; i < this.labels.length; i++) { + const dist = Math.abs(midx - (this.labels[i].x + this.labels[i].displayWidth / 3)); + if (dist < nearestDist) { + nearest = i; + nearestDist = dist; + } + } + + return nearest; + } + + getLastFilterX(): number { + return this.labels[this.lastCursor].x + this.labels[this.lastCursor].displayWidth / 2; + } + + isFilterActive(index: number) { + return this.dropDowns[index].isActive(); + } +} diff --git a/src/ui/login-form-ui-handler.ts b/src/ui/login-form-ui-handler.ts index 3b75c6f7c13..971bef6ea6b 100644 --- a/src/ui/login-form-ui-handler.ts +++ b/src/ui/login-form-ui-handler.ts @@ -3,8 +3,65 @@ import { ModalConfig } from "./modal-ui-handler"; import * as Utils from "../utils"; import { Mode } from "./ui"; import i18next from "i18next"; +import BattleScene from "#app/battle-scene.js"; +import { addTextObject, TextStyle } from "./text"; +import { addWindow } from "./ui-theme"; export default class LoginFormUiHandler extends FormModalUiHandler { + private googleImage: Phaser.GameObjects.Image; + private discordImage: Phaser.GameObjects.Image; + private externalPartyContainer: Phaser.GameObjects.Container; + private externalPartyBg: Phaser.GameObjects.NineSlice; + private externalPartyTitle: Phaser.GameObjects.Text; + constructor(scene: BattleScene, mode?: Mode) { + super(scene, mode); + } + + setup(): void { + + super.setup(); + 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.externalPartyTitle.setOrigin(0.5, 0); + this.externalPartyBg = addWindow(this.scene, 0, 0, 0, 0); + this.externalPartyContainer.add(this.externalPartyBg); + this.externalPartyContainer.add(this.externalPartyTitle); + + const googleImage = this.scene.add.image(0, 0, "google"); + googleImage.setOrigin(0, 0); + googleImage.setScale(0.07); + googleImage.setInteractive(); + googleImage.setName("google-icon"); + googleImage.on("pointerdown", () => { + 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"); + }); + this.googleImage = googleImage; + + const discordImage = this.scene.add.image(20, 0, "discord"); + discordImage.setOrigin(0, 0); + discordImage.setScale(0.07); + discordImage.setInteractive(); + discordImage.setName("discord-icon"); + discordImage.on("pointerdown", () => { + 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"); + }); + this.discordImage = discordImage; + + this.externalPartyContainer.add(this.googleImage); + this.externalPartyContainer.add(this.discordImage); + this.getUi().add(this.externalPartyContainer); + this.externalPartyContainer.add(this.googleImage); + this.externalPartyContainer.add(this.discordImage); + this.externalPartyContainer.setVisible(false); + } + getModalTitle(config?: ModalConfig): string { return i18next.t("menu:login"); } @@ -22,7 +79,7 @@ export default class LoginFormUiHandler extends FormModalUiHandler { } getButtonLabels(config?: ModalConfig): string[] { - return [ i18next.t("menu:login"), i18next.t("menu:register") ]; + return [ i18next.t("menu:login"), i18next.t("menu:register")]; } getReadableErrorMessage(error: string): string { @@ -46,8 +103,10 @@ export default class LoginFormUiHandler extends FormModalUiHandler { show(args: any[]): boolean { if (super.show(args)) { - const config = args[0] as ModalConfig; + this.processExternalProvider(); + + const config = args[0] as ModalConfig; const originalLoginAction = this.submitAction; this.submitAction = (_) => { // Prevent overlapping overrides on action modification @@ -83,4 +142,33 @@ export default class LoginFormUiHandler extends FormModalUiHandler { return false; } + + clear() { + super.clear(); + this.externalPartyContainer.setVisible(false); + + this.discordImage.off("pointerdown"); + this.googleImage.off("pointerdown"); + } + + processExternalProvider() : void { + this.externalPartyTitle.setText(i18next.t("menu:orUse") ?? ""); + this.externalPartyTitle.setX(20+this.externalPartyTitle.text.length); + this.externalPartyTitle.setVisible(true); + this.externalPartyContainer.setPositionRelative(this.modalContainer, 175, 0); + this.externalPartyContainer.setVisible(true); + this.externalPartyBg.setSize(this.externalPartyTitle.text.length+50, this.modalBg.height); + this.getUi().moveTo(this.externalPartyContainer, this.getUi().length - 1); + this.googleImage.setPosition(this.externalPartyBg.width/3.1,this.externalPartyBg.height-60); + this.discordImage.setPosition(this.externalPartyBg.width/3.1, this.externalPartyBg.height-40); + + this.externalPartyContainer.setAlpha(0); + this.scene.tweens.add({ + targets: this.externalPartyContainer, + duration: Utils.fixedInt(1000), + ease: "Sine.easeInOut", + y: "-=24", + alpha: 1 + }); + } } diff --git a/src/ui/menu-ui-handler.ts b/src/ui/menu-ui-handler.ts index 571a09f3b37..88c9791c689 100644 --- a/src/ui/menu-ui-handler.ts +++ b/src/ui/menu-ui-handler.ts @@ -6,7 +6,7 @@ import { addWindow } from "./ui-theme"; import MessageUiHandler from "./message-ui-handler"; import { OptionSelectConfig, OptionSelectItem } from "./abstact-option-select-ui-handler"; import { Tutorial, handleTutorial } from "../tutorial"; -import { updateUserInfo } from "../account"; +import { loggedInUser, updateUserInfo } from "../account"; import i18next from "i18next"; import {Button} from "#enums/buttons"; import { GameDataType } from "#enums/game-data-type"; @@ -22,7 +22,7 @@ enum MenuOptions { MANAGE_DATA, COMMUNITY, SAVE_AND_QUIT, - LOG_OUT + LOG_OUT, } let wikiUrl = "https://wiki.pokerogue.net/start"; @@ -146,7 +146,7 @@ export default class MenuUiHandler extends MessageUiHandler { }); }; - if (Utils.isLocal) { + if (Utils.isLocal || Utils.isBeta) { manageDataOptions.push({ label: i18next.t("menuUiHandler:importSession"), handler: () => { @@ -177,7 +177,7 @@ export default class MenuUiHandler extends MessageUiHandler { }, keepOpen: true }); - if (Utils.isLocal) { + if (Utils.isLocal || Utils.isBeta) { manageDataOptions.push({ label: i18next.t("menuUiHandler:importData"), handler: () => { @@ -188,22 +188,21 @@ export default class MenuUiHandler extends MessageUiHandler { keepOpen: true }); } - manageDataOptions.push( - { - label: i18next.t("menuUiHandler:exportData"), - handler: () => { - this.scene.gameData.tryExportData(GameDataType.SYSTEM); - return true; - }, - keepOpen: true + manageDataOptions.push({ + label: i18next.t("menuUiHandler:exportData"), + handler: () => { + this.scene.gameData.tryExportData(GameDataType.SYSTEM); + return true; }, - { - label: i18next.t("menuUiHandler:cancel"), - handler: () => { - this.scene.ui.revertMode(); - return true; - } + keepOpen: true + }); + manageDataOptions.push({ + label: i18next.t("menuUiHandler:cancel"), + handler: () => { + this.scene.ui.revertMode(); + return true; } + } ); this.manageDataConfig = { @@ -332,6 +331,51 @@ export default class MenuUiHandler extends MessageUiHandler { 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, + { + label: loggedInUser.discordId === "" ? i18next.t("menuUiHandler:linkDiscord") : i18next.t("menuUiHandler:unlinkDiscord"), + handler: () => { + if (loggedInUser?.discordId === "") { + const token = Utils.getCookie(Utils.sessionIdKey); + 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&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; + } + } + }, + { + label: loggedInUser?.googleId === "" ? i18next.t("menuUiHandler:linkGoogle") : i18next.t("menuUiHandler:unlinkGoogle"), + handler: () => { + if (loggedInUser?.googleId === "") { + const token = Utils.getCookie(Utils.sessionIdKey); + 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}&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; + } + } + }); + } ui.setOverlayMode(Mode.MENU_OPTION_SELECT, this.manageDataConfig); success = true; break; @@ -363,7 +407,7 @@ export default class MenuUiHandler extends MessageUiHandler { if (!res.ok) { console.error(`Log out failed (${res.status}: ${res.statusText})`); } - Utils.setCookie(Utils.sessionIdKey, ""); + Utils.removeCookie(Utils.sessionIdKey); updateUserInfo().then(() => this.scene.reset(true, true)); }); }; diff --git a/src/ui/modifier-select-ui-handler.ts b/src/ui/modifier-select-ui-handler.ts index c5c3f94b75d..25e2e837c82 100644 --- a/src/ui/modifier-select-ui-handler.ts +++ b/src/ui/modifier-select-ui-handler.ts @@ -141,7 +141,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { this.player = args[0]; - const partyHasHeldItem = this.player && !!this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier && (m as PokemonHeldItemModifier).getTransferrable(true)).length; + const partyHasHeldItem = this.player && !!this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier && m.isTransferrable).length; const canLockRarities = !!this.scene.findModifier(m => m instanceof LockModifierTiersModifier); this.transferButtonContainer.setVisible(false); diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index 69bad0ff4d7..ac480e7708b 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -21,6 +21,7 @@ import MoveInfoOverlay from "./move-info-overlay"; import i18next from "i18next"; import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; import { Moves } from "#enums/moves"; +import { getPokemonNameWithAffix } from "#app/messages.js"; const defaultMessage = i18next.t("partyUiHandler:choosePokemon"); @@ -53,6 +54,7 @@ export enum PartyOption { SPLICE, UNSPLICE, RELEASE, + RENAME, SELECT, SCROLL_UP = 1000, SCROLL_DOWN = 1001, @@ -61,7 +63,7 @@ export enum PartyOption { MOVE_2, MOVE_3, MOVE_4, - ALL = 4000 + ALL = 4000, } export type PartySelectCallback = (cursor: integer, option: PartyOption) => void; @@ -117,14 +119,14 @@ export default class PartyUiHandler extends MessageUiHandler { public static FilterNonFainted = (pokemon: PlayerPokemon) => { if (pokemon.isFainted()) { - return i18next.t("partyUiHandler:noEnergy", { pokemonName: pokemon.name }); + return i18next.t("partyUiHandler:noEnergy", { pokemonName: getPokemonNameWithAffix(pokemon) }); } return null; }; public static FilterFainted = (pokemon: PlayerPokemon) => { if (!pokemon.isFainted()) { - return i18next.t("partyUiHandler:hasEnergy", { pokemonName: pokemon.name }); + return i18next.t("partyUiHandler:hasEnergy", { pokemonName: getPokemonNameWithAffix(pokemon) }); } return null; }; @@ -138,7 +140,7 @@ export default class PartyUiHandler extends MessageUiHandler { const challengeAllowed = new Utils.BooleanHolder(true); applyChallenges(this.scene.gameMode, ChallengeType.POKEMON_IN_BATTLE, pokemon, challengeAllowed); if (!challengeAllowed.value) { - return i18next.t("partyUiHandler:cantBeUsed", { pokemonName: pokemon.name }); + return i18next.t("partyUiHandler:cantBeUsed", { pokemonName: getPokemonNameWithAffix(pokemon) }); } return null; }; @@ -148,14 +150,14 @@ export default class PartyUiHandler extends MessageUiHandler { 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: pokemon.name }); + 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.SELECT]; + 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]; constructor(scene: BattleScene) { super(scene, Mode.PARTY); @@ -304,11 +306,11 @@ 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) + } 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)) { let filterResult: string; const getTransferrableItemsFromPokemon = (pokemon: PlayerPokemon) => - this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier && (m as PokemonHeldItemModifier).getTransferrable(true) && (m as PokemonHeldItemModifier).pokemonId === pokemon.id) as PokemonHeldItemModifier[]; + this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier && m.isTransferrable && 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)) { @@ -380,7 +382,7 @@ export default class PartyUiHandler extends MessageUiHandler { this.clearOptions(); ui.playSelect(); pokemon.pauseEvolutions = false; - this.showText(i18next.t("partyUiHandler:unpausedEvolutions", { pokemonName: pokemon.name }), null, () => this.showText(null, 0), null, true); + this.showText(i18next.t("partyUiHandler:unpausedEvolutions", { pokemonName: getPokemonNameWithAffix(pokemon) }), null, () => this.showText(null, 0), null, true); } else if (option === PartyOption.UNSPLICE) { this.clearOptions(); ui.playSelect(); @@ -405,7 +407,7 @@ export default class PartyUiHandler extends MessageUiHandler { this.clearOptions(); ui.playSelect(); if (this.cursor >= this.scene.currentBattle.getBattlerCount() || !pokemon.isAllowedInBattle()) { - this.showText(i18next.t("partyUiHandler:releaseConfirmation", { pokemonName: pokemon.name }), null, () => { + this.showText(i18next.t("partyUiHandler:releaseConfirmation", { pokemonName: getPokemonNameWithAffix(pokemon) }), null, () => { ui.setModeWithoutClear(Mode.CONFIRM, () => { ui.setMode(Mode.PARTY); this.doRelease(this.cursor); @@ -418,6 +420,25 @@ export default class PartyUiHandler extends MessageUiHandler { this.showText(i18next.t("partyUiHandler:releaseInBattle"), null, () => this.showText(null, 0), null, true); } return true; + } 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); + return true; } else if (option === PartyOption.CANCEL) { return this.processInput(Button.CANCEL); } else if (option === PartyOption.SELECT) { @@ -488,7 +509,7 @@ export default class PartyUiHandler extends MessageUiHandler { 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 as PokemonHeldItemModifier).getTransferrable(true) && (m as PokemonHeldItemModifier).pokemonId === this.scene.getParty()[this.cursor].id) as PokemonHeldItemModifier[]; + && m.isTransferrable && m.pokemonId === this.scene.getParty()[this.cursor].id) as PokemonHeldItemModifier[]; this.transferQuantities = itemModifiers.map(item => item.getStackCount()); this.transferQuantitiesMax = itemModifiers.map(item => item.getStackCount()); } @@ -705,7 +726,7 @@ export default class PartyUiHandler extends MessageUiHandler { const itemModifiers = this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER ? this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && (m as PokemonHeldItemModifier).getTransferrable(true) && (m as PokemonHeldItemModifier).pokemonId === pokemon.id) as PokemonHeldItemModifier[] + && m.isTransferrable && m.pokemonId === pokemon.id) as PokemonHeldItemModifier[] : null; if (this.options.length) { @@ -771,6 +792,7 @@ export default class PartyUiHandler extends MessageUiHandler { } this.options.push(PartyOption.SUMMARY); + this.options.push(PartyOption.RENAME); if (pokemon.pauseEvolutions && pokemonEvolutions.hasOwnProperty(pokemon.species.speciesId)) { this.options.push(PartyOption.UNPAUSE_EVOLUTION); @@ -937,7 +959,7 @@ export default class PartyUiHandler extends MessageUiHandler { } doRelease(slotIndex: integer): void { - this.showText(this.getReleaseMessage(this.scene.getParty()[slotIndex].name), null, () => { + 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]; @@ -1068,7 +1090,7 @@ class PartySlot extends Phaser.GameObjects.Container { const slotInfoContainer = this.scene.add.container(0, 0); this.add(slotInfoContainer); - let displayName = this.pokemon.name; + let displayName = this.pokemon.getNameToRender(); let nameTextWidth: number; const nameSizeTest = addTextObject(this.scene, 0, 0, displayName, TextStyle.PARTY); diff --git a/src/ui/pokemon-info-container.ts b/src/ui/pokemon-info-container.ts index 9f4df2b20b4..1e958ae53b7 100644 --- a/src/ui/pokemon-info-container.ts +++ b/src/ui/pokemon-info-container.ts @@ -364,13 +364,14 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { }); } - makeRoomForConfirmUi(speedMultiplier: number = 1): Promise { + makeRoomForConfirmUi(speedMultiplier: number = 1, fromCatch: boolean = false): Promise { + const xPosition = fromCatch ? this.initialX - this.infoWindowWidth - 65 : this.initialX - this.infoWindowWidth - ConfirmUiHandler.windowWidth; return new Promise(resolve => { this.scene.tweens.add({ targets: this, duration: Utils.fixedInt(Math.floor(150 / speedMultiplier)), ease: "Cubic.easeInOut", - x: this.initialX - this.infoWindowWidth - ConfirmUiHandler.windowWidth, + x: xPosition, onComplete: () => { resolve(); } diff --git a/src/ui/rename-form-ui-handler.ts b/src/ui/rename-form-ui-handler.ts new file mode 100644 index 00000000000..35127564b60 --- /dev/null +++ b/src/ui/rename-form-ui-handler.ts @@ -0,0 +1,58 @@ +import { FormModalUiHandler } from "./form-modal-ui-handler"; +import { ModalConfig } from "./modal-ui-handler"; +import i18next from "i18next"; +import { PlayerPokemon } from "#app/field/pokemon.js"; + +export default class RenameFormUiHandler extends FormModalUiHandler { + getModalTitle(config?: ModalConfig): string { + return i18next.t("menu:renamePokemon"); + } + + getFields(config?: ModalConfig): string[] { + return [ i18next.t("menu:nickname") ]; + } + + getWidth(config?: ModalConfig): number { + return 160; + } + + 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") ]; + } + + getReadableErrorMessage(error: string): string { + const colonIndex = error?.indexOf(":"); + if (colonIndex > 0) { + error = error.slice(0, colonIndex); + } + + return super.getReadableErrorMessage(error); + } + + show(args: any[]): boolean { + if (super.show(args)) { + const config = args[0] as ModalConfig; + this.inputs[0].text = (args[1] as PlayerPokemon).getNameToRender(); + + this.submitAction = (_) => { + this.sanitizeInputs(); + // const onFail = () => { + // this.scene.ui.setModeWithoutClear(Mode.RENAME_POKEMON, Object.assign(config)); + // this.scene.ui.playError(); + // }; + // if (!this.inputs[0].text) { + // return onFail(); + // } + const sanitizedName = btoa(unescape(encodeURIComponent(this.inputs[0].text))); + config.buttonActions[0](sanitizedName); + return true; + }; + return true; + } + return false; + } +} diff --git a/src/ui/scroll-bar.ts b/src/ui/scroll-bar.ts new file mode 100644 index 00000000000..02282edb4cd --- /dev/null +++ b/src/ui/scroll-bar.ts @@ -0,0 +1,36 @@ +export class ScrollBar extends Phaser.GameObjects.Container { + private bg: Phaser.GameObjects.Image; + private handleBody: Phaser.GameObjects.Rectangle; + private handleBottom: Phaser.GameObjects.Image; + private pages: number; + private page: number; + + constructor(scene: Phaser.Scene, x: number, y: number, pages: number) { + super(scene, x, y); + + this.bg = scene.add.image(0, 0, "scroll_bar"); + this.bg.setOrigin(0, 0); + this.add(this.bg); + + this.handleBody = scene.add.rectangle(1, 1, 3, 4, 0xaaaaaa); + this.handleBody.setOrigin(0, 0); + this.add(this.handleBody); + + this.handleBottom = scene.add.image(1, 1, "scroll_bar_handle"); + this.handleBottom.setOrigin(0, 0); + this.add(this.handleBottom); + } + + setPage(page: number): void { + this.page = page; + this.handleBody.y = 1 + (this.bg.displayHeight - 1 - this.handleBottom.displayHeight) / this.pages * page; + this.handleBottom.y = this.handleBody.y + this.handleBody.displayHeight; + } + + setPages(pages: number): void { + this.pages = pages; + this.handleBody.height = (this.bg.displayHeight - 1 - this.handleBottom.displayHeight) / this.pages; + + this.setVisible(this.pages > 1); + } +} diff --git a/src/ui/settings/abstract-settings-ui-handler.ts b/src/ui/settings/abstract-settings-ui-handler.ts index 6763c8d3d85..3ffd32cf842 100644 --- a/src/ui/settings/abstract-settings-ui-handler.ts +++ b/src/ui/settings/abstract-settings-ui-handler.ts @@ -375,6 +375,7 @@ export default class AbstractSettingsUiHandler extends UiHandler { super.clear(); this.settingsContainer.setVisible(false); this.eraseCursor(); + this.getUi().bgmBar.toggleBgmBar(this.scene.showBgmBar); if (this.reloadRequired) { this.reloadRequired = false; this.scene.reset(true, false, true); diff --git a/src/ui/starter-container.ts b/src/ui/starter-container.ts new file mode 100644 index 00000000000..ae589d138b9 --- /dev/null +++ b/src/ui/starter-container.ts @@ -0,0 +1,101 @@ +import BattleScene from "../battle-scene"; +import 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[] = []; + public label: Phaser.GameObjects.Text; + public starterPassiveBgs: Phaser.GameObjects.Image; + public hiddenAbilityIcon: Phaser.GameObjects.Image; + public classicWinIcon: Phaser.GameObjects.Image; + public candyUpgradeIcon: Phaser.GameObjects.Image; + public candyUpgradeOverlayIcon: Phaser.GameObjects.Image; + public cost: number = 0; + + constructor(scene: BattleScene, species: PokemonSpecies) { + super(scene, 0, 0); + + this.species = species; + + const defaultDexAttr = scene.gameData.getSpeciesDefaultDexAttr(species, false, true); + const defaultProps = scene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); + + // starter passive bg + const starterPassiveBg = this.scene.add.image(2, 5, "passive_bg"); + starterPassiveBg.setOrigin(0, 0); + starterPassiveBg.setScale(0.75); + starterPassiveBg.setVisible(false); + this.add(starterPassiveBg); + this.starterPassiveBgs = starterPassiveBg; + + // icon + this.icon = this.scene.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.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"); + shinyIcon.setScale(0.5); + shinyIcon.setOrigin(0, 0); + shinyIcon.setVisible(false); + this.shinyIcons.push(shinyIcon); + } + this.add(this.shinyIcons); + + // value label + const label = addTextObject(this.scene, 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 = this.scene.add.image(12, 7, "ha_capsule"); + abilityIcon.setOrigin(0, 0); + abilityIcon.setScale(0.5); + abilityIcon.setVisible(false); + this.add(abilityIcon); + this.hiddenAbilityIcon = abilityIcon; + + // classic win icon + const classicWinIcon = this.scene.add.image(2, 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 = this.scene.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 = this.scene.add.image(12, 12, "candy_overlay"); + candyUpgradeOverlayIcon.setOrigin(0, 0); + candyUpgradeOverlayIcon.setScale(0.25); + candyUpgradeOverlayIcon.setVisible(false); + this.add(candyUpgradeOverlayIcon); + this.candyUpgradeOverlayIcon = candyUpgradeOverlayIcon; + } + + 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/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 0caf9ef6fa6..1307f46d28f 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -28,7 +28,7 @@ import { TextStyle, addBBCodeTextObject, addTextObject } from "./text"; import { Mode } from "./ui"; import { addWindow } from "./ui-theme"; import { Egg } from "#app/data/egg"; -import * as Overrides from "../overrides"; +import Overrides from "#app/overrides"; import {SettingKeyboard} from "#app/system/settings/settings-keyboard"; import {Passive as PassiveAttr} from "#enums/passive"; import * as Challenge from "../data/challenge"; @@ -39,6 +39,11 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import {Button} from "#enums/buttons"; import { EggSourceType } from "#app/enums/egg-source-types.js"; +import AwaitableUiHandler from "./awaitable-ui-handler"; +import { DropDown, DropDownOption, DropDownState, DropDownType } from "./dropdown"; +import { StarterContainer } from "./starter-container"; +import { DropDownColumn, FilterBar } from "./filter-bar"; +import { ScrollBar } from "./scroll-bar"; export type StarterSelectCallback = (starters: Starter[]) => void; @@ -127,44 +132,27 @@ function getSameSpeciesEggCandyCounts(baseValue: integer): integer { } /** - * Calculates the icon position for a Pokemon of a given UI index - * @param index UI index to calculate the icon position of + * 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 calcIconPosition(index: number): {x: number, y: number} { +function calcStarterPosition(index: number, scrollCursor:number = 0): {x: number, y: number} { + const yOffset = 13; + const height = 17; const x = (index % 9) * 18; - const y = Math.floor(index / 9) * 18; + const y = yOffset + (Math.floor(index / 9) - scrollCursor) * height; return {x: x, y: y}; } -/** - * Calculates the {@linkcode Phaser.GameObjects.Sprite} position for a Pokemon of a given UI index - * @param index UI index to calculate the icon position of - * @returns An interface with an x and y property - */ -function calcSpritePosition(index: number): {x: number, y: number} { - const position = calcIconPosition(index); - - return {x: position.x - 2, y: position.y + 2}; -} - -const gens = [ - i18next.t("starterSelectUiHandler:gen1"), - i18next.t("starterSelectUiHandler:gen2"), - i18next.t("starterSelectUiHandler:gen3"), - i18next.t("starterSelectUiHandler:gen4"), - i18next.t("starterSelectUiHandler:gen5"), - i18next.t("starterSelectUiHandler:gen6"), - i18next.t("starterSelectUiHandler:gen7"), - i18next.t("starterSelectUiHandler:gen8"), - i18next.t("starterSelectUiHandler:gen9") -]; - export default class StarterSelectUiHandler extends MessageUiHandler { private starterSelectContainer: Phaser.GameObjects.Container; + private starterSelectScrollBar: ScrollBar; + private filterBarContainer: Phaser.GameObjects.Container; + private filterBar: FilterBar; private shinyOverlay: Phaser.GameObjects.Image; - private starterSelectGenIconContainers: Phaser.GameObjects.Container[]; + private starterContainer: StarterContainer[] = []; + private filteredStarterContainers: StarterContainer[] = []; private pokemonNumberText: Phaser.GameObjects.Text; private pokemonSprite: Phaser.GameObjects.Sprite; private pokemonNameText: Phaser.GameObjects.Text; @@ -200,7 +188,6 @@ export default class StarterSelectUiHandler extends MessageUiHandler { private pokemonHatchedIcon : Phaser.GameObjects.Sprite; private pokemonHatchedCountText: Phaser.GameObjects.Text; private pokemonShinyIcon: Phaser.GameObjects.Sprite; - private genOptionsText: Phaser.GameObjects.Text; private instructionsContainer: Phaser.GameObjects.Container; private shinyIconElement: Phaser.GameObjects.Sprite; @@ -222,22 +209,23 @@ export default class StarterSelectUiHandler extends MessageUiHandler { private pokemonFormText: Phaser.GameObjects.Text; private moveInfoOverlay : MoveInfoOverlay; - private genMode: boolean; private statsMode: boolean; + private starterIconsCursorXOffset: number = -3; + private starterIconsCursorYOffset: number = 1; + private starterIconsCursorIndex: number; + private filterMode: boolean; private dexAttrCursor: bigint = 0n; - private abilityCursor: integer = -1; - private natureCursor: integer = -1; - private genCursor: integer = 0; - private genScrollCursor: integer = 0; + private abilityCursor: number = -1; + private natureCursor: number = -1; + private filterBarCursor: integer = 0; private starterMoveset: StarterMoveset; + private scrollCursor: number; - private genSpecies: PokemonSpecies[][] = []; + private allSpecies: PokemonSpecies[] = []; private lastSpecies: PokemonSpecies; private speciesLoaded: Map = new Map(); - public starterGens: integer[] = []; - public starterCursors: integer[] = []; - private pokerusGens: integer[] = []; - private pokerusCursors: integer[] = []; + public starterSpecies: PokemonSpecies[] = []; + private pokerusSpecies: PokemonSpecies[] = []; private starterAttr: bigint[] = []; private starterAbilityIndexes: integer[] = []; private starterNatures: Nature[] = []; @@ -258,17 +246,16 @@ export default class StarterSelectUiHandler extends MessageUiHandler { private starterCursorObjs: Phaser.GameObjects.Image[]; private pokerusCursorObjs: Phaser.GameObjects.Image[]; private starterIcons: Phaser.GameObjects.Sprite[]; - private genCursorObj: Phaser.GameObjects.Image; - private genCursorHighlightObj: Phaser.GameObjects.Image; + private starterIconsCursorObj: Phaser.GameObjects.Image; private valueLimitLabel: Phaser.GameObjects.Text; private startCursorObj: Phaser.GameObjects.NineSlice; - private starterValueLabels: Phaser.GameObjects.Text[]; - private shinyIcons: Phaser.GameObjects.Image[][]; - private hiddenAbilityIcons: Phaser.GameObjects.Image[]; - private classicWinIcons: Phaser.GameObjects.Image[]; - private candyUpgradeIcon: Phaser.GameObjects.Image[]; - private candyUpgradeOverlayIcon: Phaser.GameObjects.Image[]; - + // private starterValueLabels: Phaser.GameObjects.Text[]; + // private shinyIcons: Phaser.GameObjects.Image[][]; + // private hiddenAbilityIcons: Phaser.GameObjects.Image[]; + // private classicWinIcons: Phaser.GameObjects.Image[]; + // private candyUpgradeIcon: Phaser.GameObjects.Image[]; + // private candyUpgradeOverlayIcon: Phaser.GameObjects.Image[]; + // private iconAnimHandler: PokemonIconAnimHandler; //variables to keep track of the dynamically rendered list of instruction prompts for starter select @@ -309,13 +296,96 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.shinyOverlay.setVisible(false); this.starterSelectContainer.add(this.shinyOverlay); - const starterContainerWindow = addWindow(this.scene, 141, 1, 178, 178); + const starterContainerWindow = addWindow(this.scene, 109, 18, 175, 161); + const starterContainerBg = this.scene.add.image(110, 19, "starter_container_bg"); + starterContainerBg.setOrigin(0, 0); + this.starterSelectContainer.add(starterContainerBg); - this.starterSelectContainer.add(addWindow(this.scene, 107, 1, 34, 58)); - this.starterSelectContainer.add(addWindow(this.scene, 107, 59, 34, 91)); - this.starterSelectContainer.add(addWindow(this.scene, 107, 145, 34, 34, true)); + this.starterSelectContainer.add(addWindow(this.scene, 285, 59, 34, 91)); + this.starterSelectContainer.add(addWindow(this.scene, 285, 145, 34, 34, true)); this.starterSelectContainer.add(starterContainerWindow); + this.filterBarContainer = this.scene.add.container(0, 0); + + // this.filterBar = new FilterBar(this.scene, 143, 1, 175, 17); + this.filterBar = new FilterBar(this.scene, 109, 1, 175, 17); + + // gen filter + const genOptions: DropDownOption[] = [ + new DropDownOption(this.scene, 1, i18next.t("starterSelectUiHandler:gen1"), null, DropDownState.ON), + new DropDownOption(this.scene, 2, i18next.t("starterSelectUiHandler:gen2"), null, DropDownState.ON), + new DropDownOption(this.scene, 3, i18next.t("starterSelectUiHandler:gen3"), null, DropDownState.ON), + new DropDownOption(this.scene, 4, i18next.t("starterSelectUiHandler:gen4"), null, DropDownState.ON), + new DropDownOption(this.scene, 5, i18next.t("starterSelectUiHandler:gen5"), null, DropDownState.ON), + new DropDownOption(this.scene, 6, i18next.t("starterSelectUiHandler:gen6"), null, DropDownState.ON), + new DropDownOption(this.scene, 7, i18next.t("starterSelectUiHandler:gen7"), null, DropDownState.ON), + new DropDownOption(this.scene, 8, i18next.t("starterSelectUiHandler:gen8"), null, DropDownState.ON), + new DropDownOption(this.scene, 9, i18next.t("starterSelectUiHandler:gen9"), null, DropDownState.ON), + ]; + this.filterBar.addFilter("Gen", new DropDown(this.scene, 0, 0, genOptions, this.updateStarters, DropDownType.MULTI)); + this.filterBar.defaultGenVals = this.filterBar.getVals(DropDownColumn.GEN); + // set gen filter to all off except for the I GEN + for (const option of genOptions) { + if (option.val !== 1) { + option.setOptionState(DropDownState.OFF); + } + } + + // type filter + const typeKeys = Object.keys(Type).filter(v => isNaN(Number(v))); + const typeOptions: DropDownOption[] = []; + typeKeys.forEach((type, index) => { + if (index === 0 || index === 19) { + return; + } + const typeSprite = this.scene.add.sprite(0, 0, `types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`); + typeSprite.setScale(0.5); + typeSprite.setFrame(type.toLowerCase()); + typeOptions.push(new DropDownOption(this.scene, index, null, typeSprite)); + }); + this.filterBar.addFilter("Type", new DropDown(this.scene, 0, 0, typeOptions, this.updateStarters, DropDownType.MULTI, 0.5)); + this.filterBar.defaultTypeVals = this.filterBar.getVals(DropDownColumn.TYPES); + + // Unlocks filter + const shiny1Sprite = this.scene.add.sprite(0, 0, "shiny_star_small"); + shiny1Sprite.setTint(getVariantTint(0)); + const shiny2Sprite = this.scene.add.sprite(0, 0, "shiny_star_small"); + shiny2Sprite.setTint(getVariantTint(1)); + const shiny3Sprite = this.scene.add.sprite(0, 0, "shiny_star_small"); + shiny3Sprite.setTint(getVariantTint(2)); + + const unlocksOptions = [ + new DropDownOption(this.scene, "SHINY3", null, shiny3Sprite), + new DropDownOption(this.scene, "SHINY2", null, shiny2Sprite), + new DropDownOption(this.scene, "SHINY", null, shiny1Sprite), + new DropDownOption(this.scene, "NORMAL", "Normal"), + new DropDownOption(this.scene, "UNCAUGHT", "Not Caught"), + new DropDownOption(this.scene, "PASSIVEUNLOCKED", "Passive Unlocked"), + new DropDownOption(this.scene, "PASSIVELOCKED", "Passive Locked"),]; + + this.filterBar.addFilter("Unlocks", new DropDown(this.scene, 0, 0, unlocksOptions, this.updateStarters, DropDownType.MULTI)); + this.filterBar.defaultUnlockVals = this.filterBar.getVals(DropDownColumn.UNLOCKS); + + // win filter + const winOptions = [ + new DropDownOption(this.scene, "WIN", "has won"), + new DropDownOption(this.scene, "NOTWIN", "hasn't won yet")]; + this.filterBar.addFilter("Win", new DropDown(this.scene, 0, 0, winOptions, this.updateStarters, DropDownType.MULTI)); + this.filterBar.defaultWinVals = this.filterBar.getVals(DropDownColumn.WIN); + + // sort filter + const sortOptions = [ + new DropDownOption(this.scene, 0, "No."), + new DropDownOption(this.scene, 1, "Cost", null, DropDownState.OFF), + new DropDownOption(this.scene, 2, "# Candies", null, DropDownState.OFF), + new DropDownOption(this.scene, 3, "IVs", null, DropDownState.OFF), + new DropDownOption(this.scene, 4, "Name", null, DropDownState.OFF)]; + this.filterBar.addFilter("Sort", new DropDown(this.scene, 0, 0, sortOptions, this.updateStarters, DropDownType.SINGLE)); + this.filterBarContainer.add(this.filterBar); + this.filterBar.defaultSortVals = this.filterBar.getVals(DropDownColumn.SORT); + + this.starterSelectContainer.add(this.filterBarContainer); + if (!this.scene.uiTheme) { starterContainerWindow.setVisible(false); } @@ -391,27 +461,32 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonEggMoveBgs = []; this.pokemonEggMoveLabels = []; - this.genOptionsText = addTextObject(this.scene, 124, 7, "", TextStyle.WINDOW, { fontSize: 72, lineSpacing: 39, align: "center" }); - this.genOptionsText.setShadowOffset(4.5, 4.5); - this.genOptionsText.setOrigin(0.5, 0); - this.starterSelectContainer.add(this.genOptionsText); + this.valueLimitLabel = addTextObject(this.scene, 302, 150, "0/10", TextStyle.TOOLTIP_CONTENT); + this.valueLimitLabel.setOrigin(0.5, 0); + this.starterSelectContainer.add(this.valueLimitLabel); - this.updateGenOptions(); + const startLabel = addTextObject(this.scene, 302, 162, i18next.t("common:start"), TextStyle.TOOLTIP_CONTENT); + startLabel.setOrigin(0.5, 0); + this.starterSelectContainer.add(startLabel); - this.starterSelectGenIconContainers = new Array(gens.length).fill(null).map((_, i) => { - const container = this.scene.add.container(151, 9); - if (i) { - container.setVisible(false); - } - this.starterSelectContainer.add(container); - return container; - }); + this.startCursorObj = this.scene.add.nineslice(289, 160, "select_cursor", null, 26, 15, 6, 6, 6, 6); + this.startCursorObj.setVisible(false); + this.startCursorObj.setOrigin(0, 0); + this.starterSelectContainer.add(this.startCursorObj); + + const starterSpecies: Species[] = []; + + const starterBoxContainer = this.scene.add.container(115, 9); + + this.starterSelectScrollBar = new ScrollBar(this.scene, 161, 12, 0); + + starterBoxContainer.add(this.starterSelectScrollBar); this.pokerusCursorObjs = new Array(3).fill(null).map(() => { const cursorObj = this.scene.add.image(0, 0, "select_cursor_pokerus"); cursorObj.setVisible(false); cursorObj.setOrigin(0, 0); - this.starterSelectContainer.add(cursorObj); + starterBoxContainer.add(cursorObj); return cursorObj; }); @@ -419,66 +494,39 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const cursorObj = this.scene.add.image(0, 0, "select_cursor_highlight"); cursorObj.setVisible(false); cursorObj.setOrigin(0, 0); - this.starterSelectContainer.add(cursorObj); + starterBoxContainer.add(cursorObj); return cursorObj; }); this.cursorObj = this.scene.add.image(0, 0, "select_cursor"); this.cursorObj.setOrigin(0, 0); - this.starterSelectContainer.add(this.cursorObj); + this.starterIconsCursorObj = this.scene.add.image(289, 64, "select_gen_cursor"); + this.starterIconsCursorObj.setName("starter-icons-cursor"); + this.starterIconsCursorObj.setVisible(false); + this.starterIconsCursorObj.setOrigin(0, 0); + this.starterSelectContainer.add(this.starterIconsCursorObj); - this.genCursorHighlightObj = this.scene.add.image(111, 5, "select_gen_cursor_highlight"); - this.genCursorHighlightObj.setOrigin(0, 0); - this.starterSelectContainer.add(this.genCursorHighlightObj); + starterBoxContainer.add(this.cursorObj); - this.genCursorObj = this.scene.add.image(111, 5, "select_gen_cursor"); - this.genCursorObj.setVisible(false); - this.genCursorObj.setOrigin(0, 0); - this.starterSelectContainer.add(this.genCursorObj); - - this.valueLimitLabel = addTextObject(this.scene, 124, 150, "0/10", TextStyle.TOOLTIP_CONTENT); - this.valueLimitLabel.setOrigin(0.5, 0); - this.starterSelectContainer.add(this.valueLimitLabel); - - const startLabel = addTextObject(this.scene, 124, 162, i18next.t("common:start"), TextStyle.TOOLTIP_CONTENT); - startLabel.setOrigin(0.5, 0); - this.starterSelectContainer.add(startLabel); - - this.startCursorObj = this.scene.add.nineslice(111, 160, "select_cursor", null, 26, 15, 6, 6, 6, 6); - this.startCursorObj.setVisible(false); - this.startCursorObj.setOrigin(0, 0); - this.starterSelectContainer.add(this.startCursorObj); - - const starterSpecies: Species[] = []; - - for (let g = 0; g < this.starterSelectGenIconContainers.length; g++) { - let s = 0; - this.genSpecies.push([]); - - for (const species of allSpecies) { - if (!speciesStarters.hasOwnProperty(species.speciesId) || species.generation !== g + 1 || !species.isObtainable()) { - continue; - } - starterSpecies.push(species.speciesId); - this.speciesLoaded.set(species.speciesId, false); - this.genSpecies[g].push(species); - const defaultDexAttr = this.scene.gameData.getSpeciesDefaultDexAttr(species, false, true); - const defaultProps = this.scene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); - const position = calcIconPosition(s); - const icon = this.scene.add.sprite(position.x - 2, position.y + 2, species.getIconAtlasKey(defaultProps.formIndex, defaultProps.shiny, defaultProps.variant)); - icon.setScale(0.5); - icon.setOrigin(0, 0); - icon.setFrame(species.getIconId(defaultProps.female, defaultProps.formIndex, defaultProps.shiny, defaultProps.variant)); - this.checkIconId(icon, species, defaultProps.female, defaultProps.formIndex, defaultProps.shiny, defaultProps.variant); - icon.setTint(0); - this.starterSelectGenIconContainers[g].add(icon); - this.iconAnimHandler.addOrUpdate(icon, PokemonIconAnimMode.NONE); - s++; + for (const species of allSpecies) { + if (!speciesStarters.hasOwnProperty(species.speciesId) || !species.isObtainable()) { + continue; } + + starterSpecies.push(species.speciesId); + this.speciesLoaded.set(species.speciesId, false); + this.allSpecies.push(species); + + const starterContainer = new StarterContainer(this.scene, species).setVisible(false); + this.iconAnimHandler.addOrUpdate(starterContainer.icon, PokemonIconAnimMode.NONE); + this.starterContainer.push(starterContainer); + starterBoxContainer.add(starterContainer); } + this.starterSelectContainer.add(starterBoxContainer); + this.starterIcons = new Array(6).fill(null).map((_, i) => { - const icon = this.scene.add.sprite(113, 63 + 13 * i, "pokemon_icons_0"); + const icon = this.scene.add.sprite(292, 63 + 13 * i, "pokemon_icons_0"); icon.setScale(0.5); icon.setOrigin(0, 0); icon.setFrame("unknown"); @@ -487,70 +535,6 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return icon; }); - this.starterValueLabels = new Array(81).fill(null).map((_, i) => { - const position = calcIconPosition(i); - const ret = addTextObject(this.scene, position.x + 152, position.y + 11, "0", TextStyle.WINDOW, { fontSize: "32px" }); - ret.setShadowOffset(2, 2); - ret.setOrigin(0, 0); - ret.setVisible(false); - this.starterSelectContainer.add(ret); - return ret; - }); - - const getShinyStar = (i: integer, v: integer): Phaser.GameObjects.Image => { - const position = calcIconPosition(i); - const ret = this.scene.add.image((position.x - v * 3) + 163, position.y + 11, "shiny_star_small"); - ret.setOrigin(0, 0); - ret.setScale(0.5); - ret.setVisible(false); - this.starterSelectContainer.add(ret); - return ret; - }; - - this.shinyIcons = new Array(81).fill(null).map((_, i) => { - return new Array(3).fill(null).map((_, v) => getShinyStar(i, v)); - }); - - this.hiddenAbilityIcons = new Array(81).fill(null).map((_, i) => { - const position = calcIconPosition(i); - const ret = this.scene.add.image(position.x + 163, position.y + 16, "ha_capsule"); - ret.setOrigin(0, 0); - ret.setScale(0.5); - ret.setVisible(false); - this.starterSelectContainer.add(ret); - return ret; - }); - - this.classicWinIcons = new Array(81).fill(null).map((_, i) => { - const position = calcIconPosition(i); - const ret = this.scene.add.image(position.x + 153, position.y + 21, "champion_ribbon"); - ret.setOrigin(0, 0); - ret.setScale(0.5); - ret.setVisible(false); - this.starterSelectContainer.add(ret); - return ret; - }); - - this.candyUpgradeIcon = new Array(81).fill(null).map((_, i) => { - const position = calcIconPosition(i); - const ret = this.scene.add.image(position.x + 163, position.y + 21, "candy"); - ret.setOrigin(0, 0); - ret.setScale(0.25); - ret.setVisible(false); - this.starterSelectContainer.add(ret); - return ret; - }); - - this.candyUpgradeOverlayIcon = new Array(81).fill(null).map((_, i) => { - const position = calcIconPosition(i); - const ret = this.scene.add.image(position.x + 163, position.y + 21, "candy_overlay"); - ret.setOrigin(0, 0); - ret.setScale(0.25); - ret.setVisible(false); - this.starterSelectContainer.add(ret); - return ret; - }); - 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.starterSelectContainer.add(this.pokemonSprite); @@ -757,12 +741,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { for (let c = 0; c < 3; c++) { let randomSpeciesId: Species; let species: PokemonSpecies; - let pokerusCursor: integer; const generateSpecies = () => { randomSpeciesId = Utils.randSeedItem(starterSpecies); species = getPokemonSpecies(randomSpeciesId); - pokerusCursor = this.genSpecies[species.generation - 1].indexOf(species); }; let dupe = false; @@ -772,17 +754,15 @@ export default class StarterSelectUiHandler extends MessageUiHandler { generateSpecies(); - for (let pc = 0; pc < c; pc++) { - if (this.pokerusGens[pc] === species.generation -1 && this.pokerusCursors[pc] === pokerusCursor) { + for (let ps = 0; ps < c; ps++) { + if (this.pokerusSpecies[ps] === species) { dupe = true; break; } } } while (dupe); - this.pokerusGens.push(species.generation - 1); - this.pokerusCursors.push(pokerusCursor); - this.pokerusCursorObjs[c].setPosition(150 + 18 * (pokerusCursor % 9), 10 + 18 * Math.floor(pokerusCursor / 9)); + this.pokerusSpecies.push(species); } }, 0, date.getTime().toString()); @@ -803,6 +783,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { y: this.scene.game.canvas.height / 6 - MoveInfoOverlay.getHeight(overlayScale) - 29, }); this.starterSelectContainer.add(this.moveInfoOverlay); + this.starterSelectContainer.bringToTop(this.filterBarContainer); this.scene.eventTarget.addEventListener(BattleSceneEventType.CANDY_UPGRADE_NOTIFICATION_CHANGED, (e) => this.onCandyUpgradeDisplayChanged(e)); @@ -821,28 +802,26 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterSelectContainer.setVisible(true); - this.setCursor(0); - this.setGenMode(false); - this.setCursor(0); - this.setGenMode(true); + this.allSpecies.forEach((species, s) => { + const icon = this.starterContainer[s].icon; + const dexEntry = this.scene.gameData.dexData[species.speciesId]; + + if (dexEntry.caughtAttr) { + icon.clearTint(); + } else if (dexEntry.seenAttr) { + icon.setTint(0x808080); + } + + this.setUpgradeAnimation(icon, species); + }); + + this.updateStarters(); + + this.setFilterMode(false); + this.filterBarCursor = 0; this.setCursor(0); this.tryUpdateValue(0); - for (let g = 0; g < this.genSpecies.length; g++) { - this.genSpecies[g].forEach((species, s) => { - const icon = this.starterSelectGenIconContainers[g].getAt(s) as Phaser.GameObjects.Sprite; - const dexEntry = this.scene.gameData.dexData[species.speciesId]; - - if (dexEntry.caughtAttr) { - icon.clearTint(); - } else if (dexEntry.seenAttr) { - icon.setTint(0x808080); - } - - this.setUpgradeAnimation(icon, species); - }); - } - handleTutorial(this.scene, Tutorial.Starter_Select); return true; @@ -931,8 +910,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return; } - const position = calcSpritePosition(this.genSpecies[species.generation - 1].indexOf(species)); - icon.y = position.y; + icon.y = 2; const tweenChain: Phaser.Types.Tweens.TweenChainBuilderConfig = { targets: icon, @@ -943,14 +921,14 @@ export default class StarterSelectUiHandler extends MessageUiHandler { tweens: [ { targets: icon, - y: position.y - 5, + y: 2 - 5, duration: Utils.fixedInt(125), ease: "Cubic.easeOut", yoyo: true }, { targets: icon, - y: position.y - 3, + y: 2 - 3, duration: Utils.fixedInt(150), ease: "Cubic.easeOut", yoyo: true @@ -972,34 +950,29 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } /** - * Sets the visibility of a Candy Upgrade Icon given an index - * @param index The UI index of the icon within this generation container + * Sets the visibility of a Candy Upgrade Icon */ - setUpgradeIcon(index: number): void { - const species = this.genSpecies[this.getGenCursorWithScroll()][index]; + setUpgradeIcon(starter: StarterContainer): void { + const species = starter.species; const slotVisible = !!species?.speciesId; - if (!species // No Pokemon exists at that UI index - || this.scene.candyUpgradeNotification === 0 // Notification setting is 'Off' - || species.speciesId !== species.getRootSpeciesId(false)) { // Pokemon is not the base evolution and can't use candy - // Set all icons as hidden and exit early - this.candyUpgradeIcon[index].setVisible(false); - this.candyUpgradeOverlayIcon[index].setVisible(false); - + if (!species || this.scene.candyUpgradeNotification === 0 || species.speciesId !== species.getRootSpeciesId(false)) { + starter.candyUpgradeIcon.setVisible(false); + starter.candyUpgradeOverlayIcon.setVisible(false); return; } const passiveAvailable = this.isPassiveAvailable(species.speciesId); // 'Only Passive Unlocks' mode if (this.scene.candyUpgradeNotification === 1) { - this.candyUpgradeIcon[index].setVisible(slotVisible && passiveAvailable); - this.candyUpgradeOverlayIcon[index].setVisible(slotVisible && this.candyUpgradeIcon[index].visible); + starter.candyUpgradeIcon.setVisible(slotVisible && passiveAvailable); + starter.candyUpgradeOverlayIcon.setVisible(slotVisible && starter.candyUpgradeIcon.visible); // 'On' mode } else if (this.scene.candyUpgradeNotification === 2) { - this.candyUpgradeIcon[index].setVisible( + starter.candyUpgradeIcon.setVisible( slotVisible && ( passiveAvailable || this.isValueReductionAvailable(species.speciesId))); - this.candyUpgradeOverlayIcon[index].setVisible(slotVisible && this.candyUpgradeIcon[index].visible); + starter.candyUpgradeOverlayIcon.setVisible(slotVisible && starter.candyUpgradeIcon.visible); } } @@ -1015,21 +988,19 @@ export default class StarterSelectUiHandler extends MessageUiHandler { // Loop through all visible candy icons when set to 'Icon' mode if (this.scene.candyUpgradeDisplay === 0) { - this.genSpecies[this.getGenCursorWithScroll()].forEach((_species, s) => { - this.setUpgradeIcon(s); + this.filteredStarterContainers.forEach((starter) => { + this.setUpgradeIcon(starter); }); return; } // Loop through all animations when set to 'Animation' mode - for (let g = 0; g < this.genSpecies.length; g++) { - this.genSpecies[g].forEach((species, s) => { - const icon = this.starterSelectGenIconContainers[g].getAt(s) as Phaser.GameObjects.Sprite; + this.filteredStarterContainers.forEach((starter, s) => { + const icon = this.filteredStarterContainers[s].icon; - this.setUpgradeAnimation(icon, species); - }); - } + this.setUpgradeAnimation(icon, starter.species); + }); } processInput(button: Button): boolean { @@ -1037,6 +1008,19 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return false; } + const numberOfStarters = this.filteredStarterContainers.length; + const numOfRows = Math.ceil(numberOfStarters / 9); + const currentRow = Math.floor(this.cursor / 9); + const onScreenFirstIndex = this.scrollCursor * 9; // this is first starter index on the screen + const onScreenLastIndex = Math.min(onScreenFirstIndex + 9*9, numberOfStarters) - 1; // this is the last starter index on the screen + const onScreenNumberOfStarters = onScreenLastIndex - onScreenFirstIndex + 1; + const onScreenNumberOfRows = Math.ceil(onScreenNumberOfStarters / 9); + // const onScreenFirstRow = Math.floor(onScreenFirstIndex / 9); + const onScreenCurrentRow = Math.floor((this.cursor - onScreenFirstIndex) / 9); + + + // console.log("this.cursor: ", this.cursor, "this.scrollCursor" , this.scrollCursor, "numberOfStarters: ", numberOfStarters, "numOfRows: ", numOfRows, "currentRow: ", currentRow, "onScreenFirstIndex: ", onScreenFirstIndex, "onScreenLastIndex: ", onScreenLastIndex, "onScreenNumberOfStarters: ", onScreenNumberOfStarters, "onScreenNumberOfRow: ", onScreenNumberOfRows, "onScreenCurrentRow: ", onScreenCurrentRow); + const ui = this.getUi(); let success = false; @@ -1049,11 +1033,14 @@ export default class StarterSelectUiHandler extends MessageUiHandler { error = true; } } else if (button === Button.CANCEL) { - if (this.statsMode) { + if (this.filterMode && this.filterBar.openDropDown) { + this.filterBar.toggleDropDown(this.filterBarCursor); + success = true; + } else if (this.statsMode) { this.toggleStatsMode(false); success = true; - } else if (this.starterCursors.length) { - this.popStarter(); + } else if (this.starterSpecies.length) { + this.popStarter(this.starterSpecies.length - 1); success = true; this.updateInstructions(); } else { @@ -1067,7 +1054,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.scene.getCurrentPhase().end(); success = true; } - } else if (this.startCursorObj.visible) { + } else if (this.startCursorObj.visible) { // this checks to see if the start button is selected switch (button) { case Button.ACTION: if (this.tryStart(true)) { @@ -1078,106 +1065,150 @@ export default class StarterSelectUiHandler extends MessageUiHandler { break; case Button.UP: this.startCursorObj.setVisible(false); - this.setGenMode(true); + if (this.starterSpecies.length > 0) { + this.starterIconsCursorIndex = this.starterSpecies.length - 1; + this.moveStarterIconsCursor(this.starterIconsCursorIndex); + } else { + this.setFilterMode(true); + } + success = true; + break; + case Button.DOWN: + this.startCursorObj.setVisible(false); + if (this.starterSpecies.length > 0) { + this.starterIconsCursorIndex = 0; + this.moveStarterIconsCursor(this.starterIconsCursorIndex); + } else { + this.setFilterMode(true); + } success = true; break; case Button.LEFT: this.startCursorObj.setVisible(false); - this.setGenMode(false); - this.setCursor(this.cursor + 8); + this.cursorObj.setVisible(true); + success = this.setCursor(onScreenFirstIndex + (onScreenNumberOfRows-1) * 9 + 8); // set last column success = true; break; case Button.RIGHT: this.startCursorObj.setVisible(false); - this.setGenMode(false); + this.cursorObj.setVisible(true); + success = this.setCursor(onScreenFirstIndex + (onScreenNumberOfRows-1) * 9); // set first column success = true; break; } - } else if (this.genMode) { + } 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.genCursor) { - success = this.setCursor(this.genCursor - 1); + if (this.filterBar.openDropDown) { + success = this.filterBar.decDropDownCursor(); + // else if there is filtered starters + } else if (numberOfStarters > 0) { + this.setFilterMode(false); + this.scrollCursor = Math.max(0,numOfRows - 9); + this.updateScroll(); + const proportion = (this.filterBarCursor + 0.5) / this.filterBar.numFilters; + const targetCol = Math.floor(proportion * 9); + if (numberOfStarters % 9 > targetCol) { + success = this.setCursor(numberOfStarters - (numberOfStarters) % 9 + targetCol); + } else { + success = this.setCursor(Math.max(numberOfStarters - (numberOfStarters) % 9 + targetCol - 9,0)); + } } break; case Button.DOWN: - if (this.genCursor < 2) { - success = this.setCursor(this.genCursor + 1); - } else { - this.startCursorObj.setVisible(true); - this.setGenMode(true); + if (this.filterBar.openDropDown) { + success = this.filterBar.incDropDownCursor(); + } else if (numberOfStarters > 0) { + this.setFilterMode(false); + this.scrollCursor = 0; + this.updateScroll(); + const proportion = this.filterBarCursor / Math.max(1, this.filterBar.numFilters - 1); + this.setCursor(Math.round(proportion * (Math.min(9, numberOfStarters) - 1))); success = true; } break; - case Button.LEFT: - success = this.setGenMode(false); - this.setCursor(this.cursor + 8); - break; - case Button.RIGHT: - success = this.setGenMode(false); + case Button.ACTION: + if (!this.filterBar.openDropDown) { + this.filterBar.toggleDropDown(this.filterBarCursor); + } else { + this.filterBar.toggleOptionState(); + } + success = true; break; } } else { if (button === Button.ACTION) { if (!this.speciesStarterDexEntry?.caughtAttr) { error = true; - } else if (this.starterCursors.length < 6) { - const options = [ - { - label: i18next.t("starterSelectUiHandler:addToParty"), + } else if (this.starterSpecies.length < 6) { // checks to see you have less than 6 pokemon in your party + + let species; + + // this gets the correct generation and pokemon cursor depending on whether you're in the starter screen or the party icons + if (!this.starterIconsCursorObj.visible) { + species = this.filteredStarterContainers[this.cursor].species; + } else { + species = this.starterSpecies[this.starterIconsCursorIndex]; + } + const ui = this.getUi(); + let options = []; + + const [isDupe, removeIndex]: [boolean, number] = this.isInParty(species); // 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); + if (isPartyValid) { + Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, species, isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(species, this.scene.gameData.getSpeciesDefaultDexAttr(species, false, true)), !!(this.starterSpecies.length)); + } else { + Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, species, isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(species, this.scene.gameData.getSpeciesDefaultDexAttr(species, false, true)), !!(this.starterSpecies.length), false, false); + } + + 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(species.speciesId); + if (!isDupe && isValidForChallenge.value && currentPartyValue + newCost <= this.getValueLimit()) { // 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); + + if (!isDupe && isValidForChallenge.value && this.tryUpdateValue(this.scene.gameData.getSpeciesStarterValue(species.speciesId), true)) { + this.addToParty(species); + 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); - let isDupe = false; - for (let s = 0; s < this.starterCursors.length; s++) { - if (this.starterGens[s] === this.getGenCursorWithScroll() && this.starterCursors[s] === this.cursor) { - isDupe = true; - break; - } - } - const species = this.genSpecies[this.getGenCursorWithScroll()][this.cursor]; - - 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.starterGens.length); - - if (!isDupe && isValidForChallenge.value && this.tryUpdateValue(this.scene.gameData.getSpeciesStarterValue(species.speciesId))) { - const cursorObj = this.starterCursorObjs[this.starterCursors.length]; - cursorObj.setVisible(true); - cursorObj.setPosition(this.cursorObj.x, this.cursorObj.y); - const props = this.scene.gameData.getSpeciesDexAttrProps(species, this.dexAttrCursor); - this.starterIcons[this.starterCursors.length].setTexture(species.getIconAtlasKey(props.formIndex, props.shiny, props.variant)); - this.starterIcons[this.starterCursors.length].setFrame(species.getIconId(props.female, props.formIndex, props.shiny, props.variant)); - this.checkIconId(this.starterIcons[this.starterCursors.length], species, props.female, props.formIndex, props.shiny, props.variant); - this.starterGens.push(this.getGenCursorWithScroll()); - this.starterCursors.push(this.cursor); - this.starterAttr.push(this.dexAttrCursor); - this.starterAbilityIndexes.push(this.abilityCursor); - this.starterNatures.push(this.natureCursor as unknown as Nature); - this.starterMovesets.push(this.starterMoveset.slice(0) as StarterMoveset); - if (this.speciesLoaded.get(species.speciesId)) { - getPokemonSpeciesForm(species.speciesId, props.formIndex).cry(this.scene); - } - if (this.starterCursors.length === 6 || this.value === this.getValueLimit()) { - this.tryStart(); - } - this.updateInstructions(); - - /** - * If the user can't select a pokemon anymore, - * go to start button. - */ - if (!this.canAddParty) { - this.startCursorObj.setVisible(true); - this.setGenMode(true); - } - - ui.playSelect(); - } else { - ui.playError(); - } return true; - }, - overrideSound: true - }, + } + }]; + } + + options.push( // this shows the IVs for the pokemon { label: i18next.t("starterSelectUiHandler:toggleIVs"), handler: () => { @@ -1185,9 +1216,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { ui.setMode(Mode.STARTER_SELECT); return true; } - } - ]; - if (this.speciesStarterMoves.length > 1) { + }); + if (this.speciesStarterMoves.length > 1) { // this lets you change the pokemon moves const showSwapOptions = (moveset: StarterMoveset) => { ui.setMode(Mode.STARTER_SELECT).then(() => { ui.showText(i18next.t("starterSelectUiHandler:selectMoveSwapOut"), null, () => { @@ -1268,6 +1298,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } }); } + const starterContainer = this.filteredStarterContainers[this.cursor]; const starterData = this.scene.gameData.starterData[this.lastSpecies.speciesId]; let starterAttributes = this.starterPreferences[this.lastSpecies.speciesId]; if (this.canCycleNature) { @@ -1283,8 +1314,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { handler: () => { // update default nature in starter save data if (!starterAttributes) { - starterAttributes= - this.starterPreferences[this.lastSpecies.speciesId] = {}; + starterAttributes = this.starterPreferences[this.lastSpecies.speciesId] = {}; } starterAttributes.nature = n as unknown as integer; this.clearText(); @@ -1319,7 +1349,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } const candyCount = starterData.candyCount; const passiveAttr = starterData.passiveAttr; - if (passiveAttr & PassiveAttr.UNLOCKED) { + if (passiveAttr & PassiveAttr.UNLOCKED) { // this is for enabling and disabling the passive if (!(passiveAttr & PassiveAttr.ENABLED)) { options.push({ label: i18next.t("starterSelectUiHandler:enablePassive"), @@ -1342,7 +1372,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { }); } } - const showUseCandies = () => { + const showUseCandies = () => { // this lets you use your candies const options = []; if (!(passiveAttr & PassiveAttr.UNLOCKED)) { const passiveCost = getPassiveCandyCount(speciesStarters[this.lastSpecies.speciesId]); @@ -1365,11 +1395,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { // Update the candy upgrade display if (this.isUpgradeIconEnabled() ) { - this.setUpgradeIcon(this.cursor); + this.setUpgradeIcon(starterContainer); } if (this.isUpgradeAnimationEnabled()) { - const genSpecies = this.genSpecies[this.lastSpecies.generation - 1]; - this.setUpgradeAnimation(this.starterSelectGenIconContainers[this.lastSpecies.generation - 1].getAt(genSpecies.indexOf(this.lastSpecies)), this.lastSpecies, true); + this.setUpgradeAnimation(starterContainer.icon, this.lastSpecies, true); } return true; @@ -1397,7 +1426,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return this.scene.reset(true); } }); - this.updateStarterValueLabel(this.cursor); + this.updateStarterValueLabel(starterContainer); this.tryUpdateValue(0); ui.setMode(Mode.STARTER_SELECT); this.scene.playSound("buy"); @@ -1405,11 +1434,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { // If the notification setting is set to 'On', update the candy upgrade display if (this.scene.candyUpgradeNotification === 2) { if (this.isUpgradeIconEnabled() ) { - this.setUpgradeIcon(this.cursor); + this.setUpgradeIcon(starterContainer); } if (this.isUpgradeAnimationEnabled()) { - const genSpecies = this.genSpecies[this.lastSpecies.generation - 1]; - this.setUpgradeAnimation(this.starterSelectGenIconContainers[this.lastSpecies.generation - 1].getAt(genSpecies.indexOf(this.lastSpecies)), this.lastSpecies, true); + this.setUpgradeAnimation(starterContainer.icon, this.lastSpecies, true); } } @@ -1445,17 +1473,6 @@ export default class StarterSelectUiHandler extends MessageUiHandler { ui.setMode(Mode.STARTER_SELECT); this.scene.playSound("buy"); - // If the notification setting is set to 'On', update the candy upgrade display - // if (this.scene.candyUpgradeNotification === 2) { - // if (this.isUpgradeIconEnabled() ) { - // this.setUpgradeIcon(this.cursor); - // } - // if (this.isUpgradeAnimationEnabled()) { - // const genSpecies = this.genSpecies[this.lastSpecies.generation - 1]; - // this.setUpgradeAnimation(this.starterSelectGenIconContainers[this.lastSpecies.generation - 1].getAt(genSpecies.indexOf(this.lastSpecies)), this.lastSpecies, true); - // } - // } - return true; } return false; @@ -1499,15 +1516,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler { success = true; } } else { - const genStarters = this.starterSelectGenIconContainers[this.getGenCursorWithScroll()].getAll().length; - const rows = Math.ceil(genStarters / 9); - const row = Math.floor(this.cursor / 9); const props = this.scene.gameData.getSpeciesDexAttrProps(this.lastSpecies, this.dexAttrCursor); // prepare persistent starter data to store changes let starterAttributes = this.starterPreferences[this.lastSpecies.speciesId]; if (!starterAttributes) { - starterAttributes = - this.starterPreferences[this.lastSpecies.speciesId] = {}; + starterAttributes = this.starterPreferences[this.lastSpecies.speciesId] = {}; } switch (button) { case Button.CYCLE_SHINY: @@ -1561,9 +1574,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { break; } } else if (newAbilityIndex === 1) { - if (abilityAttr & (this.lastSpecies.ability2 ? AbilityAttr.ABILITY_2 : AbilityAttr.ABILITY_HIDDEN)) { - break; + if (this.lastSpecies.ability1 === this.lastSpecies.ability2) { + newAbilityIndex = (newAbilityIndex + 1) % abilityCount; } + break; } else { if (abilityAttr & AbilityAttr.ABILITY_HIDDEN) { break; @@ -1605,6 +1619,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } } while (newVariant !== props.variant); + starterAttributes.variant = newVariant; // store the selected variant this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, newVariant, undefined, undefined); // Cycle tint based on current sprite tint const tint = getVariantTint(newVariant); @@ -1614,51 +1629,117 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } break; case Button.UP: - if (row) { - success = this.setCursor(this.cursor - 9); - } else { - // when strictly opposite starter based on rows length - // does not exits, set cursor on the second to last row - if (this.cursor + (rows - 1) * 9 > genStarters - 1) { - success = this.setCursor(this.cursor + (rows - 2) * 9); + if (!this.starterIconsCursorObj.visible) { + if (currentRow > 0) { + if (this.scrollCursor > 0 && currentRow - this.scrollCursor === 0) { + this.scrollCursor--; + this.updateScroll(); + } + success = this.setCursor(this.cursor - 9); } else { - success = this.setCursor(this.cursor + (rows - 1) * 9); + this.filterBarCursor = this.filterBar.getNearestFilter(this.filteredStarterContainers[this.cursor]); + this.setFilterMode(true); + success = true; } + } else { + if (this.starterIconsCursorIndex === 0) { + this.starterIconsCursorObj.setVisible(false); + this.setSpecies(null); + this.startCursorObj.setVisible(true); + } else { + this.starterIconsCursorIndex--; + this.moveStarterIconsCursor(this.starterIconsCursorIndex); + } + success = true; } break; case Button.DOWN: - if (row < rows - 2 || (row < rows - 1 && this.cursor % 9 <= (genStarters - 1) % 9)) { - success = this.setCursor(this.cursor + 9); - } else { - // if there is no starter below while being on the second to - // last row, adjust cursor position with one line less - if (row === rows - 2 && this.cursor + 9 > genStarters - 1) { - success = this.setCursor(this.cursor - (rows - 2) * 9); - } else { - success = this.setCursor(this.cursor - (rows - 1) * 9); + if (!this.starterIconsCursorObj.visible) { + 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 { // last row + this.setFilterMode(true); + success = true; } + } else { + if (this.starterIconsCursorIndex <= this.starterSpecies.length - 2) { + this.starterIconsCursorIndex++; + this.moveStarterIconsCursor(this.starterIconsCursorIndex); + } else { + this.starterIconsCursorObj.setVisible(false); + this.setSpecies(null); + this.startCursorObj.setVisible(true); + } + success = true; } break; case Button.LEFT: - if (this.cursor % 9) { - success = this.setCursor(this.cursor - 1); - } else { - if (row >= Math.min(5, rows - 1)) { - this.startCursorObj.setVisible(true); + if (!this.starterIconsCursorObj.visible) { + if (this.cursor % 9 !== 0) { + success = this.setCursor(this.cursor - 1); + } else { + if (this.starterSpecies.length === 0) { + // just wrap around to the last column + success = this.setCursor(this.cursor + Math.min(8, numberOfStarters - this.cursor)); + } else if (onScreenCurrentRow < 3) { + // always to the first starter + this.cursorObj.setVisible(false); + this.starterIconsCursorIndex = 0; + this.moveStarterIconsCursor(this.starterIconsCursorIndex); + } else if (onScreenCurrentRow < 7) { + this.cursorObj.setVisible(false); + this.starterIconsCursorIndex = Math.min(onScreenCurrentRow-2, this.starterSpecies.length - 1); + this.moveStarterIconsCursor(this.starterIconsCursorIndex); + } else { + this.cursorObj.setVisible(false); + this.setSpecies(null); + this.startCursorObj.setVisible(true); + } + success = true; } - success = this.setGenMode(true); + } else { + this.starterIconsCursorObj.setVisible(false); + this.cursorObj.setVisible(true); + success = this.setCursor(Math.min(onScreenFirstIndex + (this.starterIconsCursorIndex + 2) * 9 + 8,onScreenLastIndex)); // set last column } break; case Button.RIGHT: - if (this.cursor % 9 < (row < rows - 1 ? 8 : (genStarters - 1) % 9)) { - success = this.setCursor(this.cursor + 1); - } else { - if (row >= Math.min(5, rows - 1)) { - this.startCursorObj.setVisible(true); + if (!this.starterIconsCursorObj.visible) { + // is not right edge + if (this.cursor % 9 < (currentRow < numOfRows - 1 ? 8 : (numberOfStarters - 1) % 9)) { + success = this.setCursor(this.cursor + 1); + } else { + // in right edge + if (this.starterSpecies.length === 0) { + // just wrap around to the first column + success = this.setCursor(this.cursor - Math.min(8, this.cursor % 9)); + } else if (onScreenCurrentRow < 3) { + // always to the first starter + this.cursorObj.setVisible(false); + this.starterIconsCursorIndex = 0; + this.moveStarterIconsCursor(this.starterIconsCursorIndex); + } else if (onScreenCurrentRow < 7) { + this.cursorObj.setVisible(false); + this.starterIconsCursorIndex = Math.min(onScreenCurrentRow-2, this.starterSpecies.length - 1); + this.moveStarterIconsCursor(this.starterIconsCursorIndex); + } else { + this.cursorObj.setVisible(false); + this.setSpecies(null); + this.startCursorObj.setVisible(true); + } + success = true; } - success = this.setGenMode(true); + break; + } else { + this.starterIconsCursorObj.setVisible(false); + this.cursorObj.setVisible(true); + success = this.setCursor(Math.min(onScreenFirstIndex + (this.starterIconsCursorIndex + 2) * 9, onScreenLastIndex - (onScreenLastIndex % 9))); // set first column + break; } - break; } } } @@ -1672,6 +1753,38 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return success || error; } + isInParty(species: PokemonSpecies): [boolean, number] { + let removeIndex = 0; + let isDupe = false; + for (let s = 0; s < this.starterSpecies.length; s++) { + if (this.starterSpecies[s] === species) { + isDupe = true; + removeIndex = s; + break; + } + } + return [isDupe, removeIndex]; + } + + addToParty(species: PokemonSpecies) { + const cursorObj = this.starterCursorObjs[this.starterSpecies.length]; + cursorObj.setVisible(true); + cursorObj.setPosition(this.cursorObj.x, this.cursorObj.y); + const props = this.scene.gameData.getSpeciesDexAttrProps(species, this.dexAttrCursor); + 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(this.dexAttrCursor); + this.starterAbilityIndexes.push(this.abilityCursor); + this.starterNatures.push(this.natureCursor as unknown as Nature); + this.starterMovesets.push(this.starterMoveset.slice(0) as StarterMoveset); + if (this.speciesLoaded.get(species.speciesId)) { + getPokemonSpeciesForm(species.speciesId, props.formIndex).cry(this.scene); + } + this.updateInstructions(); + } + switchMoveHandler(i: number, newMove: Moves, move: Moves) { const speciesId = this.lastSpecies.speciesId; const existingMoveIndex = this.starterMoveset.indexOf(newMove); @@ -1704,6 +1817,16 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.scene.gameData.starterData[speciesId].moveset = this.starterMoveset.slice(0) as StarterMoveset; } this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, undefined, undefined, false); + + // switch moves of starter if exists + if (this.starterMovesets.length) { + Array.from({ length: this.starterSpecies.length }, (_, i) => { + const starterSpecies = this.starterSpecies[i]; + if (starterSpecies.speciesId === speciesId) { + this.starterMovesets[i] = this.starterMoveset; + } + }); + } } updateButtonIcon(iconSetting, gamepadType, iconElement, controlLabel): void { @@ -1800,131 +1923,244 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return valueLimit.value; } + updateStarters = () => { + this.scrollCursor = 0; + this.filteredStarterContainers = []; + + this.pokerusCursorObjs.forEach(cursor => cursor.setVisible(false)); + this.starterCursorObjs.forEach(cursor => cursor.setVisible(false)); + + this.filterBar.updateFilterLabels(); + + // filter + this.starterContainer.forEach(container => { + container.setVisible(false); + + // First, ensure you have the caught attributes for the species else default to bigint 0 + const caughtVariants = this.scene.gameData.dexData[container.species.speciesId]?.caughtAttr || BigInt(0); + + // Define the variables based on whether their respective variants have been caught + const isVariant3Caught = !!(caughtVariants & DexAttr.VARIANT_3); + const isVariant2Caught = !!(caughtVariants & DexAttr.VARIANT_2); + const isVariantCaught = !!(caughtVariants & DexAttr.SHINY); + const isCaught = !!(caughtVariants & DexAttr.NON_SHINY); + const isUncaught = !isCaught && !isVariantCaught && !isVariant2Caught && !isVariant3Caught; + const isPassiveUnlocked = this.scene.gameData.starterData[container.species.speciesId].passiveAttr > 0; + + + const fitsGen = this.filterBar.getVals(DropDownColumn.GEN).includes(container.species.generation); + const fitsType = this.filterBar.getVals(DropDownColumn.TYPES).some(type => container.species.isOfType((type as number) - 1)); + const fitsShiny = this.filterBar.getVals(DropDownColumn.UNLOCKS).some(variant => { + if (variant === "SHINY3") { + return isVariant3Caught; + } else if (variant === "SHINY2") { + return isVariant2Caught && !isVariant3Caught; + } else if (variant === "SHINY") { + return isVariantCaught && !isVariant2Caught && !isVariant3Caught; + } else if (variant === "NORMAL") { + return isCaught && !isVariantCaught && !isVariant2Caught && !isVariant3Caught; + } else if (variant === "UNCAUGHT") { + return isUncaught; + } + }); + const fitsPassive = this.filterBar.getVals(DropDownColumn.UNLOCKS).some(variant => { + if (variant === "PASSIVEUNLOCKED") { + return isPassiveUnlocked; + } else if (variant === "PASSIVELOCKED") { + return !isPassiveUnlocked; + } + }); + const isWin = this.scene.gameData.starterData[container.species.speciesId].classicWinCount > 0; + const isNotWin = this.scene.gameData.starterData[container.species.speciesId].classicWinCount === 0; + const isUndefined = this.scene.gameData.starterData[container.species.speciesId].classicWinCount === undefined; + + const fitsWin = this.filterBar.getVals(DropDownColumn.WIN).some(win => { + if (win === "WIN") { + return isWin; + } else if (win === "NOTWIN") { + return isNotWin || isUndefined; + } + }); + + if (fitsGen && fitsType && fitsShiny && fitsPassive && fitsWin) { + this.filteredStarterContainers.push(container); + } + }); + + this.starterSelectScrollBar.setPages(Math.ceil((this.filteredStarterContainers.length - 81) / 9) + 1); + this.starterSelectScrollBar.setPage(0); + + // sort + const sort = this.filterBar.getVals(DropDownColumn.SORT)[0]; + this.filteredStarterContainers.sort((a, b) => { + switch (sort.val) { + default: + break; + case 0: + return (a.species.speciesId - b.species.speciesId) * -sort.dir; + case 1: + return (a.cost - b.cost) * -sort.dir; + case 2: + const candyCountA = this.scene.gameData.starterData[a.species.speciesId].candyCount; + const candyCountB = this.scene.gameData.starterData[b.species.speciesId].candyCount; + return (candyCountA - candyCountB) * -sort.dir; + case 3: + 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; + return (avgIVsA - avgIVsB) * -sort.dir; + case 4: + return a.species.name.localeCompare(b.species.name) * -sort.dir; + } + return 0; + }); + + this.updateScroll(); + }; + + updateScroll = () => { + const perRow = 9; + const maxRows = 9; + + this.starterSelectScrollBar.setPage(this.scrollCursor); + + let pokerusCursorIndex = 0; + this.filteredStarterContainers.forEach((container, i) => { + const pos = calcStarterPosition(i, this.scrollCursor); + container.setPosition(pos.x, pos.y); + + if (i < (maxRows + this.scrollCursor) * perRow && i >= this.scrollCursor * perRow) { + container.setVisible(true); + } else { + container.setVisible(false); + } + + if (this.pokerusSpecies.includes(container.species)) { + this.pokerusCursorObjs[pokerusCursorIndex].setPosition(pos.x - 1, pos.y + 1); + + if (i < (maxRows + this.scrollCursor) * perRow && i >= this.scrollCursor * perRow) { + this.pokerusCursorObjs[pokerusCursorIndex].setVisible(true); + } else { + this.pokerusCursorObjs[pokerusCursorIndex].setVisible(false); + } + pokerusCursorIndex++; + } + + if (this.starterSpecies.includes(container.species)) { + this.starterCursorObjs[this.starterSpecies.indexOf(container.species)].setPosition(pos.x - 1, pos.y + 1); + + if (i < (maxRows + this.scrollCursor) * perRow && i >= this.scrollCursor * perRow) { + this.starterCursorObjs[this.starterSpecies.indexOf(container.species)].setVisible(true); + } else { + this.starterCursorObjs[this.starterSpecies.indexOf(container.species)].setVisible(false); + } + } + + 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)) + : []; + 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(!!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); + + // '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); + } + }); + }; + setCursor(cursor: integer): boolean { let changed = false; - if (this.genMode) { - changed = this.genCursor !== cursor; + if (this.filterMode) { + changed = this.filterBarCursor !== cursor; + this.filterBarCursor = cursor; - let genCursorWithScroll = this.getGenCursorWithScroll(); - - if (!cursor && this.genScrollCursor) { - this.genScrollCursor--; - cursor++; - this.updateGenOptions(); - } else if (cursor === 2 && this.genScrollCursor < gens.length - 3) { - this.genScrollCursor++; - cursor--; - this.updateGenOptions(); - } - - if (genCursorWithScroll !== undefined) { - this.starterSelectGenIconContainers[genCursorWithScroll].setVisible(false); - } - this.cursor = 0; - this.genCursor = cursor; - genCursorWithScroll = this.getGenCursorWithScroll(); - this.genCursorObj.setY(5 + 17 * this.genCursor); - this.genCursorHighlightObj.setY(this.genCursorObj.y); - this.starterSelectGenIconContainers[genCursorWithScroll].setVisible(true); - - for (let s = 0; s < this.starterCursorObjs.length; s++) { - this.starterCursorObjs[s].setVisible(this.starterGens[s] === genCursorWithScroll); - } - for (let s = 0; s < this.pokerusCursorObjs.length; s++) { - this.pokerusCursorObjs[s].setVisible(this.pokerusGens[s] === genCursorWithScroll); - } - - const genLimit = this.genSpecies[genCursorWithScroll].length; - for (let s = 0; s < 81; s++) { - const speciesId = s < genLimit ? this.genSpecies[genCursorWithScroll][s].speciesId : 0 as Species; - const slotVisible = !!speciesId; - if (slotVisible) { - this.updateStarterValueLabel(s); - } - this.starterValueLabels[s].setVisible(slotVisible); - 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)) - : []; - for (let v = 0; v < 3; v++) { - const hasVariant = speciesVariants.length > v; - this.shinyIcons[s][v].setVisible(slotVisible && hasVariant); - if (hasVariant) { - this.shinyIcons[s][v].setTint(getVariantTint(speciesVariants[v] === DexAttr.DEFAULT_VARIANT ? 0 : speciesVariants[v] === DexAttr.VARIANT_2 ? 1 : 2)); - } - } - this.hiddenAbilityIcons[s].setVisible(slotVisible && !!this.scene.gameData.dexData[speciesId].caughtAttr && !!(this.scene.gameData.starterData[speciesId].abilityAttr & 4)); - this.classicWinIcons[s].setVisible(slotVisible && this.scene.gameData.starterData[speciesId].classicWinCount > 0); - - // '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 - this.candyUpgradeIcon[s].setTint(argbFromRgba(Utils.rgbHexToRgba(starterColors[speciesId][0]))); - this.candyUpgradeOverlayIcon[s].setTint(argbFromRgba(Utils.rgbHexToRgba(starterColors[speciesId][1]))); - - this.setUpgradeIcon(s); - } else if (this.scene.candyUpgradeDisplay === 1) { - this.candyUpgradeIcon[s].setVisible(false); - this.candyUpgradeOverlayIcon[s].setVisible(false); - } - } + this.filterBar.setCursor(cursor); } else { + cursor = Math.max(Math.min(this.filteredStarterContainers.length - 1, cursor),0); changed = super.setCursor(cursor); - this.cursorObj.setPosition(150 + 18 * (cursor % 9), 10 + 18 * Math.floor(cursor / 9)); + const pos = calcStarterPosition(cursor, this.scrollCursor); + this.cursorObj.setPosition(pos.x - 1, pos.y + 1); - const species = this.genSpecies[this.getGenCursorWithScroll()][cursor]; + const species = this.filteredStarterContainers[cursor]?.species; - const defaultDexAttr = this.scene.gameData.getSpeciesDefaultDexAttr(species, false, true); - const defaultProps = this.scene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); - const variant = defaultProps.variant; - const tint = getVariantTint(variant); - this.pokemonShinyIcon.setFrame(getVariantIcon(variant)); - this.pokemonShinyIcon.setTint(tint); - this.setSpecies(species); - this.updateInstructions(); + if (species) { + const defaultDexAttr = this.scene.gameData.getSpeciesDefaultDexAttr(species, false, true); + const defaultProps = this.scene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); + const variant = defaultProps.variant; + const tint = getVariantTint(variant); + this.pokemonShinyIcon.setFrame(getVariantIcon(variant)); + this.pokemonShinyIcon.setTint(tint); + this.setSpecies(species); + this.updateInstructions(); + } else { + console.warn("Species is undefined for cursor position", cursor); + this.setFilterMode(true); + } } return changed; } getGenCursorWithScroll(): integer { - return this.genCursor !== undefined - ? this.genCursor + this.genScrollCursor - : undefined; + return undefined; + // return this.genCursor !== undefined + // ? this.genCursor + this.genScrollCursor + // : undefined; } updateGenOptions(): void { - let text = ""; - for (let g = this.genScrollCursor; g <= this.genScrollCursor + 2; g++) { - let optionText = ""; - if (g === this.genScrollCursor && this.genScrollCursor) { - optionText = "↑"; - } else if (g === this.genScrollCursor + 2 && this.genScrollCursor < gens.length - 3) { - optionText = "↓"; - } else { - optionText = i18next.t(`starterSelectUiHandler:gen${g + 1}`); - } - text += `${text ? "\n" : ""}${optionText}`; - } - this.genOptionsText.setText(text); + // let text = ""; + // for (let g = this.genScrollCursor; g <= this.genScrollCursor + 2; g++) { + // let optionText = ""; + // if (g === this.genScrollCursor && this.genScrollCursor) { + // optionText = "↑"; + // } else if (g === this.genScrollCursor + 2 && this.genScrollCursor < gens.length - 3) { + // optionText = "↓"; + // } else { + // optionText = i18next.t(`starterSelectUiHandler:gen${g + 1}`); + // } + // text += `${text ? "\n" : ""}${optionText}`; + // } + // this.genOptionsText.setText(text); } - setGenMode(genMode: boolean): boolean { - this.genCursorObj.setVisible(genMode && !this.startCursorObj.visible); - this.cursorObj.setVisible(!genMode && !this.startCursorObj.visible); + setFilterMode(filterMode: boolean): boolean { + // this.genCursorObj.setVisible(!filterMode); + this.cursorObj.setVisible(!filterMode); + this.filterBar.cursorObj.setVisible(filterMode); - if (genMode !== this.genMode) { - this.genMode = genMode; - - this.setCursor(genMode ? this.genCursor : this.cursor); - if (genMode) { + if (filterMode !== this.filterMode) { + this.filterMode = filterMode; + this.setCursor(filterMode ? this.filterBarCursor : this.cursor); + if (filterMode) { this.setSpecies(null); } @@ -1934,7 +2170,17 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return false; } - + moveStarterIconsCursor(index: number): void { + this.starterIconsCursorObj.x = this.starterIcons[index].x + this.starterIconsCursorXOffset; + this.starterIconsCursorObj.y = this.starterIcons[index].y + this.starterIconsCursorYOffset; + if (this.starterSpecies.length > 0) { + this.starterIconsCursorObj.setVisible(true); + this.setSpecies(this.starterSpecies[index]); + } else { + this.starterIconsCursorObj.setVisible(false); + this.setSpecies(null); + } + } setSpecies(species: PokemonSpecies) { this.speciesStarterDexEntry = species ? this.scene.gameData.dexData[species.speciesId] : null; @@ -2009,14 +2255,13 @@ export default class StarterSelectUiHandler extends MessageUiHandler { if (this.lastSpecies) { const dexAttr = this.scene.gameData.getSpeciesDefaultDexAttr(this.lastSpecies, false, true); const props = this.scene.gameData.getSpeciesDexAttrProps(this.lastSpecies, dexAttr); - const lastSpeciesIcon = (this.starterSelectGenIconContainers[this.lastSpecies.generation - 1].getAt(this.genSpecies[this.lastSpecies.generation - 1].indexOf(this.lastSpecies)) as Phaser.GameObjects.Sprite); - lastSpeciesIcon.setTexture(this.lastSpecies.getIconAtlasKey(props.formIndex, props.shiny, props.variant), this.lastSpecies.getIconId(props.female, props.formIndex, props.shiny, props.variant)); + const speciesIndex = this.allSpecies.indexOf(this.lastSpecies); + const lastSpeciesIcon = this.starterContainer[speciesIndex].icon; this.checkIconId(lastSpeciesIcon, this.lastSpecies, props.female, props.formIndex, props.shiny, props.variant); this.iconAnimHandler.addOrUpdate(lastSpeciesIcon, PokemonIconAnimMode.NONE); // Resume the animation for the previously selected species - const speciesIndex = this.genSpecies[this.lastSpecies.generation - 1].indexOf(this.lastSpecies); - const icon = this.starterSelectGenIconContainers[this.lastSpecies.generation - 1].getAt(speciesIndex) as Phaser.GameObjects.Sprite; + const icon = this.starterContainer[speciesIndex].icon; this.scene.tweens.getTweensOf(icon).forEach(tween => tween.resume()); } @@ -2111,30 +2356,21 @@ export default class StarterSelectUiHandler extends MessageUiHandler { // Pause the animation when the species is selected - const speciesIndex = this.genSpecies[species.generation - 1].indexOf(species); - const icon = this.starterSelectGenIconContainers[species.generation - 1].getAt(speciesIndex) as Phaser.GameObjects.Sprite; + const speciesIndex = this.allSpecies.indexOf(species); + const icon = this.starterContainer[speciesIndex].icon; if (this.isUpgradeAnimationEnabled()) { this.scene.tweens.getTweensOf(icon).forEach(tween => tween.pause()); // Reset the position of the icon - const position = calcSpritePosition(speciesIndex); - icon.x = position.x; - icon.y = position.y; + icon.x = -2; + icon.y = 2; } // Initiates the small up and down idle animation this.iconAnimHandler.addOrUpdate(icon, PokemonIconAnimMode.PASSIVE); let starterIndex = -1; - - this.starterGens.every((g, i) => { - const starterSpecies = this.genSpecies[g][this.starterCursors[i]]; - if (starterSpecies.speciesId === species.speciesId) { - starterIndex = i; - return false; - } - return true; - }); + starterIndex = this.starterSpecies.indexOf(species); let props: DexAttrProps; @@ -2162,7 +2398,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.setTypeIcons(speciesForm.type1, speciesForm.type2); this.pokemonSprite.clearTint(); - if (this.pokerusCursors.find((cursor: integer, i: integer) => cursor === this.cursor && this.pokerusGens[i] === this.getGenCursorWithScroll())) { + if (this.pokerusSpecies.includes(species)) { handleTutorial(this.scene, Tutorial.Pokerus); } } else { @@ -2288,15 +2524,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { if (forSeen ? this.speciesStarterDexEntry?.seenAttr : this.speciesStarterDexEntry?.caughtAttr) { let starterIndex = -1; - - this.starterGens.every((g, i) => { - const starterSpecies = this.genSpecies[g][this.starterCursors[i]]; - if (starterSpecies.speciesId === species.speciesId) { - starterIndex = i; - return false; - } - return true; - }); + starterIndex = this.starterSpecies.indexOf(species); if (starterIndex > -1) { this.starterAttr[starterIndex] = this.dexAttrCursor; @@ -2322,14 +2550,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const isValidForChallenge = new Utils.BooleanHolder(true); - const currentPartyValue = this.starterGens.reduce((total: number, gen: number, i: number) => total += this.scene.gameData.getSpeciesStarterValue(this.genSpecies[gen][this.starterCursors[i]].speciesId), 0); - const cursorCost = this.scene.gameData.getSpeciesStarterValue(species.speciesId); - const isValidNextPartyValue = (currentPartyValue + cursorCost) <= this.getValueLimit(); - Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, species, isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(species, this.dexAttrCursor), this.starterGens.length); - const starterSprite = this.starterSelectGenIconContainers[this.getGenCursorWithScroll()].getAt(this.cursor) as Phaser.GameObjects.Sprite; + Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, species, isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(species, this.dexAttrCursor), !!this.starterSpecies.length); + const starterSprite = this.filteredStarterContainers[this.cursor].icon as Phaser.GameObjects.Sprite; starterSprite.setTexture(species.getIconAtlasKey(formIndex, shiny, variant), species.getIconId(female, formIndex, shiny, variant)); - starterSprite.setAlpha(isValidForChallenge.value && isValidNextPartyValue ? 1 : 0.375); - this.checkIconId((this.starterSelectGenIconContainers[this.getGenCursorWithScroll()].getAt(this.cursor) as Phaser.GameObjects.Sprite), species, female, formIndex, shiny, variant); + this.filteredStarterContainers[this.cursor].checkIconId(female, formIndex, shiny, variant); this.canCycleShiny = !!(dexEntry.caughtAttr & DexAttr.NON_SHINY && dexEntry.caughtAttr & DexAttr.SHINY); this.canCycleGender = !!(dexEntry.caughtAttr & DexAttr.MALE && dexEntry.caughtAttr & DexAttr.FEMALE); this.canCycleAbility = [ abilityAttr & AbilityAttr.ABILITY_1, (abilityAttr & AbilityAttr.ABILITY_2) && species.ability2, abilityAttr & AbilityAttr.ABILITY_HIDDEN ].filter(a => a).length > 1; @@ -2398,14 +2622,16 @@ export default class StarterSelectUiHandler extends MessageUiHandler { }) as StarterMoveset; const speciesForm = getPokemonSpeciesForm(species.speciesId, formIndex); + const formText = Utils.capitalizeString(species?.forms[formIndex]?.formKey, "-", false, false); - const formText = species?.forms[formIndex]?.formKey.split("-"); - for (let i = 0; i < formText?.length; i++) { - formText[i] = formText[i].charAt(0).toUpperCase() + formText[i].substring(1); + 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}`) : ""); } - this.pokemonFormText.setText(formText?.join(" ")); - this.setTypeIcons(speciesForm.type1, speciesForm.type2); } else { this.pokemonAbilityText.setText(""); @@ -2467,28 +2693,54 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } - popStarter(): void { - this.starterGens.pop(); - this.starterCursors.pop(); - this.starterAttr.pop(); - this.starterAbilityIndexes.pop(); - this.starterNatures.pop(); - this.starterMovesets.pop(); - this.starterCursorObjs[this.starterCursors.length].setVisible(false); - this.starterIcons[this.starterCursors.length].setTexture("pokemon_icons_0"); - this.starterIcons[this.starterCursors.length].setFrame("unknown"); + popStarter(index: number): void { + this.starterSpecies.splice(index, 1); + this.starterAttr.splice(index, 1); + this.starterAbilityIndexes.splice(index, 1); + this.starterNatures.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.scene.gameData.getSpeciesDefaultDexAttr(species, false, true); + const props = this.scene.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)); + if (s >= index) { + this.starterCursorObjs[s].setPosition(this.starterCursorObjs[s + 1].x, this.starterCursorObjs[s + 1].y); + this.starterCursorObjs[s].setVisible(this.starterCursorObjs[s + 1].visible); + } + } + this.starterCursorObjs[this.starterSpecies.length].setVisible(false); + this.starterIcons[this.starterSpecies.length].setTexture("pokemon_icons_0"); + this.starterIcons[this.starterSpecies.length].setFrame("unknown"); + + if (this.starterIconsCursorObj.visible) { + if (this.starterIconsCursorIndex === this.starterSpecies.length) { + if (this.starterSpecies.length > 0) { + this.starterIconsCursorIndex--; + } else { + this.starterIconsCursorObj.setVisible(false); + this.setSpecies(null); + this.setFilterMode(true); + } + } + this.moveStarterIconsCursor(this.starterIconsCursorIndex); + } + this.tryUpdateValue(); } - updateStarterValueLabel(cursor: integer): void { - const speciesId = this.genSpecies[this.getGenCursorWithScroll()][cursor].speciesId; + updateStarterValueLabel(starter: StarterContainer): void { + const speciesId = starter.species.speciesId; const baseStarterValue = speciesStarters[speciesId]; const starterValue = this.scene.gameData.getSpeciesStarterValue(speciesId); + starter.cost = starterValue; let valueStr = starterValue.toString(); if (valueStr.startsWith("0.")) { valueStr = valueStr.slice(1); } - this.starterValueLabels[cursor].setText(valueStr); + starter.label.setText(valueStr); let textStyle: TextStyle; switch (baseStarterValue - starterValue) { case 0: @@ -2502,12 +2754,14 @@ export default class StarterSelectUiHandler extends MessageUiHandler { textStyle = TextStyle.SUMMARY_GOLD; break; } - this.starterValueLabels[cursor].setColor(this.getTextColor(textStyle)); - this.starterValueLabels[cursor].setShadowColor(this.getTextColor(textStyle, true)); + if (baseStarterValue - starterValue > 0) { + starter.label.setColor(this.getTextColor(textStyle)); + starter.label.setShadowColor(this.getTextColor(textStyle, true)); + } } - tryUpdateValue(add?: integer): boolean { - const value = this.starterGens.reduce((total: integer, gen: integer, i: integer) => total += this.scene.gameData.getSpeciesStarterValue(this.genSpecies[gen][this.starterCursors[i]].speciesId), 0); + 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); const newValue = value + (add || 0); const valueLimit = this.getValueLimit(); const overLimit = newValue > valueLimit; @@ -2522,45 +2776,67 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.scene.time.delayedCall(Utils.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); + const species = this.filteredStarterContainers[this.cursor].species; + Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, species, isNewPokemonValid, this.scene.gameData.getSpeciesDexAttrProps(species, this.scene.gameData.getSpeciesDefaultDexAttr(species, false, true)), !!(this.starterSpecies.length), false, 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 g = 0; g < this.genSpecies.length; g++) { - for (let s = 0; s < this.genSpecies[g].length; s++) { - /** Cost of pokemon species */ - const speciesStarterValue = this.scene.gameData.getSpeciesStarterValue(this.genSpecies[g][s].speciesId); - /** Used to detect if this pokemon is registered in starter */ - const speciesStarterDexEntry = this.scene.gameData.dexData[this.genSpecies[g][s].speciesId]; - /** {@linkcode Phaser.GameObjects.Sprite} object of Pokémon for setting the alpha value */ - const speciesSprite = this.starterSelectGenIconContainers[g].getAt(s) as Phaser.GameObjects.Sprite; + 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]; + /** {@linkcode Phaser.GameObjects.Sprite} object of Pokémon for setting the alpha value */ + const speciesSprite = this.starterContainer[s].icon; - /** - * If remainValue greater than or equal pokemon species and the pokemon is legal for this challenge, the user can select. - * so that the alpha value of pokemon sprite set 1. - * - * 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.genSpecies[g][s], isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(this.genSpecies[g][s], this.scene.gameData.getSpeciesDefaultDexAttr(this.genSpecies[g][s], false, true)), this.starterGens.length + (add ? 1 : 0)); + /** + * If remainValue greater than or equal pokemon species and the pokemon is legal for this challenge, the user can select. + * so that the alpha value of pokemon sprite set 1. + * + * However, if isPartyValid is false, that means none of the party members are valid for the run. In this case, we should + * check the challenge to make sure evolutions and forms aren't being checked for mono type runs. + * This will let us set the sprite's alpha to show it can't be selected + * + * 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); + if (isPartyValid) { // we have two checks here - one for the party being valid and one for not. This comes from mono type challenges - if the party is valid it will check pokemon's evolutions and forms, and if it's not valid it won't check their evolutions and forms + Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, this.allSpecies[s], isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(this.allSpecies[s], this.scene.gameData.getSpeciesDefaultDexAttr(this.allSpecies[s], false, true)), !!(this.starterSpecies.length + (add ? 1 : 0))); + } else { + Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, this.allSpecies[s], isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(this.allSpecies[s], this.scene.gameData.getSpeciesDefaultDexAttr(this.allSpecies[s], false, true)), !!(this.starterSpecies.length + (add ? 1 : 0)), false, false); + } - const canBeChosen = remainValue >= speciesStarterValue && isValidForChallenge.value; + const canBeChosen = remainValue >= speciesStarterValue && isValidForChallenge.value; - if (canBeChosen) { - speciesSprite.setAlpha(1); - if (speciesStarterDexEntry?.caughtAttr) { - this.canAddParty = true; - } - } else { - /** - * If it can't be chosen, the user can't select. - * so that the alpha value of pokemon sprite set 0.375. - */ - speciesSprite.setAlpha(0.375); + 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 + */ + 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. + * so that the alpha value of pokemon sprite set 0.375. + */ + speciesSprite.setAlpha(0.375); } } @@ -2569,7 +2845,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } tryStart(manualTrigger: boolean = false): boolean { - if (!this.starterGens.length) { + if (!this.starterSpecies.length) { return false; } @@ -2578,39 +2854,60 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const cancel = () => { ui.setMode(Mode.STARTER_SELECT); if (!manualTrigger) { - this.popStarter(); + this.popStarter(this.starterSpecies.length - 1); } this.clearText(); }; - 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(new Array(this.starterGens.length).fill(0).map(function (_, i) { - const starterSpecies = thisObj.genSpecies[thisObj.starterGens[i]][thisObj.starterCursors[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: !![ 0, 1, 2 ].filter(n => thisObj.pokerusGens[n] === starterSpecies.generation - 1 && thisObj.pokerusCursors[n] === thisObj.genSpecies[starterSpecies.generation - 1].indexOf(starterSpecies)).length - }; - })); - }; - startRun(); - }, cancel, null, null, 19); - }); + const canStart = this.isPartyValid(); + 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(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) + }; + })); + }; + 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(null, 0, () => handler.tutorialActive = false), null, 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 species = this.starterSpecies[s]; + Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_CHOICE, species, isValidForChallenge, this.scene.gameData.getSpeciesDexAttrProps(species, this.dexAttrCursor), !!(this.starterSpecies.length), false, false); + canStart = canStart || isValidForChallenge.value; + } + return canStart; + } + toggleStatsMode(on?: boolean): void { if (on === undefined) { on = !this.statsMode; @@ -2666,8 +2963,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.starterSelectContainer.setVisible(false); this.blockInput = false; - while (this.starterCursors.length) { - this.popStarter(); + while (this.starterSpecies.length) { + this.popStarter(this.starterSpecies.length - 1); } if (this.statsMode) { diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts index ae94951bc4c..405429fcd3f 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -15,7 +15,7 @@ import { Stat, getStatName } from "../data/pokemon-stat"; import { PokemonHeldItemModifier } from "../modifier/modifier"; import { StatusEffect } from "../data/status-effect"; import { getBiomeName } from "../data/biomes"; -import { getNatureName, getNatureStatMultiplier } from "../data/nature"; +import { Nature, getNatureName, getNatureStatMultiplier } from "../data/nature"; import { loggedInUser } from "../account"; import { Variant, getVariantTint } from "#app/data/variant"; import {Button} from "#enums/buttons"; @@ -93,6 +93,8 @@ export default class SummaryUiHandler extends UiHandler { private moveCursorBlinkTimer: Phaser.Time.TimerEvent; private pokemon: PlayerPokemon; + private playerParty: boolean; + /**This is set to false when checking the summary of a freshly caught Pokemon as it is not part of a player's party yet but still needs to display its items**/ private newMove: Move; private moveSelectFunction: Function; private transitioning: boolean; @@ -102,6 +104,7 @@ export default class SummaryUiHandler extends UiHandler { private moveSelect: boolean; private moveCursor: integer; private selectedMoveIndex: integer; + private selectCallback: Function; constructor(scene: BattleScene) { super(scene, Mode.SUMMARY); @@ -122,7 +125,7 @@ export default class SummaryUiHandler extends UiHandler { this.tabSprite.setOrigin(1, 1); this.summaryContainer.add(this.tabSprite); - const summaryLabel = addTextObject(this.scene, 4, -165, "Pokémon Info", TextStyle.SUMMARY); + const summaryLabel = addTextObject(this.scene, 4, -165, i18next.t("pokemonSummary:pokemonInfo"), TextStyle.SUMMARY); summaryLabel.setOrigin(0, 1); this.summaryContainer.add(summaryLabel); @@ -207,7 +210,7 @@ export default class SummaryUiHandler extends UiHandler { this.statusContainer.add(statusBg); - const statusLabel = addTextObject(this.scene, 3, 0, "Status", TextStyle.SUMMARY); + const statusLabel = addTextObject(this.scene, 3, 0, i18next.t("pokemonSummary:status"), TextStyle.SUMMARY); statusLabel.setOrigin(0, 0); this.statusContainer.add(statusLabel); @@ -227,7 +230,7 @@ export default class SummaryUiHandler extends UiHandler { moveEffectBg.setOrigin(0, 0); this.moveEffectContainer.add(moveEffectBg); - const moveEffectLabels = addTextObject(this.scene, 8, 12, "Power\nAccuracy\nCategory", TextStyle.SUMMARY); + const moveEffectLabels = addTextObject(this.scene, 8, 12, i18next.t("pokemonSummary:powerAccuracyCategory"), TextStyle.SUMMARY); moveEffectLabels.setLineSpacing(9); moveEffectLabels.setOrigin(0, 0); @@ -269,9 +272,16 @@ export default class SummaryUiHandler extends UiHandler { show(args: any[]): boolean { 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) + */ this.pokemon = args[0] as PlayerPokemon; this.summaryUiMode = args.length > 1 ? args[1] as SummaryUiMode : SummaryUiMode.DEFAULT; - + this.playerParty = args[4] ?? true; this.scene.ui.bringToTop(this.summaryContainer); this.summaryContainer.setVisible(true); @@ -302,7 +312,7 @@ export default class SummaryUiHandler extends UiHandler { }); this.pokemon.cry(); - this.nameText.setText(this.pokemon.name); + this.nameText.setText(this.pokemon.getNameToRender()); const isFusion = this.pokemon.isFusion(); @@ -368,6 +378,9 @@ export default class SummaryUiHandler extends UiHandler { 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; @@ -397,7 +410,7 @@ export default class SummaryUiHandler extends UiHandler { } const ui = this.getUi(); - + const fromPartyMode = ui.handlers[Mode.PARTY].active; let success = false; let error = false; @@ -485,7 +498,17 @@ export default class SummaryUiHandler extends UiHandler { if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE) { this.hideMoveSelect(); } else { - ui.setMode(Mode.PARTY); + if (this.selectCallback instanceof Function) { + const selectCallback = this.selectCallback; + this.selectCallback = null; + selectCallback(); + } + + if (!fromPartyMode) { + ui.setMode(Mode.MESSAGE); + } else { + ui.setMode(Mode.PARTY); + } } success = true; } else { @@ -495,6 +518,8 @@ export default class SummaryUiHandler extends UiHandler { case Button.DOWN: if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE) { break; + } else if (!fromPartyMode) { + break; } const isDown = button === Button.DOWN; const party = this.scene.getParty(); @@ -677,12 +702,7 @@ export default class SummaryUiHandler extends UiHandler { const profileContainer = this.scene.add.container(0, -pageBg.height); pageContainer.add(profileContainer); - const trainerLabel = addTextObject(this.scene, 7, 12, "OT/", TextStyle.SUMMARY_ALT); - trainerLabel.setOrigin(0, 0); - profileContainer.add(trainerLabel); - - const trainerText = addTextObject(this.scene, 25, 12, loggedInUser?.username || "Unknown", - this.scene.gameData.gender === PlayerGender.FEMALE ? TextStyle.SUMMARY_PINK : TextStyle.SUMMARY_BLUE); + 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); trainerText.setOrigin(0, 0); profileContainer.add(trainerText); @@ -690,12 +710,12 @@ export default class SummaryUiHandler extends UiHandler { trainerIdText.setOrigin(0, 0); profileContainer.add(trainerIdText); - const typeLabel = addTextObject(this.scene, 7, 28, "Type/", TextStyle.WINDOW_ALT); + const typeLabel = addTextObject(this.scene, 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 xCoord = 39 + 34 * index; + const xCoord = typeLabel.width * typeLabel.scale + 9 + 34 * index; const typeIcon = !tera ? this.scene.add.sprite(xCoord, 42, `types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`, Type[type].toLowerCase()) : this.scene.add.sprite(xCoord, 42, "type_tera"); if (tera) { @@ -796,7 +816,20 @@ export default class SummaryUiHandler extends UiHandler { this.passiveContainer?.nameText.setVisible(false); this.passiveContainer?.descriptionText.setVisible(false); - const memoString = `${getBBCodeFrag(Utils.toReadableString(getNatureName(this.pokemon.getNature())), TextStyle.SUMMARY_RED)}${getBBCodeFrag(" nature,", TextStyle.WINDOW_ALT)}\n${getBBCodeFrag(`${this.pokemon.metBiome === -1 ? "apparently " : ""}met at Lv`, TextStyle.WINDOW_ALT)}${getBBCodeFrag(this.pokemon.metLevel.toString(), TextStyle.SUMMARY_RED)}${getBBCodeFrag(",", TextStyle.WINDOW_ALT)}\n${getBBCodeFrag(getBiomeName(this.pokemon.metBiome), TextStyle.SUMMARY_RED)}${getBBCodeFrag(".", TextStyle.WINDOW_ALT)}`; + const closeFragment = getBBCodeFrag("", TextStyle.WINDOW_ALT); + const rawNature = Utils.toReadableString(Nature[this.pokemon.getNature()]); + const nature = `${getBBCodeFrag(Utils.toReadableString(getNatureName(this.pokemon.getNature())), TextStyle.SUMMARY_RED)}${closeFragment}`; + + 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}`, + level: `${getBBCodeFrag(this.pokemon.metLevel.toString(), TextStyle.SUMMARY_RED)}${closeFragment}`, + }), + natureFragment: + i18next.exists(`pokemonSummary:natureFragment.${rawNature}`) ? + i18next.t(`pokemonSummary:natureFragment.${rawNature}`, { nature: nature }) : + nature, + }); const memoText = addBBCodeTextObject(this.scene, 7, 113, memoString, TextStyle.WINDOW_ALT); memoText.setOrigin(0, 0); @@ -809,9 +842,7 @@ export default class SummaryUiHandler extends UiHandler { const stats = Utils.getEnumValues(Stat) as Stat[]; stats.forEach((stat, s) => { - const statName = stat !== Stat.HP - ? getStatName(stat) - : "HP"; + const statName = getStatName(stat); const rowIndex = s % 3; const colIndex = Math.floor(s / 3); @@ -831,7 +862,7 @@ export default class SummaryUiHandler extends UiHandler { }); const itemModifiers = (this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && (m as PokemonHeldItemModifier).pokemonId === this.pokemon.id, true) as PokemonHeldItemModifier[]) + && m.pokemonId === this.pokemon.id, this.playerParty) as PokemonHeldItemModifier[]) .sort(modifierSortFunc); itemModifiers.forEach((item, i) => { @@ -848,11 +879,11 @@ export default class SummaryUiHandler extends UiHandler { const relLvExp = getLevelRelExp(this.pokemon.level + 1, this.pokemon.species.growthRate); const expRatio = this.pokemon.level < this.scene.getMaxExpLevel() ? this.pokemon.levelExp / relLvExp : 0; - const expLabel = addTextObject(this.scene, 6, 112, "EXP. Points", TextStyle.SUMMARY); + const expLabel = addTextObject(this.scene, 6, 112, i18next.t("pokemonSummary:expPoints"), TextStyle.SUMMARY); expLabel.setOrigin(0, 0); statsContainer.add(expLabel); - const nextLvExpLabel = addTextObject(this.scene, 6, 128, "Next Lv.", TextStyle.SUMMARY); + const nextLvExpLabel = addTextObject(this.scene, 6, 128, i18next.t("pokemonSummary:nextLv"), TextStyle.SUMMARY); nextLvExpLabel.setOrigin(0, 0); statsContainer.add(nextLvExpLabel); @@ -893,7 +924,7 @@ export default class SummaryUiHandler extends UiHandler { extraRowOverlay.setOrigin(0, 1); this.extraMoveRowContainer.add(extraRowOverlay); - const extraRowText = addTextObject(this.scene, 35, 0, this.summaryUiMode === SummaryUiMode.LEARN_MOVE ? this.newMove.name : "Cancel", + const extraRowText = addTextObject(this.scene, 35, 0, this.summaryUiMode === SummaryUiMode.LEARN_MOVE ? 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); diff --git a/src/ui/target-select-ui-handler.ts b/src/ui/target-select-ui-handler.ts index 772500e8901..48799473343 100644 --- a/src/ui/target-select-ui-handler.ts +++ b/src/ui/target-select-ui-handler.ts @@ -6,17 +6,20 @@ import * as Utils from "../utils"; import { getMoveTargets } from "../data/move"; import {Button} from "#enums/buttons"; import { Moves } from "#enums/moves"; +import Pokemon from "#app/field/pokemon.js"; -export type TargetSelectCallback = (cursor: integer) => void; +export type TargetSelectCallback = (targets: BattlerIndex[]) => void; export default class TargetSelectUiHandler extends UiHandler { private fieldIndex: integer; private move: Moves; private targetSelectCallback: TargetSelectCallback; + private isMultipleTargets: boolean = false; private targets: BattlerIndex[]; + private targetsHighlighted: Pokemon[]; private targetFlashTween: Phaser.Tweens.Tween; - private targetBattleInfoMoveTween: Phaser.Tweens.Tween; + private targetBattleInfoMoveTween: Phaser.Tweens.Tween[] = []; constructor(scene: BattleScene) { super(scene, Mode.TARGET_SELECT); @@ -37,13 +40,15 @@ export default class TargetSelectUiHandler extends UiHandler { this.move = args[1] as Moves; this.targetSelectCallback = args[2] as TargetSelectCallback; - this.targets = getMoveTargets(this.scene.getPlayerField()[this.fieldIndex], this.move).targets; + const moveTargets = getMoveTargets(this.scene.getPlayerField()[this.fieldIndex], this.move); + this.targets = moveTargets.targets; + this.isMultipleTargets = moveTargets.multiple ?? false; if (!this.targets.length) { return false; } - this.setCursor(this.targets.indexOf(this.cursor) > -1 ? this.cursor : this.targets[0]); + this.setCursor(this.targets.includes(this.cursor) ? this.cursor : this.targets[0]); return true; } @@ -54,8 +59,11 @@ export default class TargetSelectUiHandler extends UiHandler { let success = false; if (button === Button.ACTION || button === Button.CANCEL) { - this.targetSelectCallback(button === Button.ACTION ? this.cursor : -1); + const targetIndexes: BattlerIndex[] = this.isMultipleTargets ? this.targets : [this.cursor]; + this.targetSelectCallback(button === Button.ACTION ? targetIndexes : []); success = true; + } else if (this.isMultipleTargets) { + success = false; } else { switch (button) { case Button.UP: @@ -89,73 +97,71 @@ export default class TargetSelectUiHandler extends UiHandler { } setCursor(cursor: integer): boolean { - const lastCursor = this.cursor; + const singleTarget = this.scene.getField()[cursor]; + const multipleTargets = this.targets.map(index => this.scene.getField()[index]); + + this.targetsHighlighted = this.isMultipleTargets ? multipleTargets : [ singleTarget ]; const ret = super.setCursor(cursor); if (this.targetFlashTween) { this.targetFlashTween.stop(); - const lastTarget = this.scene.getField()[lastCursor]; - if (lastTarget) { - lastTarget.setAlpha(1); + for (const pokemon of multipleTargets) { + pokemon.setAlpha(1); } } - const target = this.scene.getField()[cursor]; - this.targetFlashTween = this.scene.tweens.add({ - targets: [ target ], + targets: this.targetsHighlighted, alpha: 0, loop: -1, duration: Utils.fixedInt(250), ease: "Sine.easeIn", yoyo: true, onUpdate: t => { - if (target) { + for (const target of this.targetsHighlighted) { target.setAlpha(t.getValue()); } } }); - - if (this.targetBattleInfoMoveTween) { - this.targetBattleInfoMoveTween.stop(); - const lastTarget = this.scene.getField()[lastCursor]; - if (lastTarget) { - lastTarget.getBattleInfo().resetY(); + if (this.targetBattleInfoMoveTween.length >= 1) { + this.targetBattleInfoMoveTween.filter(t => t !== undefined).forEach(tween => tween.stop()); + for (const pokemon of multipleTargets) { + pokemon.getBattleInfo().resetY(); } } - const targetBattleInfo = target.getBattleInfo(); + const targetsBattleInfo = this.targetsHighlighted.map(target => target.getBattleInfo()); - this.targetBattleInfoMoveTween = this.scene.tweens.add({ - targets: [ targetBattleInfo ], - y: { start: targetBattleInfo.getBaseY(), to: targetBattleInfo.getBaseY() + 1 }, - loop: -1, - duration: Utils.fixedInt(250), - ease: "Linear", - yoyo: true + 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 + })); }); return ret; } eraseCursor() { - const target = this.scene.getField()[this.cursor]; if (this.targetFlashTween) { this.targetFlashTween.stop(); this.targetFlashTween = null; } - if (target) { - target.setAlpha(1); + for (const pokemon of this.targetsHighlighted) { + pokemon.setAlpha(1); } - const targetBattleInfo = target.getBattleInfo(); - if (this.targetBattleInfoMoveTween) { - this.targetBattleInfoMoveTween.stop(); - this.targetBattleInfoMoveTween = null; + if (this.targetBattleInfoMoveTween.length >= 1) { + this.targetBattleInfoMoveTween.filter(t => t !== undefined).forEach(tween => tween.stop()); + this.targetBattleInfoMoveTween = []; } - if (targetBattleInfo) { - targetBattleInfo.resetY(); + for (const pokemon of this.targetsHighlighted) { + pokemon.getBattleInfo().resetY(); } } diff --git a/src/ui/ui.ts b/src/ui/ui.ts index aac2779e111..e8f61aa6925 100644 --- a/src/ui/ui.ts +++ b/src/ui/ui.ts @@ -46,6 +46,7 @@ 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 RenameFormUiHandler from "./rename-form-ui-handler"; import MysteryEncounterUiHandler from "./mystery-encounter-ui-handler"; export enum Mode { @@ -85,6 +86,7 @@ export enum Mode { UNAVAILABLE, OUTDATED, CHALLENGE_SELECT, + RENAME_POKEMON, MYSTERY_ENCOUNTER } @@ -121,7 +123,8 @@ const noTransitionModes = [ Mode.LOADING, Mode.SESSION_RELOAD, Mode.UNAVAILABLE, - Mode.OUTDATED + Mode.OUTDATED, + Mode.RENAME_POKEMON ]; export default class UI extends Phaser.GameObjects.Container { @@ -183,6 +186,7 @@ export default class UI extends Phaser.GameObjects.Container { new UnavailableModalUiHandler(scene), new OutdatedModalUiHandler(scene), new GameChallengesUiHandler(scene), + new RenameFormUiHandler(scene), new MysteryEncounterUiHandler(scene) ]; } diff --git a/src/ui/unavailable-modal-ui-handler.ts b/src/ui/unavailable-modal-ui-handler.ts index 2f6e1c08832..c864801d9b4 100644 --- a/src/ui/unavailable-modal-ui-handler.ts +++ b/src/ui/unavailable-modal-ui-handler.ts @@ -58,7 +58,7 @@ export default class UnavailableModalUiHandler extends ModalUiHandler { this.scene.playSound("pb_bounce_1"); this.reconnectCallback(); } else if (response[1] === 401) { - Utils.setCookie(Utils.sessionIdKey, ""); + Utils.removeCookie(Utils.sessionIdKey); this.scene.reset(true, true); } else { this.reconnectDuration = Math.min(this.reconnectDuration * 2, this.maxTime); // Set a max delay so it isn't infinite diff --git a/src/utils.ts b/src/utils.ts index c9fe319ce41..476a279bcb1 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -292,13 +292,25 @@ 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; +export const isBeta = import.meta.env.MODE === "beta"; // this checks to see if the env mode is development. Technically this gives the same value for beta AND for dev envs + export function setCookie(cName: string, cValue: string): void { const expiration = new Date(); expiration.setTime(new Date().getTime() + 3600000 * 24 * 30 * 3/*7*/); - document.cookie = `${cName}=${cValue};Secure;SameSite=Strict;Path=/;Expires=${expiration.toUTCString()}`; + document.cookie = `${cName}=${cValue};Secure;SameSite=Strict;Domain=${window.location.hostname};Path=/;Expires=${expiration.toUTCString()}`; +} + +export function removeCookie(cName: string): void { + document.cookie = `${cName}=;Secure;SameSite=Strict;Domain=${window.location.hostname};Path=/;Max-Age=-1`; + document.cookie = `${cName}=;Secure;SameSite=Strict;Path=/;Max-Age=-1`; // legacy cookie without domain, for older cookies to prevent a login loop } export function getCookie(cName: string): string { + // check if there are multiple cookies with the same name and delete them + if (document.cookie.split(";").filter(c => c.includes(cName)).length > 1) { + removeCookie(cName); + return ""; + } const name = `${cName}=`; const ca = document.cookie.split(";"); for (let i = 0; i < ca.length; i++) { @@ -409,6 +421,13 @@ export function formatText(unformattedText: string): string { return text.join(" "); } +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(""); +} + export function rgbToHsv(r: integer, g: integer, b: integer) { const v = Math.max(r, g, b); const c = v - Math.min(r, g, b); @@ -527,6 +546,32 @@ export function reverseValueToKeySetting(input) { return capitalizedWords.join("_"); } +/** + * Capitalize a string. + * + * @param str - The string to be capitalized. + * @param sep - The separator between the words of the string. + * @param lowerFirstChar - Whether the first character of the string should be lowercase or not. + * @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) { + if (str) { + const splitedStr = str.toLowerCase().split(sep); + + for (let i = +lowerFirstChar; i < splitedStr?.length; i++) { + splitedStr[i] = splitedStr[i].charAt(0).toUpperCase() + splitedStr[i].substring(1); + } + + return returnWithSpaces ? splitedStr.join(" ") : splitedStr.join(""); + } + return null; +} + +/** + * Returns if an object is null or undefined + * @param object + */ export function isNullOrUndefined(object: any): boolean { return null === object || undefined === object; } diff --git a/src/vite.env.d.ts b/src/vite.env.d.ts index b588b5b1145..a2acc658a10 100644 --- a/src/vite.env.d.ts +++ b/src/vite.env.d.ts @@ -1,10 +1,14 @@ /// interface ImportMetaEnv { + readonly VITE_PORT?: string; readonly VITE_BYPASS_LOGIN?: string; readonly VITE_BYPASS_TUTORIAL?: string; readonly VITE_API_BASE_URL?: string; readonly VITE_SERVER_URL?: string; + readonly VITE_DISCORD_CLIENT_ID?: string; + readonly VITE_GOOGLE_CLIENT_ID?: string; + readonly VITE_I18N_DEBUG?: string; } interface ImportMeta { diff --git a/tsconfig.json b/tsconfig.json index 682b3a7084b..546ea2a9d12 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -29,6 +29,7 @@ "node_modules", "dist", "vite.config.ts", - "vitest.config.ts" + "vitest.config.ts", + "vitest.workspace.ts", ] } \ No newline at end of file diff --git a/vite.config.ts b/vite.config.ts index f0830f5b9be..6dce1272ee6 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,9 +1,8 @@ -import { defineConfig } from 'vite'; +import { defineConfig, loadEnv } from 'vite'; import tsconfigPaths from 'vite-tsconfig-paths'; export const defaultConfig = { plugins: [tsconfigPaths() as any], - server: { host: '0.0.0.0', port: 8000 }, clearScreen: false, build: { minify: 'esbuild' as const, @@ -21,10 +20,17 @@ export const defaultConfig = { }; -export default defineConfig(({mode}) => ({ - ...defaultConfig, - esbuild: { - pure: mode === 'production' ? [ 'console.log' ] : [], - keepNames: true, - }, -})); +export default defineConfig(({mode}) => { + const envPort = Number(loadEnv(mode, process.cwd()).VITE_PORT); + + return ({ + ...defaultConfig, + esbuild: { + pure: mode === 'production' ? ['console.log'] : [], + keepNames: true, + }, + server: { + port: !isNaN(envPort) ? envPort : 8000, + } + }); +}); diff --git a/vitest.config.ts b/vitest.config.ts index 7f16059a8ad..d1827103807 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -1,9 +1,12 @@ -import { defineConfig } from 'vitest/config'; +import { defineProject } from 'vitest/config'; import { defaultConfig } from './vite.config'; -export default defineConfig(({mode}) => ({ +export default defineProject(({ mode }) => ({ ...defaultConfig, test: { + name: "main", + include: ["./src/test/**/*.{test,spec}.ts"], + exclude: ["./src/test/pre.test.ts"], setupFiles: ['./src/test/vitest.setup.ts'], server: { deps: { diff --git a/vitest.workspace.ts b/vitest.workspace.ts new file mode 100644 index 00000000000..38121942004 --- /dev/null +++ b/vitest.workspace.ts @@ -0,0 +1,14 @@ +import { defineWorkspace } from "vitest/config"; +import { defaultConfig } from "./vite.config"; + +export default defineWorkspace([ + { + ...defaultConfig, + test: { + name: "pre", + include: ["src/test/pre.test.ts"], + environment: "jsdom", + }, + }, + "./vitest.config.ts", +]);