diff --git a/.eslintrc b/.eslintrc index 1411697a3f2..e1f6ba9ee32 100644 --- a/.eslintrc +++ b/.eslintrc @@ -22,7 +22,13 @@ "@typescript-eslint/no-extra-semi": ["error"], // Disallows unnecessary semicolons for TypeScript-specific syntax "brace-style": "off", // Note: you must disable the base rule as it can report incorrect errors "curly": ["error", "all"], // Enforces the use of curly braces for all control statements - "@typescript-eslint/brace-style": ["error", "1tbs"] + "@typescript-eslint/brace-style": ["error", "1tbs"], + "no-trailing-spaces": ["error", { // Disallows trailing whitespace at the end of lines + "skipBlankLines": false, // Enforces the rule even on blank lines + "ignoreComments": false // Enforces the rule on lines containing comments + }], + "space-before-blocks": ["error", "always"], // Enforces a space before blocks + "keyword-spacing": ["error", { "before": true, "after": true }] // Enforces spacing before and after keywords } } ] diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 07aed42a5a7..2364fff5a35 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -6,6 +6,7 @@ on: jobs: deploy: + if: github.repository == 'pagefaultgames/pokerogue' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 diff --git a/.gitignore b/.gitignore index d4fd3762cb4..55f9203a81d 100644 --- a/.gitignore +++ b/.gitignore @@ -24,9 +24,6 @@ dist-ssr *.sln *.sw? -# Docummentation -docs/* - public/images/trainer/convert/* public/images/battle_anims/input/*.png public/images/pokemon/input/*.png diff --git a/README.md b/README.md index 72887579f17..5e1f595f16f 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ If you have the motivation and experience with Typescript/Javascript (or are wil ### 💻 Environment Setup #### Prerequisites -- node: 18.3.0 +- node: 20.13.1 - npm: [how to install](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) #### Running Locally @@ -16,6 +16,9 @@ If you have the motivation and experience with Typescript/Javascript (or are wil - *if you run into any errors, reach out in the **#dev-corner** channel in discord* 2. Run `npm run start:dev` to locally run the project in `localhost:8000` +#### Linting +We're using ESLint as our common linter and formatter. It will run automatically during the pre-commit hook but if you would like to manually run it, use the `npm run eslint` script. + ### ❔ FAQ **How do I test a new _______?** diff --git a/docs/linting.md b/docs/linting.md new file mode 100644 index 00000000000..39b30b7a1c0 --- /dev/null +++ b/docs/linting.md @@ -0,0 +1,40 @@ +# ESLint +## Key Features + +1. **Automation**: + - A pre-commit hook has been added to automatically run ESLint on the added or modified files, ensuring code quality before commits. + +2. **Manual Usage**: + - If you prefer not to use the pre-commit hook, you can manually run ESLint to automatically fix issues using the command: + ```sh + npx eslint --fix . or npm run eslint + ``` + - Running this command will lint all files in the repository. + +3. **GitHub Action**: + - A GitHub Action has been added to automatically run ESLint on every push and pull request, ensuring code quality in the CI/CD pipeline. + +## Summary of ESLint Rules + +1. **General Rules**: + - **Equality**: Use `===` and `!==` instead of `==` and `!=` (`eqeqeq`). + - **Indentation**: Enforce 2-space indentation (`indent`). + - **Quotes**: Use doublequotes for strings (`quotes`). + - **Variable Declarations**: + - Disallow `var`; use `let` or `const` (`no-var`). + - Prefer `const` for variables that are never reassigned (`prefer-const`). + - **Unused Variables**: Allow unused function parameters but enforce error for other unused variables (`@typescript-eslint/no-unused-vars`). + - **End of Line**: Ensure at least one newline at the end of files (`eol-last`). + - **Curly Braces**: Enforce the use of curly braces for all control statements (`curly`). + - **Brace Style**: Use one true brace style (`1tbs`) for TypeScript-specific syntax (`@typescript-eslint/brace-style`). + +2. **TypeScript-Specific Rules**: + - **Semicolons**: + - Enforce semicolons for TypeScript-specific syntax (`@typescript-eslint/semi`). + - Disallow unnecessary semicolons (`@typescript-eslint/no-extra-semi`). + +## Benefits + +- **Consistency**: Ensures consistent coding style across the project. +- **Code Quality**: Helps catch potential errors and improve overall code quality. +- **Readability**: Makes the codebase easier to read and maintain. \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index d75e8ed6677..228983a1036 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,41 +1,87 @@ { "name": "pokemon-rogue-battle", "version": "1.0.4", - "lockfileVersion": 1, + "lockfileVersion": 3, "requires": true, - "dependencies": { - "@ampproject/remapping": { + "packages": { + "": { + "name": "pokemon-rogue-battle", + "version": "1.0.4", + "dependencies": { + "@material/material-color-utilities": "^0.2.7", + "crypto-js": "^4.2.0", + "i18next": "^23.11.1", + "i18next-browser-languagedetector": "^7.2.1", + "json-stable-stringify": "^1.1.0", + "phaser": "^3.70.0", + "phaser3-rex-plugins": "^1.1.84" + }, + "devDependencies": { + "@eslint/js": "^9.3.0", + "@typescript-eslint/eslint-plugin": "^7.10.0", + "@typescript-eslint/parser": "^7.10.0", + "@vitest/coverage-istanbul": "^1.4.0", + "axios": "^1.6.2", + "axios-cache-interceptor": "^1.3.2", + "eslint": "^8.57.0", + "eslint-plugin-import": "^2.29.1", + "jsdom": "^24.0.0", + "json-beautify": "^1.1.1", + "lefthook": "^1.6.12", + "phaser3spectorjs": "^0.0.8", + "pokenode-ts": "^1.20.0", + "typescript": "^5.4.5", + "typescript-eslint": "^7.10.0", + "vite": "^4.5.0", + "vite-plugin-fs": "^0.4.4", + "vitest": "^1.4.0", + "vitest-canvas-mock": "^0.3.3" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, - "requires": { + "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" } }, - "@babel/code-frame": { + "node_modules/@babel/code-frame": { "version": "7.24.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", "dev": true, - "requires": { + "dependencies": { "@babel/highlight": "^7.24.2", "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/compat-data": { + "node_modules/@babel/compat-data": { "version": "7.24.4", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "@babel/core": { + "node_modules/@babel/core": { "version": "7.24.4", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", "dev": true, - "requires": { + "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.2", "@babel/generator": "^7.24.4", @@ -52,185 +98,251 @@ "json5": "^2.2.3", "semver": "^6.3.1" }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "@babel/generator": { + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { "version": "7.24.4", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.24.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-compilation-targets": { + "node_modules/@babel/helper-compilation-targets": { "version": "7.23.6", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dev": true, - "requires": { + "dependencies": { "@babel/compat-data": "^7.23.5", "@babel/helper-validator-option": "^7.23.5", "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-environment-visitor": { + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "@babel/helper-function-name": { + "node_modules/@babel/helper-function-name": { "version": "7.23.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, - "requires": { + "dependencies": { "@babel/template": "^7.22.15", "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-hoist-variables": { + "node_modules/@babel/helper-hoist-variables": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-module-imports": { + "node_modules/@babel/helper-module-imports": { "version": "7.24.3", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-module-transforms": { + "node_modules/@babel/helper-module-transforms": { "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-module-imports": "^7.22.15", "@babel/helper-simple-access": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "@babel/helper-simple-access": { + "node_modules/@babel/helper-simple-access": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-split-export-declaration": { + "node_modules/@babel/helper-split-export-declaration": { "version": "7.22.6", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-string-parser": { + "node_modules/@babel/helper-string-parser": { "version": "7.24.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "@babel/helper-validator-identifier": { + "node_modules/@babel/helper-validator-identifier": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "@babel/helper-validator-option": { + "node_modules/@babel/helper-validator-option": { "version": "7.23.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "@babel/helpers": { + "node_modules/@babel/helpers": { "version": "7.24.4", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", "dev": true, - "requires": { + "dependencies": { "@babel/template": "^7.24.0", "@babel/traverse": "^7.24.1", "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/highlight": { + "node_modules/@babel/highlight": { "version": "7.24.2", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/parser": { + "node_modules/@babel/parser": { "version": "7.24.4", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", - "dev": true + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } }, - "@babel/runtime": { + "node_modules/@babel/runtime": { "version": "7.24.4", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", - "requires": { + "dependencies": { "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/template": { + "node_modules/@babel/template": { "version": "7.24.0", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.23.5", "@babel/parser": "^7.24.0", "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/traverse": { + "node_modules/@babel/traverse": { "version": "7.24.1", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.24.1", "@babel/generator": "^7.24.1", "@babel/helper-environment-visitor": "^7.22.20", @@ -241,201 +353,423 @@ "@babel/types": "^7.24.0", "debug": "^4.3.1", "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/types": { + "node_modules/@babel/types": { "version": "7.24.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@esbuild/aix-ppc64": { + "node_modules/@esbuild/aix-ppc64": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } }, - "@esbuild/android-arm": { + "node_modules/@esbuild/android-arm": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } }, - "@esbuild/android-arm64": { + "node_modules/@esbuild/android-arm64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } }, - "@esbuild/android-x64": { + "node_modules/@esbuild/android-x64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } }, - "@esbuild/darwin-arm64": { + "node_modules/@esbuild/darwin-arm64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } }, - "@esbuild/darwin-x64": { + "node_modules/@esbuild/darwin-x64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } }, - "@esbuild/freebsd-arm64": { + "node_modules/@esbuild/freebsd-arm64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } }, - "@esbuild/freebsd-x64": { + "node_modules/@esbuild/freebsd-x64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } }, - "@esbuild/linux-arm": { + "node_modules/@esbuild/linux-arm": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "@esbuild/linux-arm64": { + "node_modules/@esbuild/linux-arm64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "@esbuild/linux-ia32": { + "node_modules/@esbuild/linux-ia32": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "@esbuild/linux-loong64": { + "node_modules/@esbuild/linux-loong64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "@esbuild/linux-mips64el": { + "node_modules/@esbuild/linux-mips64el": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "@esbuild/linux-ppc64": { + "node_modules/@esbuild/linux-ppc64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "@esbuild/linux-riscv64": { + "node_modules/@esbuild/linux-riscv64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "@esbuild/linux-s390x": { + "node_modules/@esbuild/linux-s390x": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "@esbuild/linux-x64": { + "node_modules/@esbuild/linux-x64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "@esbuild/netbsd-x64": { + "node_modules/@esbuild/netbsd-x64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } }, - "@esbuild/openbsd-x64": { + "node_modules/@esbuild/openbsd-x64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } }, - "@esbuild/sunos-x64": { + "node_modules/@esbuild/sunos-x64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } }, - "@esbuild/win32-arm64": { + "node_modules/@esbuild/win32-arm64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } }, - "@esbuild/win32-ia32": { + "node_modules/@esbuild/win32-ia32": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } }, - "@esbuild/win32-x64": { + "node_modules/@esbuild/win32-x64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } }, - "@eslint-community/eslint-utils": { + "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, - "requires": { + "dependencies": { "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "@eslint-community/regexpp": { + "node_modules/@eslint-community/regexpp": { "version": "4.10.0", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } }, - "@eslint/eslintrc": { + "node_modules/@eslint/eslintrc": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, - "requires": { + "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.6.0", @@ -446,268 +780,411 @@ "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, - "dependencies": { - "globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - } + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "@eslint/js": { + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.3.0.tgz", "integrity": "sha512-niBqk8iwv96+yuTwjM6bWg8ovzAPF9qkICsGtcoa5/dmqcEMfdwNAX7+/OHcJHc7wj7XqPxH98oAHytFYlw6Sw==", - "dev": true + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } }, - "@humanwhocodes/config-array": { + "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, - "requires": { + "dependencies": { "@humanwhocodes/object-schema": "^2.0.2", "debug": "^4.3.1", "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" } }, - "@humanwhocodes/module-importer": { + "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, - "@humanwhocodes/object-schema": { + "node_modules/@humanwhocodes/object-schema": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "dev": true }, - "@istanbuljs/schema": { + "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "@jest/schemas": { + "node_modules/@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, - "requires": { + "dependencies": { "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "@jridgewell/gen-mapping": { + "node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, - "requires": { + "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" } }, - "@jridgewell/resolve-uri": { + "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.0.0" + } }, - "@jridgewell/set-array": { + "node_modules/@jridgewell/set-array": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.0.0" + } }, - "@jridgewell/sourcemap-codec": { + "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, - "@jridgewell/trace-mapping": { + "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, - "requires": { + "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "@material/material-color-utilities": { + "node_modules/@material/material-color-utilities": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/@material/material-color-utilities/-/material-color-utilities-0.2.7.tgz", "integrity": "sha512-0FCeqG6WvK4/Cc06F/xXMd/pv4FeisI0c1tUpBbfhA2n9Y8eZEv4Karjbmf2ZqQCPUWMrGp8A571tCjizxoTiQ==" }, - "@nodelib/fs.scandir": { + "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, - "requires": { + "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" } }, - "@nodelib/fs.stat": { + "node_modules/@nodelib/fs.stat": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true + "dev": true, + "engines": { + "node": ">= 8" + } }, - "@nodelib/fs.walk": { + "node_modules/@nodelib/fs.walk": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, - "requires": { + "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" } }, - "@rollup/rollup-android-arm-eabi": { + "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.16.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.16.4.tgz", "integrity": "sha512-GkhjAaQ8oUTOKE4g4gsZ0u8K/IHU1+2WQSgS1TwTcYvL+sjbaQjNHFXbOJ6kgqGHIO1DfUhI/Sphi9GkRT9K+Q==", + "cpu": [ + "arm" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "android" + ] }, - "@rollup/rollup-android-arm64": { + "node_modules/@rollup/rollup-android-arm64": { "version": "4.16.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.16.4.tgz", "integrity": "sha512-Bvm6D+NPbGMQOcxvS1zUl8H7DWlywSXsphAeOnVeiZLQ+0J6Is8T7SrjGTH29KtYkiY9vld8ZnpV3G2EPbom+w==", + "cpu": [ + "arm64" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "android" + ] }, - "@rollup/rollup-darwin-arm64": { + "node_modules/@rollup/rollup-darwin-arm64": { "version": "4.16.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.16.4.tgz", "integrity": "sha512-i5d64MlnYBO9EkCOGe5vPR/EeDwjnKOGGdd7zKFhU5y8haKhQZTN2DgVtpODDMxUr4t2K90wTUJg7ilgND6bXw==", + "cpu": [ + "arm64" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "darwin" + ] }, - "@rollup/rollup-darwin-x64": { + "node_modules/@rollup/rollup-darwin-x64": { "version": "4.16.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.16.4.tgz", "integrity": "sha512-WZupV1+CdUYehaZqjaFTClJI72fjJEgTXdf4NbW69I9XyvdmztUExBtcI2yIIU6hJtYvtwS6pkTkHJz+k08mAQ==", + "cpu": [ + "x64" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "darwin" + ] }, - "@rollup/rollup-linux-arm-gnueabihf": { + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { "version": "4.16.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.16.4.tgz", "integrity": "sha512-ADm/xt86JUnmAfA9mBqFcRp//RVRt1ohGOYF6yL+IFCYqOBNwy5lbEK05xTsEoJq+/tJzg8ICUtS82WinJRuIw==", + "cpu": [ + "arm" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "linux" + ] }, - "@rollup/rollup-linux-arm-musleabihf": { + "node_modules/@rollup/rollup-linux-arm-musleabihf": { "version": "4.16.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.16.4.tgz", "integrity": "sha512-tJfJaXPiFAG+Jn3cutp7mCs1ePltuAgRqdDZrzb1aeE3TktWWJ+g7xK9SNlaSUFw6IU4QgOxAY4rA+wZUT5Wfg==", + "cpu": [ + "arm" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "linux" + ] }, - "@rollup/rollup-linux-arm64-gnu": { + "node_modules/@rollup/rollup-linux-arm64-gnu": { "version": "4.16.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.16.4.tgz", "integrity": "sha512-7dy1BzQkgYlUTapDTvK997cgi0Orh5Iu7JlZVBy1MBURk7/HSbHkzRnXZa19ozy+wwD8/SlpJnOOckuNZtJR9w==", + "cpu": [ + "arm64" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "linux" + ] }, - "@rollup/rollup-linux-arm64-musl": { + "node_modules/@rollup/rollup-linux-arm64-musl": { "version": "4.16.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.16.4.tgz", "integrity": "sha512-zsFwdUw5XLD1gQe0aoU2HVceI6NEW7q7m05wA46eUAyrkeNYExObfRFQcvA6zw8lfRc5BHtan3tBpo+kqEOxmg==", + "cpu": [ + "arm64" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "linux" + ] }, - "@rollup/rollup-linux-powerpc64le-gnu": { + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { "version": "4.16.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.16.4.tgz", "integrity": "sha512-p8C3NnxXooRdNrdv6dBmRTddEapfESEUflpICDNKXpHvTjRRq1J82CbU5G3XfebIZyI3B0s074JHMWD36qOW6w==", + "cpu": [ + "ppc64" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "linux" + ] }, - "@rollup/rollup-linux-riscv64-gnu": { + "node_modules/@rollup/rollup-linux-riscv64-gnu": { "version": "4.16.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.16.4.tgz", "integrity": "sha512-Lh/8ckoar4s4Id2foY7jNgitTOUQczwMWNYi+Mjt0eQ9LKhr6sK477REqQkmy8YHY3Ca3A2JJVdXnfb3Rrwkng==", + "cpu": [ + "riscv64" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "linux" + ] }, - "@rollup/rollup-linux-s390x-gnu": { + "node_modules/@rollup/rollup-linux-s390x-gnu": { "version": "4.16.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.16.4.tgz", "integrity": "sha512-1xwwn9ZCQYuqGmulGsTZoKrrn0z2fAur2ujE60QgyDpHmBbXbxLaQiEvzJWDrscRq43c8DnuHx3QorhMTZgisQ==", + "cpu": [ + "s390x" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "linux" + ] }, - "@rollup/rollup-linux-x64-gnu": { + "node_modules/@rollup/rollup-linux-x64-gnu": { "version": "4.16.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.16.4.tgz", "integrity": "sha512-LuOGGKAJ7dfRtxVnO1i3qWc6N9sh0Em/8aZ3CezixSTM+E9Oq3OvTsvC4sm6wWjzpsIlOCnZjdluINKESflJLA==", + "cpu": [ + "x64" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "linux" + ] }, - "@rollup/rollup-linux-x64-musl": { + "node_modules/@rollup/rollup-linux-x64-musl": { "version": "4.16.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.16.4.tgz", "integrity": "sha512-ch86i7KkJKkLybDP2AtySFTRi5fM3KXp0PnHocHuJMdZwu7BuyIKi35BE9guMlmTpwwBTB3ljHj9IQXnTCD0vA==", + "cpu": [ + "x64" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "linux" + ] }, - "@rollup/rollup-win32-arm64-msvc": { + "node_modules/@rollup/rollup-win32-arm64-msvc": { "version": "4.16.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.16.4.tgz", "integrity": "sha512-Ma4PwyLfOWZWayfEsNQzTDBVW8PZ6TUUN1uFTBQbF2Chv/+sjenE86lpiEwj2FiviSmSZ4Ap4MaAfl1ciF4aSA==", + "cpu": [ + "arm64" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "win32" + ] }, - "@rollup/rollup-win32-ia32-msvc": { + "node_modules/@rollup/rollup-win32-ia32-msvc": { "version": "4.16.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.16.4.tgz", "integrity": "sha512-9m/ZDrQsdo/c06uOlP3W9G2ENRVzgzbSXmXHT4hwVaDQhYcRpi9bgBT0FTG9OhESxwK0WjQxYOSfv40cU+T69w==", + "cpu": [ + "ia32" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "win32" + ] }, - "@rollup/rollup-win32-x64-msvc": { + "node_modules/@rollup/rollup-win32-x64-msvc": { "version": "4.16.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.16.4.tgz", "integrity": "sha512-YunpoOAyGLDseanENHmbFvQSfVL5BxW3k7hhy0eN4rb3gS/ct75dVD0EXOWIqFT/nE8XYW6LP6vz6ctKRi0k9A==", + "cpu": [ + "x64" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "win32" + ] }, - "@sinclair/typebox": { + "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, - "@types/estree": { + "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, - "@types/json5": { + "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, - "@typescript-eslint/eslint-plugin": { + "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", "integrity": "sha512-PzCr+a/KAef5ZawX7nbyNwBDtM1HdLIT53aSA2DDlxmxMngZ43O8SIePOeX8H5S+FHXeI6t97mTt/dDdzY4Fyw==", "dev": true, - "requires": { + "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "7.10.0", "@typescript-eslint/type-utils": "7.10.0", @@ -717,55 +1194,115 @@ "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "@typescript-eslint/parser": { + "node_modules/@typescript-eslint/parser": { "version": "7.10.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.10.0.tgz", "integrity": "sha512-2EjZMA0LUW5V5tGQiaa2Gys+nKdfrn2xiTIBLR4fxmPmVSvgPcKNW+AE/ln9k0A4zDUti0J/GZXMDupQoI+e1w==", "dev": true, - "requires": { + "dependencies": { "@typescript-eslint/scope-manager": "7.10.0", "@typescript-eslint/types": "7.10.0", "@typescript-eslint/typescript-estree": "7.10.0", "@typescript-eslint/visitor-keys": "7.10.0", "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "@typescript-eslint/scope-manager": { + "node_modules/@typescript-eslint/scope-manager": { "version": "7.10.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.10.0.tgz", "integrity": "sha512-7L01/K8W/VGl7noe2mgH0K7BE29Sq6KAbVmxurj8GGaPDZXPr8EEQ2seOeAS+mEV9DnzxBQB6ax6qQQ5C6P4xg==", "dev": true, - "requires": { + "dependencies": { "@typescript-eslint/types": "7.10.0", "@typescript-eslint/visitor-keys": "7.10.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "@typescript-eslint/type-utils": { + "node_modules/@typescript-eslint/type-utils": { "version": "7.10.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.10.0.tgz", "integrity": "sha512-D7tS4WDkJWrVkuzgm90qYw9RdgBcrWmbbRkrLA4d7Pg3w0ttVGDsvYGV19SH8gPR5L7OtcN5J1hTtyenO9xE9g==", "dev": true, - "requires": { + "dependencies": { "@typescript-eslint/typescript-estree": "7.10.0", "@typescript-eslint/utils": "7.10.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "@typescript-eslint/types": { + "node_modules/@typescript-eslint/types": { "version": "7.10.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.10.0.tgz", "integrity": "sha512-7fNj+Ya35aNyhuqrA1E/VayQX9Elwr8NKZ4WueClR3KwJ7Xx9jcCdOrLW04h51de/+gNbyFMs+IDxh5xIwfbNg==", - "dev": true + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } }, - "@typescript-eslint/typescript-estree": { + "node_modules/@typescript-eslint/typescript-estree": { "version": "7.10.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.10.0.tgz", "integrity": "sha512-LXFnQJjL9XIcxeVfqmNj60YhatpRLt6UhdlFwAkjNc6jSUlK8zQOl1oktAP8PlWFzPQC1jny/8Bai3/HPuvN5g==", "dev": true, - "requires": { + "dependencies": { "@typescript-eslint/types": "7.10.0", "@typescript-eslint/visitor-keys": "7.10.0", "debug": "^4.3.4", @@ -775,61 +1312,94 @@ "semver": "^7.6.0", "ts-api-utils": "^1.3.0" }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true } } }, - "@typescript-eslint/utils": { + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { "version": "7.10.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.10.0.tgz", "integrity": "sha512-olzif1Fuo8R8m/qKkzJqT7qwy16CzPRWBvERS0uvyc+DHd8AKbO4Jb7kpAvVzMmZm8TrHnI7hvjN4I05zow+tg==", "dev": true, - "requires": { + "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.10.0", "@typescript-eslint/types": "7.10.0", "@typescript-eslint/typescript-estree": "7.10.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" } }, - "@typescript-eslint/visitor-keys": { + "node_modules/@typescript-eslint/visitor-keys": { "version": "7.10.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.10.0.tgz", "integrity": "sha512-9ntIVgsi6gg6FIq9xjEO4VQJvwOqA3jaBFQJ/6TK5AvEup2+cECI6Fh7QiBxmfMHXU0V0J4RyPeOU1VDNzl9cg==", "dev": true, - "requires": { + "dependencies": { "@typescript-eslint/types": "7.10.0", "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "@ungap/structured-clone": { + "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, - "@vitest/coverage-istanbul": { + "node_modules/@vitest/coverage-istanbul": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/@vitest/coverage-istanbul/-/coverage-istanbul-1.5.2.tgz", "integrity": "sha512-YGC+QSWOL8cQ2HQaTEFttmG9v3DGLy7lMZIGdqjtTgaW6omW17/uZPxuh6m2t69T0rFLqImduVthm5o/gYYWTQ==", "dev": true, - "requires": { + "dependencies": { "debug": "^4.3.4", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-instrument": "^6.0.1", @@ -839,269 +1409,374 @@ "magicast": "^0.3.3", "picocolors": "^1.0.0", "test-exclude": "^6.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "1.5.2" } }, - "@vitest/expect": { + "node_modules/@vitest/expect": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.5.2.tgz", "integrity": "sha512-rf7MTD1WCoDlN3FfYJ9Llfp0PbdtOMZ3FIF0AVkDnKbp3oiMW1c8AmvRZBcqbAhDUAvF52e9zx4WQM1r3oraVA==", "dev": true, - "requires": { + "dependencies": { "@vitest/spy": "1.5.2", "@vitest/utils": "1.5.2", "chai": "^4.3.10" }, - "dependencies": { - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true - }, - "chai": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", - "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", - "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.0.8" - } - }, - "check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dev": true, - "requires": { - "get-func-name": "^2.0.2" - } - }, - "deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true - } + "funding": { + "url": "https://opencollective.com/vitest" } }, - "@vitest/runner": { + "node_modules/@vitest/expect/node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/@vitest/expect/node_modules/chai": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", + "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.0.8" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vitest/expect/node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@vitest/expect/node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@vitest/expect/node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/@vitest/runner": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.5.2.tgz", "integrity": "sha512-7IJ7sJhMZrqx7HIEpv3WrMYcq8ZNz9L6alo81Y6f8hV5mIE6yVZsFoivLZmr0D777klm1ReqonE9LyChdcmw6g==", "dev": true, - "requires": { + "dependencies": { "@vitest/utils": "1.5.2", "p-limit": "^5.0.0", "pathe": "^1.1.1" }, - "dependencies": { - "p-limit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", - "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", - "dev": true, - "requires": { - "yocto-queue": "^1.0.0" - } - }, - "yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true - } + "funding": { + "url": "https://opencollective.com/vitest" } }, - "@vitest/snapshot": { + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", + "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/snapshot": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.5.2.tgz", "integrity": "sha512-CTEp/lTYos8fuCc9+Z55Ga5NVPKUgExritjF5VY7heRFUfheoAqBneUlvXSUJHUZPjnPmyZA96yLRJDP1QATFQ==", "dev": true, - "requires": { + "dependencies": { "magic-string": "^0.30.5", "pathe": "^1.1.1", "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "@vitest/spy": { + "node_modules/@vitest/spy": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.5.2.tgz", "integrity": "sha512-xCcPvI8JpCtgikT9nLpHPL1/81AYqZy1GCy4+MCHBE7xi8jgsYkULpW5hrx5PGLgOQjUpb6fd15lqcriJ40tfQ==", "dev": true, - "requires": { + "dependencies": { "tinyspy": "^2.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "@vitest/utils": { + "node_modules/@vitest/utils": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.5.2.tgz", "integrity": "sha512-sWOmyofuXLJ85VvXNsroZur7mOJGiQeM0JN3/0D1uU8U9bGFM69X1iqHaRXl6R8BwaLY6yPCogP257zxTzkUdA==", "dev": true, - "requires": { + "dependencies": { "diff-sequences": "^29.6.3", "estree-walker": "^3.0.3", "loupe": "^2.3.7", "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "accepts": { + "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, - "requires": { + "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" } }, - "acorn": { + "node_modules/acorn": { "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } }, - "acorn-jsx": { + "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } }, - "acorn-walk": { + "node_modules/acorn-walk": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.4.0" + } }, - "agent-base": { + "node_modules/agent-base": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "dev": true, - "requires": { + "dependencies": { "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" } }, - "ajv": { + "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "requires": { + "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "ansi-regex": { + "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "ansi-styles": { + "node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "requires": { + "dependencies": { "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "argparse": { + "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, - "array-buffer-byte-length": { + "node_modules/array-buffer-byte-length": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.5", "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "array-includes": { + "node_modules/array-includes": { "version": "3.1.8", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "array-union": { + "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "array.prototype.findlastindex": { + "node_modules/array.prototype.findlastindex": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "array.prototype.flat": { + "node_modules/array.prototype.flat": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "array.prototype.flatmap": { + "node_modules/array.prototype.flatmap": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "arraybuffer.prototype.slice": { + "node_modules/arraybuffer.prototype.slice": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, - "requires": { + "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.5", "define-properties": "^1.2.1", @@ -1110,471 +1785,648 @@ "get-intrinsic": "^1.2.3", "is-array-buffer": "^3.0.4", "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "asynckit": { + "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, - "available-typed-arrays": { + "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, - "requires": { + "dependencies": { "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "axios": { + "node_modules/axios": { "version": "1.6.8", "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", "dev": true, - "requires": { + "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, - "axios-cache-interceptor": { + "node_modules/axios-cache-interceptor": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/axios-cache-interceptor/-/axios-cache-interceptor-1.5.2.tgz", "integrity": "sha512-zrJZ9DZo5hKfrU+SEN/qhXxGD7GWRzwoqJ7sSvxikizUvDhWy/U9BoAbWLZZdyjbHHsfmS1OlQZCDW6o69r4DA==", "dev": true, - "requires": { + "dependencies": { "cache-parser": "1.2.4", "fast-defer": "1.1.8", "object-code": "1.3.3" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/arthurfiorette/axios-cache-interceptor?sponsor=1" + }, + "peerDependencies": { + "axios": "^1" } }, - "balanced-match": { + "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, - "brace-expansion": { + "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "requires": { + "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "braces": { + "node_modules/braces": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, - "requires": { + "dependencies": { "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" } }, - "browserslist": { + "node_modules/browserslist": { "version": "4.23.0", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "dev": true, - "requires": { + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { "caniuse-lite": "^1.0.30001587", "electron-to-chromium": "^1.4.668", "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "bytes": { + "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8" + } }, - "cac": { + "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "cache-content-type": { + "node_modules/cache-content-type": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", "dev": true, - "requires": { + "dependencies": { "mime-types": "^2.1.18", "ylru": "^1.2.0" + }, + "engines": { + "node": ">= 6.0.0" } }, - "cache-parser": { + "node_modules/cache-parser": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/cache-parser/-/cache-parser-1.2.4.tgz", "integrity": "sha512-O0KwuHuJnbHUrghHi2kGp0SxnWSIBXTYt7M8WVhW0kbPRUNUKoE/Of6e1rRD6AAxmfxFunKnt90yEK09D+sc5g==", "dev": true }, - "call-bind": { + "node_modules/call-bind": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "requires": { + "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "callsites": { + "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "caniuse-lite": { + "node_modules/caniuse-lite": { "version": "1.0.30001612", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001612.tgz", "integrity": "sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==", - "dev": true + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] }, - "chalk": { + "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { + "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "co": { + "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } }, - "co-body": { + "node_modules/co-body": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.1.0.tgz", "integrity": "sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==", "dev": true, - "requires": { + "dependencies": { "inflation": "^2.0.0", "qs": "^6.5.2", "raw-body": "^2.3.3", "type-is": "^1.6.16" } }, - "color-convert": { + "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "requires": { + "dependencies": { "color-name": "1.1.3" } }, - "color-name": { + "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, - "combined-stream": { + "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, - "requires": { + "dependencies": { "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "concat-map": { + "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "confbox": { + "node_modules/confbox": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz", "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==", "dev": true }, - "content-disposition": { + "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, - "requires": { + "dependencies": { "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" } }, - "content-type": { + "node_modules/content-type": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "convert-source-map": { + "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, - "cookies": { + "node_modules/cookies": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz", "integrity": "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==", "dev": true, - "requires": { + "dependencies": { "depd": "~2.0.0", "keygrip": "~1.1.0" + }, + "engines": { + "node": ">= 0.8" } }, - "copy-to": { + "node_modules/copy-to": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz", "integrity": "sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==", "dev": true }, - "cross-fetch": { + "node_modules/cross-fetch": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "requires": { + "dependencies": { "node-fetch": "^2.6.12" } }, - "cross-spawn": { + "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, - "requires": { + "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, - "crypto-js": { + "node_modules/crypto-js": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" }, - "cssfontparser": { + "node_modules/cssfontparser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/cssfontparser/-/cssfontparser-1.2.1.tgz", "integrity": "sha512-6tun4LoZnj7VN6YeegOVb67KBX/7JJsqvj+pv3ZA7F878/eN33AbGa5b/S/wXxS/tcp8nc40xRUrsPlxIyNUPg==", "dev": true }, - "cssstyle": { + "node_modules/cssstyle": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.0.1.tgz", "integrity": "sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==", "dev": true, - "requires": { + "dependencies": { "rrweb-cssom": "^0.6.0" + }, + "engines": { + "node": ">=18" } }, - "data-urls": { + "node_modules/data-urls": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", "dev": true, - "requires": { + "dependencies": { "whatwg-mimetype": "^4.0.0", "whatwg-url": "^14.0.0" }, - "dependencies": { - "tr46": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", - "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", - "dev": true, - "requires": { - "punycode": "^2.3.1" - } - }, - "webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true - }, - "whatwg-url": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", - "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", - "dev": true, - "requires": { - "tr46": "^5.0.0", - "webidl-conversions": "^7.0.0" - } - } + "engines": { + "node": ">=18" } }, - "data-view-buffer": { + "node_modules/data-urls/node_modules/tr46": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "dev": true, + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/data-urls/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", + "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", + "dev": true, + "dependencies": { + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/data-view-buffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "data-view-byte-length": { + "node_modules/data-view-byte-length": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "data-view-byte-offset": { + "node_modules/data-view-byte-offset": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "debug": { + "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, - "requires": { + "dependencies": { "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "decimal.js": { + "node_modules/decimal.js": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", "dev": true }, - "deep-equal": { + "node_modules/deep-equal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==", "dev": true }, - "deep-is": { + "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "define-data-property": { + "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "requires": { + "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "define-properties": { + "node_modules/define-properties": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, - "requires": { + "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "delayed-stream": { + "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.4.0" + } }, - "delegates": { + "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", "dev": true }, - "depd": { + "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8" + } }, - "destroy": { + "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } }, - "diff-sequences": { + "node_modules/diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "dir-glob": { + "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, - "requires": { + "dependencies": { "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "doctrine": { + "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, - "requires": { + "dependencies": { "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" } }, - "ee-first": { + "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "dev": true }, - "electron-to-chromium": { + "node_modules/electron-to-chromium": { "version": "1.4.749", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.749.tgz", "integrity": "sha512-LRMMrM9ITOvue0PoBrvNIraVmuDbJV5QC9ierz/z5VilMdPOVMjOtpICNld3PuXuTZ3CHH/UPxX9gHhAPwi+0Q==", "dev": true }, - "encodeurl": { + "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8" + } }, - "entities": { + "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } }, - "es-abstract": { + "node_modules/es-abstract": { "version": "1.23.3", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", "dev": true, - "requires": { + "dependencies": { "array-buffer-byte-length": "^1.0.1", "arraybuffer.prototype.slice": "^1.0.3", "available-typed-arrays": "^1.0.7", @@ -1621,67 +2473,98 @@ "typed-array-length": "^1.0.6", "unbox-primitive": "^1.0.2", "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "es-define-property": { + "node_modules/es-define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "requires": { + "dependencies": { "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" } }, - "es-errors": { + "node_modules/es-errors": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } }, - "es-object-atoms": { + "node_modules/es-object-atoms": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", "dev": true, - "requires": { + "dependencies": { "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" } }, - "es-set-tostringtag": { + "node_modules/es-set-tostringtag": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, - "requires": { + "dependencies": { "get-intrinsic": "^1.2.4", "has-tostringtag": "^1.0.2", "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" } }, - "es-shim-unscopables": { + "node_modules/es-shim-unscopables": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, - "requires": { + "dependencies": { "hasown": "^2.0.0" } }, - "es-to-primitive": { + "node_modules/es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, - "requires": { + "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "esbuild": { + "node_modules/esbuild": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", "dev": true, - "requires": { + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { "@esbuild/android-arm": "0.18.20", "@esbuild/android-arm64": "0.18.20", "@esbuild/android-x64": "0.18.20", @@ -1706,30 +2589,36 @@ "@esbuild/win32-x64": "0.18.20" } }, - "escalade": { + "node_modules/escalade": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "escape-html": { + "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true }, - "escape-string-regexp": { + "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.8.0" + } }, - "eslint": { + "node_modules/eslint": { "version": "8.57.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, - "requires": { + "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", @@ -1769,127 +2658,68 @@ "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, - "dependencies": { - "@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "eslint-import-resolver-node": { + "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, - "requires": { + "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", "resolve": "^1.22.4" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } } }, - "eslint-module-utils": { + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", "dev": true, - "requires": { + "dependencies": { "debug": "^3.2.7" }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true } } }, - "eslint-plugin-import": { + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { "version": "2.29.1", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, - "requires": { + "dependencies": { "array-includes": "^3.1.7", "array.prototype.findlastindex": "^1.2.3", "array.prototype.flat": "^1.3.2", @@ -1908,110 +2738,256 @@ "semver": "^6.3.1", "tsconfig-paths": "^3.15.0" }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, - "eslint-scope": { + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, - "requires": { + "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "eslint-visitor-keys": { + "node_modules/eslint-visitor-keys": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "espree": { + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, - "requires": { + "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "esquery": { + "node_modules/esquery": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, - "requires": { + "dependencies": { "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" } }, - "esrecurse": { + "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "requires": { + "dependencies": { "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" } }, - "estraverse": { + "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true + "dev": true, + "engines": { + "node": ">=4.0" + } }, - "estree-walker": { + "node_modules/estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, - "requires": { + "dependencies": { "@types/estree": "^1.0.0" } }, - "esutils": { + "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "eventemitter3": { + "node_modules/eventemitter3": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" }, - "execa": { + "node_modules/execa": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, - "requires": { + "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", "human-signals": "^5.0.0", @@ -2021,782 +2997,1109 @@ "onetime": "^6.0.0", "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "fast-deep-equal": { + "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, - "fast-defer": { + "node_modules/fast-defer": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/fast-defer/-/fast-defer-1.1.8.tgz", "integrity": "sha512-lEJeOH5VL5R09j6AA0D4Uvq7AgsHw0dAImQQ+F3iSyHZuAxyQfWobsagGpTcOPvJr3urmKRHrs+Gs9hV+/Qm/Q==", "dev": true }, - "fast-glob": { + "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, - "requires": { + "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } + "engines": { + "node": ">=8.6.0" } }, - "fast-json-stable-stringify": { + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, - "fast-levenshtein": { + "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, - "fastq": { + "node_modules/fastq": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, - "requires": { + "dependencies": { "reusify": "^1.0.4" } }, - "file-entry-cache": { + "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, - "requires": { + "dependencies": { "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" } }, - "fill-range": { + "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, - "requires": { + "dependencies": { "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "find-up": { + "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, - "requires": { + "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "flat-cache": { + "node_modules/flat-cache": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, - "requires": { + "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" } }, - "flatted": { + "node_modules/flatted": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, - "follow-redirects": { + "node_modules/follow-redirects": { "version": "1.15.6", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "dev": true + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } }, - "for-each": { + "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, - "requires": { + "dependencies": { "is-callable": "^1.1.3" } }, - "form-data": { + "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, - "requires": { + "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" } }, - "fresh": { + "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "fs.realpath": { + "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, - "fsevents": { + "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "optional": true + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, - "function-bind": { + "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "function.prototype.name": { + "node_modules/function.prototype.name": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1", "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "functions-have-names": { + "node_modules/functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "gensync": { + "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "get-func-name": { + "node_modules/get-func-name": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true + "dev": true, + "engines": { + "node": "*" + } }, - "get-intrinsic": { + "node_modules/get-intrinsic": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "requires": { + "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "get-stream": { + "node_modules/get-stream": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "get-symbol-description": { + "node_modules/get-symbol-description": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "glob": { + "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "requires": { + "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "glob-parent": { + "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "requires": { + "dependencies": { "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" } }, - "globals": { + "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "globalthis": { + "node_modules/globalthis": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, - "requires": { + "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "globby": { + "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, - "requires": { + "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "gopd": { + "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "requires": { + "dependencies": { "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "graphemer": { + "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, - "has-bigints": { + "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "has-flag": { + "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "has-property-descriptors": { + "node_modules/has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "requires": { + "dependencies": { "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "has-proto": { + "node_modules/has-proto": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==" + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "has-symbols": { + "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "has-tostringtag": { + "node_modules/has-tostringtag": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, - "requires": { + "dependencies": { "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "hasown": { + "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "requires": { + "dependencies": { "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" } }, - "html-encoding-sniffer": { + "node_modules/html-encoding-sniffer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", "dev": true, - "requires": { + "dependencies": { "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" } }, - "html-escaper": { + "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "http-assert": { + "node_modules/http-assert": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", "dev": true, - "requires": { + "dependencies": { "deep-equal": "~1.0.1", "http-errors": "~1.8.0" + }, + "engines": { + "node": ">= 0.8" } }, - "http-errors": { + "node_modules/http-errors": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "dev": true, - "requires": { + "dependencies": { "depd": "~1.1.2", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.1" }, - "dependencies": { - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true - } + "engines": { + "node": ">= 0.6" } }, - "http-proxy-agent": { + "node_modules/http-errors/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, - "requires": { + "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" } }, - "https-proxy-agent": { + "node_modules/https-proxy-agent": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", "dev": true, - "requires": { + "dependencies": { "agent-base": "^7.0.2", "debug": "4" + }, + "engines": { + "node": ">= 14" } }, - "human-signals": { + "node_modules/human-signals": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=16.17.0" + } }, - "i18next": { + "node_modules/i18next": { "version": "23.11.2", "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.11.2.tgz", "integrity": "sha512-qMBm7+qT8jdpmmDw/kQD16VpmkL9BdL+XNAK5MNbNFaf1iQQq35ZbPrSlqmnNPOSUY4m342+c0t0evinF5l7sA==", - "requires": { + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "dependencies": { "@babel/runtime": "^7.23.2" } }, - "i18next-browser-languagedetector": { + "node_modules/i18next-browser-languagedetector": { "version": "7.2.1", "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.2.1.tgz", "integrity": "sha512-h/pM34bcH6tbz8WgGXcmWauNpQupCGr25XPp9cZwZInR9XHSjIFDYp1SIok7zSPsTOMxdvuLyu86V+g2Kycnfw==", - "requires": { + "dependencies": { "@babel/runtime": "^7.23.2" } }, - "i18next-http-backend": { + "node_modules/i18next-http-backend": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.5.1.tgz", "integrity": "sha512-+rNX1tghdVxdfjfPt0bI1sNg5ahGW9kA7OboG7b4t03Fp69NdDlRIze6yXhIbN8rbHxJ8IP4dzRm/okZ15lkQg==", - "requires": { + "dependencies": { "cross-fetch": "4.0.0" } }, - "iconv-lite": { + "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, - "requires": { + "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "ignore": { + "node_modules/ignore": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true + "dev": true, + "engines": { + "node": ">= 4" + } }, - "import-fresh": { + "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, - "requires": { + "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "imurmurhash": { + "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.8.19" + } }, - "inflation": { + "node_modules/inflation": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.1.0.tgz", "integrity": "sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8.0" + } }, - "inflight": { + "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, - "requires": { + "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, - "inherits": { + "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "internal-slot": { + "node_modules/internal-slot": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, - "requires": { + "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.0", "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" } }, - "is-array-buffer": { + "node_modules/is-array-buffer": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "is-bigint": { + "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, - "requires": { + "dependencies": { "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "is-boolean-object": { + "node_modules/is-boolean-object": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "is-callable": { + "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "is-core-module": { + "node_modules/is-core-module": { "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, - "requires": { + "dependencies": { "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "is-data-view": { + "node_modules/is-data-view": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", "dev": true, - "requires": { + "dependencies": { "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "is-date-object": { + "node_modules/is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, - "requires": { + "dependencies": { "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "is-extglob": { + "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "is-generator-function": { + "node_modules/is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", "dev": true, - "requires": { + "dependencies": { "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "is-glob": { + "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, - "requires": { + "dependencies": { "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-negative-zero": { + "node_modules/is-negative-zero": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "is-number": { + "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.12.0" + } }, - "is-number-object": { + "node_modules/is-number-object": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, - "requires": { + "dependencies": { "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "is-path-inside": { + "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "is-potential-custom-element-name": { + "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", "dev": true }, - "is-regex": { + "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "is-shared-array-buffer": { + "node_modules/is-shared-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "is-stream": { + "node_modules/is-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "is-string": { + "node_modules/is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, - "requires": { + "dependencies": { "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "is-symbol": { + "node_modules/is-symbol": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, - "requires": { + "dependencies": { "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "is-typed-array": { + "node_modules/is-typed-array": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, - "requires": { + "dependencies": { "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "is-weakref": { + "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "isarray": { + "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" }, - "isexe": { + "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, - "istanbul-lib-coverage": { + "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "istanbul-lib-instrument": { + "node_modules/istanbul-lib-instrument": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", "dev": true, - "requires": { + "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" } }, - "istanbul-lib-report": { + "node_modules/istanbul-lib-report": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, - "requires": { + "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "engines": { + "node": ">=10" } }, - "istanbul-lib-source-maps": { + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.4.tgz", "integrity": "sha512-wHOoEsNJTVltaJp8eVkm8w+GVkVNHT2YDYo53YdzQEL2gWm1hBX5cGFR9hQJtuGLebidVX7et3+dmDZrmclduw==", "dev": true, - "requires": { + "dependencies": { "@jridgewell/trace-mapping": "^0.3.23", "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" } }, - "istanbul-reports": { + "node_modules/istanbul-reports": { "version": "3.1.7", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, - "requires": { + "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "jest-canvas-mock": { + "node_modules/jest-canvas-mock": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jest-canvas-mock/-/jest-canvas-mock-2.5.2.tgz", "integrity": "sha512-vgnpPupjOL6+L5oJXzxTxFrlGEIbHdZqFU+LFNdtLxZ3lRDCl17FlTMM7IatoRQkrcyOTMlDinjUguqmQ6bR2A==", "dev": true, - "requires": { + "dependencies": { "cssfontparser": "^1.2.1", "moo-color": "^1.0.2" } }, - "js-tokens": { + "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, - "js-yaml": { + "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { + "dependencies": { "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "jsdom": { + "node_modules/jsdom": { "version": "24.0.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.0.0.tgz", "integrity": "sha512-UDS2NayCvmXSXVP6mpTj+73JnNQadZlr9N68189xib2tx5Mls7swlTNao26IoHv46BZJFvXygyRtyXd1feAk1A==", "dev": true, - "requires": { + "dependencies": { "cssstyle": "^4.0.1", "data-urls": "^5.0.0", "decimal.js": "^10.4.3", @@ -2819,110 +4122,155 @@ "ws": "^8.16.0", "xml-name-validator": "^5.0.0" }, - "dependencies": { - "tr46": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", - "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", - "dev": true, - "requires": { - "punycode": "^2.3.1" - } - }, - "webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true - }, - "whatwg-url": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", - "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", - "dev": true, - "requires": { - "tr46": "^5.0.0", - "webidl-conversions": "^7.0.0" - } + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^2.11.2" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true } } }, - "jsesc": { + "node_modules/jsdom/node_modules/tr46": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "dev": true, + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/jsdom/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/jsdom/node_modules/whatwg-url": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", + "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", + "dev": true, + "dependencies": { + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } }, - "json-beautify": { + "node_modules/json-beautify": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/json-beautify/-/json-beautify-1.1.1.tgz", "integrity": "sha512-17j+Hk2lado0xqKtUcyAjK0AtoHnPSIgktWRsEXgdFQFG9UnaGw6CHa0J7xsvulxRpFl6CrkDFHght1p5ZJc4A==", - "dev": true + "dev": true, + "bin": { + "json-beautify": "bin/json-beautify" + } }, - "json-buffer": { + "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, - "json-schema-traverse": { + "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "json-stable-stringify": { + "node_modules/json-stable-stringify": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz", "integrity": "sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==", - "requires": { + "dependencies": { "call-bind": "^1.0.5", "isarray": "^2.0.5", "jsonify": "^0.0.1", "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "json-stable-stringify-without-jsonify": { + "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, - "json5": { + "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } }, - "jsonify": { + "node_modules/jsonify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", - "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==" + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "keygrip": { + "node_modules/keygrip": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", "dev": true, - "requires": { + "dependencies": { "tsscmp": "1.0.6" + }, + "engines": { + "node": ">= 0.6" } }, - "keyv": { + "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, - "requires": { + "dependencies": { "json-buffer": "3.0.1" } }, - "koa": { + "node_modules/koa": { "version": "2.15.3", "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.3.tgz", "integrity": "sha512-j/8tY9j5t+GVMLeioLaxweJiKUayFhlGqNTzf2ZGwL0ZCQijd2RLHK0SLW5Tsko8YyyqCZC2cojIb0/s62qTAg==", "dev": true, - "requires": { + "dependencies": { "accepts": "^1.3.5", "cache-content-type": "^1.0.0", "content-disposition": "~0.5.2", @@ -2946,60 +4294,77 @@ "statuses": "^1.5.0", "type-is": "^1.6.16", "vary": "^1.1.2" + }, + "engines": { + "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4" } }, - "koa-bodyparser": { + "node_modules/koa-bodyparser": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/koa-bodyparser/-/koa-bodyparser-4.4.1.tgz", "integrity": "sha512-kBH3IYPMb+iAXnrxIhXnW+gXV8OTzCu8VPDqvcDHW9SQrbkHmqPQtiZwrltNmSq6/lpipHnT7k7PsjlVD7kK0w==", "dev": true, - "requires": { + "dependencies": { "co-body": "^6.0.0", "copy-to": "^2.0.1", "type-is": "^1.6.18" + }, + "engines": { + "node": ">=8.0.0" } }, - "koa-compose": { + "node_modules/koa-compose": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==", "dev": true }, - "koa-convert": { + "node_modules/koa-convert": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz", "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==", "dev": true, - "requires": { + "dependencies": { "co": "^4.6.0", "koa-compose": "^4.1.0" + }, + "engines": { + "node": ">= 10" } }, - "koa-cors": { + "node_modules/koa-cors": { "version": "0.0.16", "resolved": "https://registry.npmjs.org/koa-cors/-/koa-cors-0.0.16.tgz", "integrity": "sha512-s15knPxe3AJBi2I/ZMPL0pSqU+PLYLO6k5tI0AqClkzavowvocPlSdFUwaHNqtjHMhsGmiq2tiX/25iILJx9YA==", "dev": true }, - "koa-router": { + "node_modules/koa-router": { "version": "10.1.1", "resolved": "https://registry.npmjs.org/koa-router/-/koa-router-10.1.1.tgz", "integrity": "sha512-z/OzxVjf5NyuNO3t9nJpx7e1oR3FSBAauiwXtMQu4ppcnuNZzTaQ4p21P8A6r2Es8uJJM339oc4oVW+qX7SqnQ==", + "deprecated": "**IMPORTANT 10x+ PERFORMANCE UPGRADE**: Please upgrade to v12.0.1+ as we have fixed an issue with debuglog causing 10x slower router benchmark performance, see https://github.com/koajs/router/pull/173", "dev": true, - "requires": { + "dependencies": { "debug": "^4.1.1", "http-errors": "^1.7.3", "koa-compose": "^4.1.0", "methods": "^1.1.2", "path-to-regexp": "^6.1.0" + }, + "engines": { + "node": ">= 8.0.0" } }, - "lefthook": { + "node_modules/lefthook": { "version": "1.6.12", "resolved": "https://registry.npmjs.org/lefthook/-/lefthook-1.6.12.tgz", "integrity": "sha512-SoHhB0L1D5twH5KKsGAT1h4qF+RhGfPo/JC5z60H0RDuFWtSwFNOeFpT4Qa7XwM6J9c1fvqZzOH9/4XF7dG9Uw==", "dev": true, - "requires": { + "hasInstallScript": true, + "bin": { + "lefthook": "bin/index.js" + }, + "optionalDependencies": { "lefthook-darwin-arm64": "1.6.12", "lefthook-darwin-x64": "1.6.12", "lefthook-freebsd-arm64": "1.6.12", @@ -3010,521 +4375,729 @@ "lefthook-windows-x64": "1.6.12" } }, - "lefthook-darwin-arm64": { + "node_modules/lefthook-darwin-arm64": { "version": "1.6.12", "resolved": "https://registry.npmjs.org/lefthook-darwin-arm64/-/lefthook-darwin-arm64-1.6.12.tgz", "integrity": "sha512-IJa50i+78nGxtSvnxLSDfSjBjjM7Ixl03V4+yl3Kdn+S+FwzEZet3LYTLbnKFUVy9Bg23obI3yXgwUx+tJjFXg==", + "cpu": [ + "arm64" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "darwin" + ] }, - "lefthook-darwin-x64": { + "node_modules/lefthook-darwin-x64": { "version": "1.6.12", "resolved": "https://registry.npmjs.org/lefthook-darwin-x64/-/lefthook-darwin-x64-1.6.12.tgz", "integrity": "sha512-h11ByUtwM78FShgWgSUyyZtwKW6pjYfYvTygw24c/lZXKjupfowK5Ps5A73hCsjr0AEJNVpgW1S5Jd22gIJJCA==", + "cpu": [ + "x64" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "darwin" + ] }, - "lefthook-freebsd-arm64": { + "node_modules/lefthook-freebsd-arm64": { "version": "1.6.12", "resolved": "https://registry.npmjs.org/lefthook-freebsd-arm64/-/lefthook-freebsd-arm64-1.6.12.tgz", "integrity": "sha512-Aw1+AosL8r/LFSVKG7i8GI1FpHnWFG66/6DBDUgCwNAwhNCXt7tERAM8dj9S6EqmqHCQCC0nI/6qKNBsFPk7Ow==", + "cpu": [ + "arm64" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "freebsd" + ] }, - "lefthook-freebsd-x64": { + "node_modules/lefthook-freebsd-x64": { "version": "1.6.12", "resolved": "https://registry.npmjs.org/lefthook-freebsd-x64/-/lefthook-freebsd-x64-1.6.12.tgz", "integrity": "sha512-G8Dg7UuRstXrqaEA8MSOZikz6PpjPUQu3QmiihzcyGdzI76jFsmjJb2vkrnvMsH9u2gWb3J4sp3TULhbMHXwSw==", + "cpu": [ + "x64" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "freebsd" + ] }, - "lefthook-linux-arm64": { + "node_modules/lefthook-linux-arm64": { "version": "1.6.12", "resolved": "https://registry.npmjs.org/lefthook-linux-arm64/-/lefthook-linux-arm64-1.6.12.tgz", "integrity": "sha512-fwO0i6x5EPelL66EwaySzGzvVbN2vLFZDUWuTi8nZzEgBsCBuG0mORxZg91cNCGLRPT3sgzWPraTkyzIJa7kHg==", + "cpu": [ + "arm64" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "linux" + ] }, - "lefthook-linux-x64": { + "node_modules/lefthook-linux-x64": { "version": "1.6.12", "resolved": "https://registry.npmjs.org/lefthook-linux-x64/-/lefthook-linux-x64-1.6.12.tgz", "integrity": "sha512-pRAZKZhSoirjRwDF0TrqxgkeXtUmJqaUi0kGmMJmutToqo9IXQcnpueVmyV9Z1m6lLJn4PpKoFydY6tFXqvyNQ==", + "cpu": [ + "x64" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "linux" + ] }, - "lefthook-windows-arm64": { + "node_modules/lefthook-windows-arm64": { "version": "1.6.12", "resolved": "https://registry.npmjs.org/lefthook-windows-arm64/-/lefthook-windows-arm64-1.6.12.tgz", "integrity": "sha512-jMMIoqNKtiqGrwyWeN3JXGXi7H7iAXsGB5v4DkcUbdw9y50qhruxWz84I2PoxwYmZVeMxRR+VpYvS7nOvBmzWA==", + "cpu": [ + "arm64" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "win32" + ] }, - "lefthook-windows-x64": { + "node_modules/lefthook-windows-x64": { "version": "1.6.12", "resolved": "https://registry.npmjs.org/lefthook-windows-x64/-/lefthook-windows-x64-1.6.12.tgz", "integrity": "sha512-XqEBVIhp/Fd1Fs+VBlPhrSJlUkyXEJuxQmiYSYow3C18RNpQQrJFVFpz0wE/IDTn2jOXx+p5+hcdlJb+s6bnpA==", + "cpu": [ + "x64" + ], "dev": true, - "optional": true + "optional": true, + "os": [ + "win32" + ] }, - "levn": { + "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, - "requires": { + "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" } }, - "local-pkg": { + "node_modules/local-pkg": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", "dev": true, - "requires": { + "dependencies": { "mlly": "^1.4.2", "pkg-types": "^1.0.3" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" } }, - "locate-path": { + "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, - "requires": { + "dependencies": { "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "lodash.merge": { + "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "loupe": { + "node_modules/loupe": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dev": true, - "requires": { + "dependencies": { "get-func-name": "^2.0.1" } }, - "lru-cache": { + "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, - "requires": { + "dependencies": { "yallist": "^3.0.2" } }, - "magic-string": { + "node_modules/magic-string": { "version": "0.30.10", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", "dev": true, - "requires": { + "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, - "magicast": { + "node_modules/magicast": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.4.tgz", "integrity": "sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==", "dev": true, - "requires": { + "dependencies": { "@babel/parser": "^7.24.4", "@babel/types": "^7.24.0", "source-map-js": "^1.2.0" } }, - "make-dir": { + "node_modules/make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, - "requires": { + "dependencies": { "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "media-typer": { + "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "merge-stream": { + "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "merge2": { + "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 8" + } }, - "methods": { + "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "micromatch": { + "node_modules/micromatch": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.6.tgz", "integrity": "sha512-Y4Ypn3oujJYxJcMacVgcs92wofTHxp9FzfDpQON4msDefoC0lb3ETvQLOdLcbhSwU1bz8HrL/1sygfBIHudrkQ==", "dev": true, - "requires": { + "dependencies": { "braces": "^3.0.3", "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=8.6" } }, - "mime-db": { + "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "mime-types": { + "node_modules/mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, - "requires": { + "dependencies": { "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" } }, - "mimic-fn": { + "node_modules/mimic-fn": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "minimatch": { + "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "requires": { + "dependencies": { "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "minimist": { + "node_modules/minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "mlly": { + "node_modules/mlly": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.6.1.tgz", "integrity": "sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==", "dev": true, - "requires": { + "dependencies": { "acorn": "^8.11.3", "pathe": "^1.1.2", "pkg-types": "^1.0.3", "ufo": "^1.3.2" } }, - "moo-color": { + "node_modules/moo-color": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/moo-color/-/moo-color-1.0.3.tgz", "integrity": "sha512-i/+ZKXMDf6aqYtBhuOcej71YSlbjT3wCO/4H1j8rPvxDJEifdwgg5MaFyu6iYAT8GBZJg2z0dkgK4YMzvURALQ==", "dev": true, - "requires": { - "color-name": "^1.1.4" - }, "dependencies": { - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } + "color-name": "^1.1.4" } }, - "ms": { + "node_modules/moo-color/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "mustache": { + "node_modules/mustache": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==" + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "bin": { + "mustache": "bin/mustache" + } }, - "nanoid": { + "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } }, - "natural-compare": { + "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "negotiator": { + "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "node-fetch": { + "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "requires": { + "dependencies": { "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "node-releases": { + "node_modules/node-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, - "npm-run-path": { + "node_modules/npm-run-path": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, - "requires": { + "dependencies": { "path-key": "^4.0.0" }, - "dependencies": { - "path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true - } + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "nwsapi": { + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nwsapi": { "version": "2.2.9", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.9.tgz", "integrity": "sha512-2f3F0SEEer8bBu0dsNCFF50N0cTThV1nWFYcEYFZttdW0lDAoybv9cQoK7X7/68Z89S7FoRrVjP1LPX4XRf9vg==", "dev": true }, - "object-code": { + "node_modules/object-code": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/object-code/-/object-code-1.3.3.tgz", "integrity": "sha512-/Ds4Xd5xzrtUOJ+xJQ57iAy0BZsZltOHssnDgcZ8DOhgh41q1YJCnTPnWdWSLkNGNnxYzhYChjc5dgC9mEERCA==", "dev": true }, - "object-inspect": { + "node_modules/object-inspect": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "object-keys": { + "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } }, - "object.assign": { + "node_modules/object.assign": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.5", "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "object.fromentries": { + "node_modules/object.fromentries": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "object.groupby": { + "node_modules/object.groupby": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" } }, - "object.values": { + "node_modules/object.values": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "on-finished": { + "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, - "requires": { + "dependencies": { "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" } }, - "once": { + "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, - "requires": { + "dependencies": { "wrappy": "1" } }, - "onetime": { + "node_modules/onetime": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, - "requires": { + "dependencies": { "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "only": { + "node_modules/only": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==", "dev": true }, - "optionator": { + "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, - "requires": { + "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" } }, - "p-limit": { + "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "requires": { + "dependencies": { "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "p-locate": { + "node_modules/p-locate": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "requires": { + "dependencies": { "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "papaparse": { + "node_modules/papaparse": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.4.1.tgz", "integrity": "sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==" }, - "parent-module": { + "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "requires": { + "dependencies": { "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "parse5": { + "node_modules/parse5": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "dev": true, - "requires": { + "dependencies": { "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "parseurl": { + "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8" + } }, - "path-exists": { + "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "path-is-absolute": { + "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "path-key": { + "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "path-parse": { + "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, - "path-to-regexp": { + "node_modules/path-to-regexp": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", "dev": true }, - "path-type": { + "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "pathe": { + "node_modules/pathe": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", "dev": true }, - "phaser": { + "node_modules/phaser": { "version": "3.80.1", "resolved": "https://registry.npmjs.org/phaser/-/phaser-3.80.1.tgz", "integrity": "sha512-VQGAWoDOkEpAWYkI+PUADv5Ql+SM0xpLuAMBJHz9tBcOLqjJ2wd8bUhxJgOqclQlLTg97NmMd9MhS75w16x1Cw==", - "requires": { + "dependencies": { "eventemitter3": "^5.0.1" } }, - "phaser3-rex-plugins": { + "node_modules/phaser3-rex-plugins": { "version": "1.80.2", "resolved": "https://registry.npmjs.org/phaser3-rex-plugins/-/phaser3-rex-plugins-1.80.2.tgz", "integrity": "sha512-ZPA4c47WQRU6rqLdlOFizGU+ljtP4C2blhcpbYSsNMqNRHD7o8vRBEzEhl8w6CMGvcy+eVoA6v10cyL4eIZARw==", - "requires": { + "dependencies": { "eventemitter3": "^3.1.2", "i18next": "^22.5.1", "i18next-http-backend": "^2.5.0", @@ -3532,1076 +5105,1756 @@ "mustache": "^4.2.0", "papaparse": "^5.4.1", "webfontloader": "^1.6.28" - }, - "dependencies": { - "eventemitter3": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" - }, - "i18next": { - "version": "22.5.1", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-22.5.1.tgz", - "integrity": "sha512-8TGPgM3pAD+VRsMtUMNknRz3kzqwp/gPALrWMsDnmC1mKqJwpWyooQRLMcbTwq8z8YwSmuj+ZYvc+xCuEpkssA==", - "requires": { - "@babel/runtime": "^7.20.6" - } - } } }, - "phaser3spectorjs": { + "node_modules/phaser3-rex-plugins/node_modules/eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" + }, + "node_modules/phaser3-rex-plugins/node_modules/i18next": { + "version": "22.5.1", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-22.5.1.tgz", + "integrity": "sha512-8TGPgM3pAD+VRsMtUMNknRz3kzqwp/gPALrWMsDnmC1mKqJwpWyooQRLMcbTwq8z8YwSmuj+ZYvc+xCuEpkssA==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "dependencies": { + "@babel/runtime": "^7.20.6" + } + }, + "node_modules/phaser3spectorjs": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/phaser3spectorjs/-/phaser3spectorjs-0.0.8.tgz", "integrity": "sha512-0dSO7/aMjEUPrp5EcjRvRRsEf+jXDbmzalPeJ6VtTB2Pn1PeaKc+qlL/DmO3l1Dvc5lkzc+Sil1Ta+Hkyi5cbA==", "dev": true }, - "picocolors": { + "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, - "picomatch": { + "node_modules/picomatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, - "pkg-types": { + "node_modules/pkg-types": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.0.tgz", "integrity": "sha512-/RpmvKdxKf8uILTtoOhAgf30wYbP2Qw+L9p3Rvshx1JZVX+XQNZQFjlbmGHEGIm4CkVPlSn+NXmIM8+9oWQaSA==", "dev": true, - "requires": { + "dependencies": { "confbox": "^0.1.7", "mlly": "^1.6.1", "pathe": "^1.1.2" } }, - "pokenode-ts": { + "node_modules/pokenode-ts": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/pokenode-ts/-/pokenode-ts-1.20.0.tgz", "integrity": "sha512-6MekrbiQc9nmaZJ5xpyhRSEMFo4xEsMuB7RR3EqfPvuXo/3StnH1p4brfIiIWDCcZvu7t9a0vjodiR4TnRdLEw==", - "dev": true + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/Gabb-c/pokenode-ts?sponsor=1" + }, + "peerDependencies": { + "axios": "^1.4.0", + "axios-cache-interceptor": "^1.2.0" + } }, - "possible-typed-array-names": { + "node_modules/possible-typed-array-names": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.4" + } }, - "postcss": { + "node_modules/postcss": { "version": "8.4.38", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "dev": true, - "requires": { + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" } }, - "prelude-ls": { + "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8.0" + } }, - "pretty-format": { + "node_modules/pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, - "requires": { + "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "proxy-from-env": { + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "dev": true }, - "psl": { + "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", "dev": true }, - "punycode": { + "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "qs": { + "node_modules/qs": { "version": "6.12.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==", "dev": true, - "requires": { + "dependencies": { "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "querystringify": { + "node_modules/querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", "dev": true }, - "queue-microtask": { + "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "raw-body": { + "node_modules/raw-body": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, - "requires": { + "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, - "dependencies": { - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - } + "engines": { + "node": ">= 0.8" } }, - "react-is": { + "node_modules/raw-body/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/raw-body/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react-is": { "version": "18.3.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.0.tgz", "integrity": "sha512-wRiUsea88TjKDc4FBEn+sLvIDesp6brMbGWnJGjew2waAc9evdhja/2LvePc898HJbHw0L+MTWy7NhpnELAvLQ==", "dev": true }, - "regenerator-runtime": { + "node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, - "regexp.prototype.flags": { + "node_modules/regexp.prototype.flags": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.6", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "requires-port": { + "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, - "resolve": { + "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, - "requires": { + "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "resolve-from": { + "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "reusify": { + "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } }, - "rimraf": { + "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, - "requires": { + "dependencies": { "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "rollup": { + "node_modules/rollup": { "version": "3.29.4", "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", "dev": true, - "requires": { + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { "fsevents": "~2.3.2" } }, - "rrweb-cssom": { + "node_modules/rrweb-cssom": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", "dev": true }, - "run-parallel": { + "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, - "requires": { + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { "queue-microtask": "^1.2.2" } }, - "safe-array-concat": { + "node_modules/safe-array-concat": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.7", "get-intrinsic": "^1.2.4", "has-symbols": "^1.0.3", "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "safe-buffer": { + "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "safe-regex-test": { + "node_modules/safe-regex-test": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "safer-buffer": { + "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, - "saxes": { + "node_modules/saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", "dev": true, - "requires": { + "dependencies": { "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" } }, - "semver": { + "node_modules/semver": { "version": "7.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, - "requires": { + "dependencies": { "lru-cache": "^6.0.0" }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "set-function-length": { + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "requires": { + "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" } }, - "set-function-name": { + "node_modules/set-function-name": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, - "requires": { + "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" } }, - "setprototypeof": { + "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true }, - "shebang-command": { + "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "requires": { + "dependencies": { "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "shebang-regex": { + "node_modules/shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "side-channel": { + "node_modules/side-channel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.4", "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "siginfo": { + "node_modules/siginfo": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "dev": true }, - "signal-exit": { + "node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "slash": { + "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "source-map-js": { + "node_modules/source-map-js": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "stackback": { + "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true }, - "statuses": { + "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "std-env": { + "node_modules/std-env": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", "dev": true }, - "string.prototype.trim": { + "node_modules/string.prototype.trim": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.0", "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "string.prototype.trimend": { + "node_modules/string.prototype.trimend": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "string.prototype.trimstart": { + "node_modules/string.prototype.trimstart": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "strip-ansi": { + "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "requires": { + "dependencies": { "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "strip-bom": { + "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "strip-final-newline": { + "node_modules/strip-final-newline": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "strip-json-comments": { + "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "strip-literal": { + "node_modules/strip-literal": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.0.tgz", "integrity": "sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==", "dev": true, - "requires": { + "dependencies": { "js-tokens": "^9.0.0" }, - "dependencies": { - "js-tokens": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz", - "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==", - "dev": true - } + "funding": { + "url": "https://github.com/sponsors/antfu" } }, - "supports-color": { + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz", + "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==", + "dev": true + }, + "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "requires": { + "dependencies": { "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "supports-preserve-symlinks-flag": { + "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "symbol-tree": { + "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, - "test-exclude": { + "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, - "requires": { + "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" } }, - "text-table": { + "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, - "tinybench": { + "node_modules/tinybench": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.8.0.tgz", "integrity": "sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==", "dev": true }, - "tinypool": { + "node_modules/tinypool": { "version": "0.8.4", "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=14.0.0" + } }, - "tinyspy": { + "node_modules/tinyspy": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", - "dev": true + "dev": true, + "engines": { + "node": ">=14.0.0" + } }, - "to-fast-properties": { + "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "to-regex-range": { + "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "requires": { + "dependencies": { "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, - "toidentifier": { + "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.6" + } }, - "tough-cookie": { + "node_modules/tough-cookie": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "dev": true, - "requires": { + "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", "universalify": "^0.2.0", "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" } }, - "tr46": { + "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, - "ts-api-utils": { + "node_modules/ts-api-utils": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } }, - "tsconfig-paths": { + "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, - "requires": { + "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } } }, - "tsscmp": { + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsscmp": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.6.x" + } }, - "type-check": { + "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, - "requires": { + "dependencies": { "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" } }, - "type-detect": { + "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "type-fest": { + "node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "type-is": { + "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, - "requires": { + "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" } }, - "typed-array-buffer": { + "node_modules/typed-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" } }, - "typed-array-byte-length": { + "node_modules/typed-array-byte-length": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-proto": "^1.0.3", "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "typed-array-byte-offset": { + "node_modules/typed-array-byte-offset": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, - "requires": { + "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-proto": "^1.0.3", "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "typed-array-length": { + "node_modules/typed-array-length": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-proto": "^1.0.3", "is-typed-array": "^1.1.13", "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "typescript": { + "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==", - "dev": true + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } }, - "typescript-eslint": { + "node_modules/typescript-eslint": { "version": "7.10.0", "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-7.10.0.tgz", "integrity": "sha512-thO8nyqptXdfWHQrMJJiJyftpW8aLmwRNs11xA8pSrXneoclFPstQZqXvDWuH1WNL4CHffqHvYUeCHTit6yfhQ==", "dev": true, - "requires": { + "dependencies": { "@typescript-eslint/eslint-plugin": "7.10.0", "@typescript-eslint/parser": "7.10.0", "@typescript-eslint/utils": "7.10.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "ufo": { + "node_modules/ufo": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz", "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==", "dev": true }, - "unbox-primitive": { + "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "universalify": { + "node_modules/universalify": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 4.0.0" + } }, - "unpipe": { + "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8" + } }, - "update-browserslist-db": { + "node_modules/update-browserslist-db": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, - "requires": { + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "uri-js": { + "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, - "requires": { + "dependencies": { "punycode": "^2.1.0" } }, - "url-parse": { + "node_modules/url-parse": { "version": "1.5.10", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "dev": true, - "requires": { + "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" } }, - "vary": { + "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8" + } }, - "vite": { + "node_modules/vite": { "version": "4.5.3", "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.3.tgz", "integrity": "sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==", "dev": true, - "requires": { + "dependencies": { "esbuild": "^0.18.10", - "fsevents": "~2.3.2", "postcss": "^8.4.27", "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } } }, - "vite-node": { + "node_modules/vite-node": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.5.2.tgz", "integrity": "sha512-Y8p91kz9zU+bWtF7HGt6DVw2JbhyuB2RlZix3FPYAYmUyZ3n7iTp8eSyLyY6sxtPegvxQtmlTMhfPhUfCUF93A==", "dev": true, - "requires": { + "dependencies": { "cac": "^6.7.14", "debug": "^4.3.4", "pathe": "^1.1.1", "picocolors": "^1.0.0", "vite": "^5.0.0" }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-node/node_modules/@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } + }, + "node_modules/vite-node/node_modules/rollup": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.16.4.tgz", + "integrity": "sha512-kuaTJSUbz+Wsb2ATGvEknkI12XV40vIiHmLuFlejoo7HtDok/O5eDDD0UpCVY5bBX5U5RYo8wWP83H7ZsqVEnA==", + "dev": true, "dependencies": { - "@esbuild/android-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", - "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", - "dev": true, + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.16.4", + "@rollup/rollup-android-arm64": "4.16.4", + "@rollup/rollup-darwin-arm64": "4.16.4", + "@rollup/rollup-darwin-x64": "4.16.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.16.4", + "@rollup/rollup-linux-arm-musleabihf": "4.16.4", + "@rollup/rollup-linux-arm64-gnu": "4.16.4", + "@rollup/rollup-linux-arm64-musl": "4.16.4", + "@rollup/rollup-linux-powerpc64le-gnu": "4.16.4", + "@rollup/rollup-linux-riscv64-gnu": "4.16.4", + "@rollup/rollup-linux-s390x-gnu": "4.16.4", + "@rollup/rollup-linux-x64-gnu": "4.16.4", + "@rollup/rollup-linux-x64-musl": "4.16.4", + "@rollup/rollup-win32-arm64-msvc": "4.16.4", + "@rollup/rollup-win32-ia32-msvc": "4.16.4", + "@rollup/rollup-win32-x64-msvc": "4.16.4", + "fsevents": "~2.3.2" + } + }, + "node_modules/vite-node/node_modules/vite": { + "version": "5.2.10", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.10.tgz", + "integrity": "sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==", + "dev": true, + "dependencies": { + "esbuild": "^0.20.1", + "postcss": "^8.4.38", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { "optional": true }, - "@esbuild/android-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", - "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", - "dev": true, + "less": { "optional": true }, - "@esbuild/android-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", - "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", - "dev": true, + "lightningcss": { "optional": true }, - "@esbuild/darwin-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", - "dev": true, + "sass": { "optional": true }, - "@esbuild/darwin-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", - "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", - "dev": true, + "stylus": { "optional": true }, - "@esbuild/freebsd-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", - "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", - "dev": true, + "sugarss": { "optional": true }, - "@esbuild/freebsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", - "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", - "dev": true, + "terser": { "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", - "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", - "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", - "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", - "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", - "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", - "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", - "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", - "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", - "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", - "dev": true, - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", - "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", - "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", - "dev": true, - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", - "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", - "dev": true, - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", - "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", - "dev": true, - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", - "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", - "dev": true, - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", - "dev": true, - "optional": true - }, - "esbuild": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", - "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", - "dev": true, - "requires": { - "@esbuild/aix-ppc64": "0.20.2", - "@esbuild/android-arm": "0.20.2", - "@esbuild/android-arm64": "0.20.2", - "@esbuild/android-x64": "0.20.2", - "@esbuild/darwin-arm64": "0.20.2", - "@esbuild/darwin-x64": "0.20.2", - "@esbuild/freebsd-arm64": "0.20.2", - "@esbuild/freebsd-x64": "0.20.2", - "@esbuild/linux-arm": "0.20.2", - "@esbuild/linux-arm64": "0.20.2", - "@esbuild/linux-ia32": "0.20.2", - "@esbuild/linux-loong64": "0.20.2", - "@esbuild/linux-mips64el": "0.20.2", - "@esbuild/linux-ppc64": "0.20.2", - "@esbuild/linux-riscv64": "0.20.2", - "@esbuild/linux-s390x": "0.20.2", - "@esbuild/linux-x64": "0.20.2", - "@esbuild/netbsd-x64": "0.20.2", - "@esbuild/openbsd-x64": "0.20.2", - "@esbuild/sunos-x64": "0.20.2", - "@esbuild/win32-arm64": "0.20.2", - "@esbuild/win32-ia32": "0.20.2", - "@esbuild/win32-x64": "0.20.2" - } - }, - "rollup": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.16.4.tgz", - "integrity": "sha512-kuaTJSUbz+Wsb2ATGvEknkI12XV40vIiHmLuFlejoo7HtDok/O5eDDD0UpCVY5bBX5U5RYo8wWP83H7ZsqVEnA==", - "dev": true, - "requires": { - "@rollup/rollup-android-arm-eabi": "4.16.4", - "@rollup/rollup-android-arm64": "4.16.4", - "@rollup/rollup-darwin-arm64": "4.16.4", - "@rollup/rollup-darwin-x64": "4.16.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.16.4", - "@rollup/rollup-linux-arm-musleabihf": "4.16.4", - "@rollup/rollup-linux-arm64-gnu": "4.16.4", - "@rollup/rollup-linux-arm64-musl": "4.16.4", - "@rollup/rollup-linux-powerpc64le-gnu": "4.16.4", - "@rollup/rollup-linux-riscv64-gnu": "4.16.4", - "@rollup/rollup-linux-s390x-gnu": "4.16.4", - "@rollup/rollup-linux-x64-gnu": "4.16.4", - "@rollup/rollup-linux-x64-musl": "4.16.4", - "@rollup/rollup-win32-arm64-msvc": "4.16.4", - "@rollup/rollup-win32-ia32-msvc": "4.16.4", - "@rollup/rollup-win32-x64-msvc": "4.16.4", - "@types/estree": "1.0.5", - "fsevents": "~2.3.2" - } - }, - "vite": { - "version": "5.2.10", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.10.tgz", - "integrity": "sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==", - "dev": true, - "requires": { - "esbuild": "^0.20.1", - "fsevents": "~2.3.3", - "postcss": "^8.4.38", - "rollup": "^4.13.0" - } } } }, - "vite-plugin-fs": { + "node_modules/vite-plugin-fs": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/vite-plugin-fs/-/vite-plugin-fs-0.4.4.tgz", "integrity": "sha512-TT9kEU2LX3musejDL99nLdjDl7P74AdTnK3yozehswg0FhKSGlNstkHVUgcswKSk6vH/Uzqgz+df7WT0sEA/IA==", "dev": true, - "requires": { + "dependencies": { "koa": "^2.13.4", "koa-bodyparser": "^4.3.0", "koa-cors": "^0.0.16", "koa-router": "^10.1.1" + }, + "engines": { + "node": ">=14" } }, - "vitest": { + "node_modules/vitest": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.5.2.tgz", "integrity": "sha512-l9gwIkq16ug3xY7BxHwcBQovLZG75zZL0PlsiYQbf76Rz6QGs54416UWMtC0jXeihvHvcHrf2ROEjkQRVpoZYw==", "dev": true, - "requires": { + "dependencies": { "@vitest/expect": "1.5.2", "@vitest/runner": "1.5.2", "@vitest/snapshot": "1.5.2", @@ -4623,421 +6876,791 @@ "vite-node": "1.5.2", "why-is-node-running": "^2.2.2" }, - "dependencies": { - "@esbuild/android-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", - "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", - "dev": true, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "1.5.2", + "@vitest/ui": "1.5.2", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { "optional": true }, - "@esbuild/android-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", - "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", - "dev": true, + "@types/node": { "optional": true }, - "@esbuild/android-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", - "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", - "dev": true, + "@vitest/browser": { "optional": true }, - "@esbuild/darwin-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", - "dev": true, + "@vitest/ui": { "optional": true }, - "@esbuild/darwin-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", - "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", - "dev": true, + "happy-dom": { "optional": true }, - "@esbuild/freebsd-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", - "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", - "dev": true, + "jsdom": { "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", - "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", - "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", - "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", - "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", - "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", - "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", - "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", - "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", - "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", - "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", - "dev": true, - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", - "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", - "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", - "dev": true, - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", - "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", - "dev": true, - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", - "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", - "dev": true, - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", - "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", - "dev": true, - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", - "dev": true, - "optional": true - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true - }, - "chai": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", - "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", - "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.0.8" - } - }, - "check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dev": true, - "requires": { - "get-func-name": "^2.0.2" - } - }, - "deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "esbuild": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", - "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", - "dev": true, - "requires": { - "@esbuild/aix-ppc64": "0.20.2", - "@esbuild/android-arm": "0.20.2", - "@esbuild/android-arm64": "0.20.2", - "@esbuild/android-x64": "0.20.2", - "@esbuild/darwin-arm64": "0.20.2", - "@esbuild/darwin-x64": "0.20.2", - "@esbuild/freebsd-arm64": "0.20.2", - "@esbuild/freebsd-x64": "0.20.2", - "@esbuild/linux-arm": "0.20.2", - "@esbuild/linux-arm64": "0.20.2", - "@esbuild/linux-ia32": "0.20.2", - "@esbuild/linux-loong64": "0.20.2", - "@esbuild/linux-mips64el": "0.20.2", - "@esbuild/linux-ppc64": "0.20.2", - "@esbuild/linux-riscv64": "0.20.2", - "@esbuild/linux-s390x": "0.20.2", - "@esbuild/linux-x64": "0.20.2", - "@esbuild/netbsd-x64": "0.20.2", - "@esbuild/openbsd-x64": "0.20.2", - "@esbuild/sunos-x64": "0.20.2", - "@esbuild/win32-arm64": "0.20.2", - "@esbuild/win32-ia32": "0.20.2", - "@esbuild/win32-x64": "0.20.2" - } - }, - "pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true - }, - "rollup": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.16.4.tgz", - "integrity": "sha512-kuaTJSUbz+Wsb2ATGvEknkI12XV40vIiHmLuFlejoo7HtDok/O5eDDD0UpCVY5bBX5U5RYo8wWP83H7ZsqVEnA==", - "dev": true, - "requires": { - "@rollup/rollup-android-arm-eabi": "4.16.4", - "@rollup/rollup-android-arm64": "4.16.4", - "@rollup/rollup-darwin-arm64": "4.16.4", - "@rollup/rollup-darwin-x64": "4.16.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.16.4", - "@rollup/rollup-linux-arm-musleabihf": "4.16.4", - "@rollup/rollup-linux-arm64-gnu": "4.16.4", - "@rollup/rollup-linux-arm64-musl": "4.16.4", - "@rollup/rollup-linux-powerpc64le-gnu": "4.16.4", - "@rollup/rollup-linux-riscv64-gnu": "4.16.4", - "@rollup/rollup-linux-s390x-gnu": "4.16.4", - "@rollup/rollup-linux-x64-gnu": "4.16.4", - "@rollup/rollup-linux-x64-musl": "4.16.4", - "@rollup/rollup-win32-arm64-msvc": "4.16.4", - "@rollup/rollup-win32-ia32-msvc": "4.16.4", - "@rollup/rollup-win32-x64-msvc": "4.16.4", - "@types/estree": "1.0.5", - "fsevents": "~2.3.2" - } - }, - "vite": { - "version": "5.2.10", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.10.tgz", - "integrity": "sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==", - "dev": true, - "requires": { - "esbuild": "^0.20.1", - "fsevents": "~2.3.3", - "postcss": "^8.4.38", - "rollup": "^4.13.0" - } } } }, - "vitest-canvas-mock": { + "node_modules/vitest-canvas-mock": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/vitest-canvas-mock/-/vitest-canvas-mock-0.3.3.tgz", "integrity": "sha512-3P968tYBpqYyzzOaVtqnmYjqbe13576/fkjbDEJSfQAkHtC5/UjuRHOhFEN/ZV5HVZIkaROBUWgazDKJ+Ibw+Q==", "dev": true, - "requires": { + "dependencies": { "jest-canvas-mock": "~2.5.2" + }, + "peerDependencies": { + "vitest": "*" } }, - "w3c-xmlserializer": { + "node_modules/vitest/node_modules/@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vitest/node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/vitest/node_modules/chai": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", + "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.0.8" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/vitest/node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/vitest/node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/vitest/node_modules/esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } + }, + "node_modules/vitest/node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/vitest/node_modules/rollup": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.16.4.tgz", + "integrity": "sha512-kuaTJSUbz+Wsb2ATGvEknkI12XV40vIiHmLuFlejoo7HtDok/O5eDDD0UpCVY5bBX5U5RYo8wWP83H7ZsqVEnA==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.16.4", + "@rollup/rollup-android-arm64": "4.16.4", + "@rollup/rollup-darwin-arm64": "4.16.4", + "@rollup/rollup-darwin-x64": "4.16.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.16.4", + "@rollup/rollup-linux-arm-musleabihf": "4.16.4", + "@rollup/rollup-linux-arm64-gnu": "4.16.4", + "@rollup/rollup-linux-arm64-musl": "4.16.4", + "@rollup/rollup-linux-powerpc64le-gnu": "4.16.4", + "@rollup/rollup-linux-riscv64-gnu": "4.16.4", + "@rollup/rollup-linux-s390x-gnu": "4.16.4", + "@rollup/rollup-linux-x64-gnu": "4.16.4", + "@rollup/rollup-linux-x64-musl": "4.16.4", + "@rollup/rollup-win32-arm64-msvc": "4.16.4", + "@rollup/rollup-win32-ia32-msvc": "4.16.4", + "@rollup/rollup-win32-x64-msvc": "4.16.4", + "fsevents": "~2.3.2" + } + }, + "node_modules/vitest/node_modules/vite": { + "version": "5.2.10", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.10.tgz", + "integrity": "sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==", + "dev": true, + "dependencies": { + "esbuild": "^0.20.1", + "postcss": "^8.4.38", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/w3c-xmlserializer": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", "dev": true, - "requires": { + "dependencies": { "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" } }, - "webfontloader": { + "node_modules/webfontloader": { "version": "1.6.28", "resolved": "https://registry.npmjs.org/webfontloader/-/webfontloader-1.6.28.tgz", "integrity": "sha512-Egb0oFEga6f+nSgasH3E0M405Pzn6y3/9tOVanv/DLfa1YBIgcv90L18YyWnvXkRbIM17v5Kv6IT2N6g1x5tvQ==" }, - "webidl-conversions": { + "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, - "whatwg-encoding": { + "node_modules/whatwg-encoding": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", "dev": true, - "requires": { + "dependencies": { "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" } }, - "whatwg-mimetype": { + "node_modules/whatwg-mimetype": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "dev": true + "dev": true, + "engines": { + "node": ">=18" + } }, - "whatwg-url": { + "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "requires": { + "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, - "which": { + "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "requires": { + "dependencies": { "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "which-boxed-primitive": { + "node_modules/which-boxed-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, - "requires": { + "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", "is-number-object": "^1.0.4", "is-string": "^1.0.5", "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "which-typed-array": { + "node_modules/which-typed-array": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, - "requires": { + "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "why-is-node-running": { + "node_modules/why-is-node-running": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", "dev": true, - "requires": { + "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" } }, - "word-wrap": { + "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "wrappy": { + "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, - "ws": { + "node_modules/ws": { "version": "8.16.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } }, - "xml-name-validator": { + "node_modules/xml-name-validator": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", - "dev": true + "dev": true, + "engines": { + "node": ">=18" + } }, - "xmlchars": { + "node_modules/xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, - "yallist": { + "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, - "ylru": { + "node_modules/ylru": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.4.0.tgz", "integrity": "sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==", - "dev": true + "dev": true, + "engines": { + "node": ">= 4.0.0" + } }, - "yocto-queue": { + "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/package.json b/package.json index 2f2d711ce47..a477bbe8cbf 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "phaser3-rex-plugins": "^1.1.84" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" }, "imports": { "#app": "./src/main.js", diff --git a/public/images/pokemon/164.png b/public/images/pokemon/164.png index a9fb558318e..c172959d338 100644 Binary files a/public/images/pokemon/164.png and b/public/images/pokemon/164.png differ diff --git a/public/images/pokemon/370.png b/public/images/pokemon/370.png index 4bac9f9b833..c53d42f9cd3 100644 Binary files a/public/images/pokemon/370.png and b/public/images/pokemon/370.png differ diff --git a/public/images/pokemon/778.png b/public/images/pokemon/778.png index 8390d89e60f..97397e9414c 100644 Binary files a/public/images/pokemon/778.png and b/public/images/pokemon/778.png differ diff --git a/public/images/pokemon/892-gigantamax-rapid.png b/public/images/pokemon/892-gigantamax-rapid.png index 4eb2d75e736..99d50a3f6fb 100644 Binary files a/public/images/pokemon/892-gigantamax-rapid.png and b/public/images/pokemon/892-gigantamax-rapid.png differ diff --git a/public/images/pokemon/892-rapid-strike.png b/public/images/pokemon/892-rapid-strike.png index 6e231169e0f..4f7a352bcd7 100644 Binary files a/public/images/pokemon/892-rapid-strike.png and b/public/images/pokemon/892-rapid-strike.png differ diff --git a/public/images/pokemon/898-ice.png b/public/images/pokemon/898-ice.png index f619da6c751..7542313f156 100644 Binary files a/public/images/pokemon/898-ice.png and b/public/images/pokemon/898-ice.png differ diff --git a/public/images/pokemon/898-shadow.png b/public/images/pokemon/898-shadow.png index e6f32176686..30bdbe224ec 100644 Binary files a/public/images/pokemon/898-shadow.png and b/public/images/pokemon/898-shadow.png differ diff --git a/public/images/pokemon/back/412-sandy.png b/public/images/pokemon/back/412-sandy.png index 9a1bc03ca61..c76152b11bc 100644 Binary files a/public/images/pokemon/back/412-sandy.png and b/public/images/pokemon/back/412-sandy.png differ diff --git a/public/images/pokemon/back/798.png b/public/images/pokemon/back/798.png index 759b3a7934d..085db6e0876 100644 Binary files a/public/images/pokemon/back/798.png and b/public/images/pokemon/back/798.png differ diff --git a/public/images/pokemon/back/898-ice.png b/public/images/pokemon/back/898-ice.png index 4c23c34d37c..0436a6ee042 100644 Binary files a/public/images/pokemon/back/898-ice.png and b/public/images/pokemon/back/898-ice.png differ diff --git a/public/images/pokemon/back/898-shadow.png b/public/images/pokemon/back/898-shadow.png index 62ef9f21fc0..0bbf0d2083c 100644 Binary files a/public/images/pokemon/back/898-shadow.png and b/public/images/pokemon/back/898-shadow.png differ diff --git a/public/images/pokemon/back/shiny/798.png b/public/images/pokemon/back/shiny/798.png index 61344f40e11..b1948a6a3cd 100644 Binary files a/public/images/pokemon/back/shiny/798.png and b/public/images/pokemon/back/shiny/798.png differ diff --git a/public/images/pokemon/back/shiny/898-ice.png b/public/images/pokemon/back/shiny/898-ice.png index 30028e07e98..3bf247280b9 100644 Binary files a/public/images/pokemon/back/shiny/898-ice.png and b/public/images/pokemon/back/shiny/898-ice.png differ diff --git a/public/images/pokemon/back/shiny/898-shadow.png b/public/images/pokemon/back/shiny/898-shadow.png index 3a52e2948d9..a1ea98d1f3f 100644 Binary files a/public/images/pokemon/back/shiny/898-shadow.png and b/public/images/pokemon/back/shiny/898-shadow.png differ diff --git a/public/images/pokemon/back/shiny/983.png b/public/images/pokemon/back/shiny/983.png index 343bbd584ad..4b69919c297 100644 Binary files a/public/images/pokemon/back/shiny/983.png and b/public/images/pokemon/back/shiny/983.png differ diff --git a/public/images/pokemon/exp/4145.png b/public/images/pokemon/exp/4145.png index 93705f24a45..acdc9bd12c3 100644 Binary files a/public/images/pokemon/exp/4145.png and b/public/images/pokemon/exp/4145.png differ diff --git a/public/images/pokemon/exp/4222.png b/public/images/pokemon/exp/4222.png index 8b6d1b633de..b78d04c371c 100644 Binary files a/public/images/pokemon/exp/4222.png and b/public/images/pokemon/exp/4222.png differ diff --git a/public/images/pokemon/exp/798.png b/public/images/pokemon/exp/798.png index 09a16e6b014..6c88f1130c9 100644 Binary files a/public/images/pokemon/exp/798.png and b/public/images/pokemon/exp/798.png differ diff --git a/public/images/pokemon/exp/864.png b/public/images/pokemon/exp/864.png index 727a9b6c2cd..079b1f6a681 100644 Binary files a/public/images/pokemon/exp/864.png and b/public/images/pokemon/exp/864.png differ diff --git a/public/images/pokemon/exp/890-eternamax.png b/public/images/pokemon/exp/890-eternamax.png new file mode 100644 index 00000000000..33c8f5f9631 Binary files /dev/null and b/public/images/pokemon/exp/890-eternamax.png differ diff --git a/public/images/pokemon/exp/898-ice.png b/public/images/pokemon/exp/898-ice.png index abbe94b7372..0aa95bddca7 100644 Binary files a/public/images/pokemon/exp/898-ice.png and b/public/images/pokemon/exp/898-ice.png differ diff --git a/public/images/pokemon/exp/898-shadow.png b/public/images/pokemon/exp/898-shadow.png index 722eedafb21..5a41eb6cee0 100644 Binary files a/public/images/pokemon/exp/898-shadow.png and b/public/images/pokemon/exp/898-shadow.png differ diff --git a/public/images/pokemon/exp/957.png b/public/images/pokemon/exp/957.png index 7628fdac01b..b3dd3f68974 100644 Binary files a/public/images/pokemon/exp/957.png and b/public/images/pokemon/exp/957.png differ diff --git a/public/images/pokemon/exp/958.png b/public/images/pokemon/exp/958.png index f1bb308dd4c..75b5c27a68d 100644 Binary files a/public/images/pokemon/exp/958.png and b/public/images/pokemon/exp/958.png differ diff --git a/public/images/pokemon/exp/959.png b/public/images/pokemon/exp/959.png index 07ecd30b2a1..187f8063e53 100644 Binary files a/public/images/pokemon/exp/959.png and b/public/images/pokemon/exp/959.png differ diff --git a/public/images/pokemon/exp/back/4144.png b/public/images/pokemon/exp/back/4144.png index 3954c56b159..d92209cc168 100644 Binary files a/public/images/pokemon/exp/back/4144.png and b/public/images/pokemon/exp/back/4144.png differ diff --git a/public/images/pokemon/exp/back/4145.png b/public/images/pokemon/exp/back/4145.png index b53890112e9..f3e50eddaa5 100644 Binary files a/public/images/pokemon/exp/back/4145.png and b/public/images/pokemon/exp/back/4145.png differ diff --git a/public/images/pokemon/exp/back/4146.png b/public/images/pokemon/exp/back/4146.png index 2f011a471ef..24628f7be72 100644 Binary files a/public/images/pokemon/exp/back/4146.png and b/public/images/pokemon/exp/back/4146.png differ diff --git a/public/images/pokemon/exp/back/4222.png b/public/images/pokemon/exp/back/4222.png index 12f87c8f497..202817b2163 100644 Binary files a/public/images/pokemon/exp/back/4222.png and b/public/images/pokemon/exp/back/4222.png differ diff --git a/public/images/pokemon/exp/back/798.png b/public/images/pokemon/exp/back/798.png index 08287e4e7d3..50b663a19dd 100644 Binary files a/public/images/pokemon/exp/back/798.png and b/public/images/pokemon/exp/back/798.png differ diff --git a/public/images/pokemon/exp/back/898-ice.png b/public/images/pokemon/exp/back/898-ice.png index e07dc46a09b..304e3547aa5 100644 Binary files a/public/images/pokemon/exp/back/898-ice.png and b/public/images/pokemon/exp/back/898-ice.png differ diff --git a/public/images/pokemon/exp/back/898-shadow.png b/public/images/pokemon/exp/back/898-shadow.png index 5a7aa694509..9f40e0ede70 100644 Binary files a/public/images/pokemon/exp/back/898-shadow.png and b/public/images/pokemon/exp/back/898-shadow.png differ diff --git a/public/images/pokemon/exp/back/957.png b/public/images/pokemon/exp/back/957.png index 51958699fd4..6d653851e94 100644 Binary files a/public/images/pokemon/exp/back/957.png and b/public/images/pokemon/exp/back/957.png differ diff --git a/public/images/pokemon/exp/back/958.png b/public/images/pokemon/exp/back/958.png index 091664cd916..d9ec3d62b88 100644 Binary files a/public/images/pokemon/exp/back/958.png and b/public/images/pokemon/exp/back/958.png differ diff --git a/public/images/pokemon/exp/back/959.png b/public/images/pokemon/exp/back/959.png index 12003c8068e..29242f92dd7 100644 Binary files a/public/images/pokemon/exp/back/959.png and b/public/images/pokemon/exp/back/959.png differ diff --git a/public/images/pokemon/exp/back/shiny/4222.png b/public/images/pokemon/exp/back/shiny/4222.png index 8c92ed356cb..15970729f49 100644 Binary files a/public/images/pokemon/exp/back/shiny/4222.png and b/public/images/pokemon/exp/back/shiny/4222.png differ diff --git a/public/images/pokemon/exp/back/shiny/798.png b/public/images/pokemon/exp/back/shiny/798.png index ccaab1c5256..68fd3382ddc 100644 Binary files a/public/images/pokemon/exp/back/shiny/798.png and b/public/images/pokemon/exp/back/shiny/798.png differ diff --git a/public/images/pokemon/exp/back/shiny/898-ice.png b/public/images/pokemon/exp/back/shiny/898-ice.png index 40bd9a7246f..6b3e8277180 100644 Binary files a/public/images/pokemon/exp/back/shiny/898-ice.png and b/public/images/pokemon/exp/back/shiny/898-ice.png differ diff --git a/public/images/pokemon/exp/back/shiny/898-shadow.png b/public/images/pokemon/exp/back/shiny/898-shadow.png index 9be0af9510b..d40bd1ab48e 100644 Binary files a/public/images/pokemon/exp/back/shiny/898-shadow.png and b/public/images/pokemon/exp/back/shiny/898-shadow.png differ diff --git a/public/images/pokemon/exp/back/shiny/957.png b/public/images/pokemon/exp/back/shiny/957.png index 2ecd0ba7153..2626b4e5ec2 100644 Binary files a/public/images/pokemon/exp/back/shiny/957.png and b/public/images/pokemon/exp/back/shiny/957.png differ diff --git a/public/images/pokemon/exp/back/shiny/958.png b/public/images/pokemon/exp/back/shiny/958.png index b4ca792c826..030e88a35bb 100644 Binary files a/public/images/pokemon/exp/back/shiny/958.png and b/public/images/pokemon/exp/back/shiny/958.png differ diff --git a/public/images/pokemon/exp/back/shiny/959.png b/public/images/pokemon/exp/back/shiny/959.png index b79a22297c6..b6931b47fdc 100644 Binary files a/public/images/pokemon/exp/back/shiny/959.png and b/public/images/pokemon/exp/back/shiny/959.png differ diff --git a/public/images/pokemon/exp/shiny/4145.png b/public/images/pokemon/exp/shiny/4145.png index 27b07671c76..bcc4c6f91c2 100644 Binary files a/public/images/pokemon/exp/shiny/4145.png and b/public/images/pokemon/exp/shiny/4145.png differ diff --git a/public/images/pokemon/exp/shiny/4222.png b/public/images/pokemon/exp/shiny/4222.png index 07f754795e0..443aeb5fab3 100644 Binary files a/public/images/pokemon/exp/shiny/4222.png and b/public/images/pokemon/exp/shiny/4222.png differ diff --git a/public/images/pokemon/exp/shiny/679.png b/public/images/pokemon/exp/shiny/679.png index 43d62a6d928..6ac3c47f498 100644 Binary files a/public/images/pokemon/exp/shiny/679.png and b/public/images/pokemon/exp/shiny/679.png differ diff --git a/public/images/pokemon/exp/shiny/798.png b/public/images/pokemon/exp/shiny/798.png index 61ad84aa477..b88b0c1efa5 100644 Binary files a/public/images/pokemon/exp/shiny/798.png and b/public/images/pokemon/exp/shiny/798.png differ diff --git a/public/images/pokemon/exp/shiny/898-ice.png b/public/images/pokemon/exp/shiny/898-ice.png index 8fc38335c0d..33850906ca3 100644 Binary files a/public/images/pokemon/exp/shiny/898-ice.png and b/public/images/pokemon/exp/shiny/898-ice.png differ diff --git a/public/images/pokemon/exp/shiny/898-shadow.png b/public/images/pokemon/exp/shiny/898-shadow.png index 73b57448b00..8c4e18e6ba8 100644 Binary files a/public/images/pokemon/exp/shiny/898-shadow.png and b/public/images/pokemon/exp/shiny/898-shadow.png differ diff --git a/public/images/pokemon/exp/shiny/957.png b/public/images/pokemon/exp/shiny/957.png index ee1ad562a04..195296b89d0 100644 Binary files a/public/images/pokemon/exp/shiny/957.png and b/public/images/pokemon/exp/shiny/957.png differ diff --git a/public/images/pokemon/exp/shiny/958.png b/public/images/pokemon/exp/shiny/958.png index 219be3da7e9..50de7da7fda 100644 Binary files a/public/images/pokemon/exp/shiny/958.png and b/public/images/pokemon/exp/shiny/958.png differ diff --git a/public/images/pokemon/exp/shiny/959.png b/public/images/pokemon/exp/shiny/959.png index 10f39c4d290..22624d813c0 100644 Binary files a/public/images/pokemon/exp/shiny/959.png and b/public/images/pokemon/exp/shiny/959.png differ diff --git a/public/images/pokemon/icons/7/798s.png b/public/images/pokemon/icons/7/798s.png index 18fe4bac390..53cfc79797c 100644 Binary files a/public/images/pokemon/icons/7/798s.png and b/public/images/pokemon/icons/7/798s.png differ diff --git a/public/images/pokemon/icons/8/864s.png b/public/images/pokemon/icons/8/864s.png index 50e6bd7296a..361d8a76214 100644 Binary files a/public/images/pokemon/icons/8/864s.png and b/public/images/pokemon/icons/8/864s.png differ diff --git a/public/images/pokemon/shiny/164.png b/public/images/pokemon/shiny/164.png index 2a5687cc5d5..de6405ff580 100644 Binary files a/public/images/pokemon/shiny/164.png and b/public/images/pokemon/shiny/164.png differ diff --git a/public/images/pokemon/shiny/370.png b/public/images/pokemon/shiny/370.png index 5633b01659c..8a7bf0b11a8 100644 Binary files a/public/images/pokemon/shiny/370.png and b/public/images/pokemon/shiny/370.png differ diff --git a/public/images/pokemon/shiny/864.png b/public/images/pokemon/shiny/864.png index 689b5fa73c4..780f52945f2 100644 Binary files a/public/images/pokemon/shiny/864.png and b/public/images/pokemon/shiny/864.png differ diff --git a/public/images/pokemon/shiny/892-gigantamax-rapid.png b/public/images/pokemon/shiny/892-gigantamax-rapid.png index 0b85b62e8b9..f9c4276359f 100644 Binary files a/public/images/pokemon/shiny/892-gigantamax-rapid.png and b/public/images/pokemon/shiny/892-gigantamax-rapid.png differ diff --git a/public/images/pokemon/shiny/892-rapid-strike.png b/public/images/pokemon/shiny/892-rapid-strike.png index dedecd10c3d..2ed26aa7510 100644 Binary files a/public/images/pokemon/shiny/892-rapid-strike.png and b/public/images/pokemon/shiny/892-rapid-strike.png differ diff --git a/public/images/pokemon/shiny/898-ice.png b/public/images/pokemon/shiny/898-ice.png index 86d2c3cf282..d262f8c3e9d 100644 Binary files a/public/images/pokemon/shiny/898-ice.png and b/public/images/pokemon/shiny/898-ice.png differ diff --git a/public/images/pokemon/shiny/898-shadow.png b/public/images/pokemon/shiny/898-shadow.png index 43393b09ca3..6744535f165 100644 Binary files a/public/images/pokemon/shiny/898-shadow.png and b/public/images/pokemon/shiny/898-shadow.png differ diff --git a/public/images/pokemon/variant/623_1.json b/public/images/pokemon/variant/623_1.json new file mode 100644 index 00000000000..3a12266f102 --- /dev/null +++ b/public/images/pokemon/variant/623_1.json @@ -0,0 +1,3590 @@ +{ + "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/862.json b/public/images/pokemon/variant/862.json new file mode 100644 index 00000000000..8b25c875e3f --- /dev/null +++ b/public/images/pokemon/variant/862.json @@ -0,0 +1,32 @@ +{ + "1": { + "1b2627": "1b2627", + "474749": "156a66", + "010101": "010101", + "303034": "094448", + "f5f5f6": "f5ffea", + "b2b3b2": "90c093", + "949496": "1c8155", + "282730": "002729", + "242428": "001b1a", + "6f7071": "01473a", + "df84ad": "ff69fa", + "9b4f69": "d414dd", + "fcfcfc": "fcfcfc" + }, + "2": { + "1b2627": "060724", + "474749": "8655e1", + "010101": "010101", + "303034": "5a3eb9", + "f5f5f6": "342d4c", + "b2b3b2": "18133d", + "949496": "302e89", + "282730": "180c46", + "242428": "161058", + "6f7071": "2e1d7b", + "df84ad": "54f1ff", + "9b4f69": "0099ce", + "fcfcfc": "fcfcfc" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/_masterlist.json b/public/images/pokemon/variant/_masterlist.json index ea9fe53622b..03d0e2ef1c1 100644 --- a/public/images/pokemon/variant/_masterlist.json +++ b/public/images/pokemon/variant/_masterlist.json @@ -1220,7 +1220,7 @@ 1 ], "623": [ - 1, + 2, 1, 1 ], @@ -1754,6 +1754,11 @@ 1, 1 ], + "862": [ + 0, + 1, + 1 + ], "863": [ 0, 1, @@ -1796,8 +1801,8 @@ ], "890-eternamax": [ 0, - 2, - 2 + 1, + 1 ], "890": [ 0, @@ -2499,7 +2504,7 @@ ], "212-mega": [ 1, - 1, + 2, 1 ], "212": [ @@ -2920,7 +2925,7 @@ "426": [ 0, 1, - 1 + 2 ], "427": [ 0, @@ -3323,7 +3328,7 @@ 1 ], "623": [ - 1, + 2, 1, 1 ], @@ -3857,6 +3862,11 @@ 1, 1 ], + "862": [ + 0, + 1, + 1 + ], "863": [ 0, 1, @@ -4175,7 +4185,7 @@ ], "399": [ 0, - 1, + 2, 1 ], "400": [ @@ -4249,7 +4259,7 @@ "212-mega": [ 1, 1, - 1 + 2 ], "282-mega": [ 0, @@ -4473,7 +4483,7 @@ ], "696": [ 0, - 1, + 2, 2 ], "697": [ @@ -4553,8 +4563,8 @@ ], "729": [ 0, - 1, - 1 + 2, + 2 ], "730": [ 0, @@ -4564,7 +4574,7 @@ "747": [ 0, 2, - 1 + 2 ], "748": [ 0, @@ -4578,8 +4588,8 @@ ], "754": [ 0, - 1, - 1 + 2, + 2 ], "755": [ 0, @@ -4746,6 +4756,11 @@ 1, 1 ], + "862": [ + 0, + 1, + 1 + ], "863": [ 0, 1, @@ -4789,7 +4804,12 @@ "890": [ 0, 2, - 2 + 1 + ], + "890-eternamax": [ + 0, + 1, + 1 ], "900": [ 0, @@ -5070,8 +5090,8 @@ ], "212-mega": [ 1, - 1, - 1 + 2, + 2 ], "282-mega": [ 0, @@ -5400,7 +5420,7 @@ ], "754": [ 0, - 1, + 2, 2 ], "755": [ @@ -5563,6 +5583,11 @@ 1, 1 ], + "862": [ + 0, + 1, + 1 + ], "863": [ 0, 1, @@ -5725,8 +5750,8 @@ ], "970": [ 0, - 2, - 2 + 1, + 1 ], "973": [ 1, diff --git a/public/images/pokemon/variant/back/212-mega_2.json b/public/images/pokemon/variant/back/212-mega_2.json new file mode 100644 index 00000000000..4db2440a4d9 --- /dev/null +++ b/public/images/pokemon/variant/back/212-mega_2.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "212-mega_2.png", + "format": "RGBA8888", + "size": { + "w": 86, + "h": 86 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 72, + "h": 86 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 72, + "h": 86 + }, + "frame": { + "x": 0, + "y": 0, + "w": 72, + "h": 86 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:3fba14a8cd6c5a8717bb5ccf414ed76d:5ebfc3bcaa77a0ff9d55a9b15383f0ef:d0a607721d6bb74ae9b6d486116d85e3$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/623_1.json b/public/images/pokemon/variant/back/623_1.json new file mode 100644 index 00000000000..893fe66c597 --- /dev/null +++ b/public/images/pokemon/variant/back/623_1.json @@ -0,0 +1,3590 @@ +{ + "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/862.json b/public/images/pokemon/variant/back/862.json new file mode 100644 index 00000000000..8f323fb4822 --- /dev/null +++ b/public/images/pokemon/variant/back/862.json @@ -0,0 +1,32 @@ +{ + "1": { + "1b2627": "1b2627", + "010101": "010101", + "474749": "156a66", + "303034": "094448", + "6f7071": "01473a", + "b2b3b2": "90c093", + "463f39": "001b1a", + "949496": "1c8155", + "f5f5f6": "f5ffea", + "9b4f69": "d414dd", + "df84ad": "ff69fa", + "2b2d2e": "052332", + "fcfcfc": "fcfcfc" + }, + "2": { + "1b2627": "180c46", + "010101": "010101", + "474749": "8655e1", + "303034": "5a3eb9", + "6f7071": "2e1d7b", + "b2b3b2": "1f1a43", + "463f39": "161058", + "949496": "302e89", + "f5f5f6": "342d4c", + "9b4f69": "0099ce", + "df84ad": "54f1ff", + "2b2d2e": "060429", + "fcfcfc": "fcfcfc" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/212-mega_3.json b/public/images/pokemon/variant/exp/212-mega_3.json new file mode 100644 index 00000000000..b4d41a44430 --- /dev/null +++ b/public/images/pokemon/variant/exp/212-mega_3.json @@ -0,0 +1,2540 @@ +{ + "textures": [ + { + "image": "212-mega_3.png", + "format": "RGBA8888", + "size": { + "w": 486, + "h": 486 + }, + "scale": 1, + "frames": [ + { + "filename": "0105.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 74, + "h": 81 + }, + "frame": { + "x": 0, + "y": 0, + "w": 74, + "h": 81 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 74, + "h": 81 + }, + "frame": { + "x": 0, + "y": 0, + "w": 74, + "h": 81 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 74, + "h": 81 + }, + "frame": { + "x": 74, + "y": 0, + "w": 74, + "h": 81 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 74, + "h": 81 + }, + "frame": { + "x": 74, + "y": 0, + "w": 74, + "h": 81 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 74, + "h": 81 + }, + "frame": { + "x": 74, + "y": 0, + "w": 74, + "h": 81 + } + }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 74, + "h": 81 + }, + "frame": { + "x": 74, + "y": 0, + "w": 74, + "h": 81 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 74, + "h": 81 + }, + "frame": { + "x": 148, + "y": 0, + "w": 74, + "h": 81 + } + }, + { + "filename": "0111.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 74, + "h": 81 + }, + "frame": { + "x": 148, + "y": 0, + "w": 74, + "h": 81 + } + }, + { + "filename": "0101.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 73, + "h": 81 + }, + "frame": { + "x": 222, + "y": 0, + "w": 73, + "h": 81 + } + }, + { + "filename": "0102.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 73, + "h": 81 + }, + "frame": { + "x": 295, + "y": 0, + "w": 73, + "h": 81 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 73, + "h": 81 + }, + "frame": { + "x": 368, + "y": 0, + "w": 73, + "h": 81 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 73, + "h": 81 + }, + "frame": { + "x": 0, + "y": 81, + "w": 73, + "h": 81 + } + }, + { + "filename": "0113.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 73, + "h": 81 + }, + "frame": { + "x": 73, + "y": 81, + "w": 73, + "h": 81 + } + }, + { + "filename": "0114.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 73, + "h": 81 + }, + "frame": { + "x": 146, + "y": 81, + "w": 73, + "h": 81 + } + }, + { + "filename": "0115.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 73, + "h": 81 + }, + "frame": { + "x": 219, + "y": 81, + "w": 73, + "h": 81 + } + }, + { + "filename": "0116.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 73, + "h": 81 + }, + "frame": { + "x": 292, + "y": 81, + "w": 73, + "h": 81 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 71, + "h": 81 + }, + "frame": { + "x": 365, + "y": 81, + "w": 71, + "h": 81 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 71, + "h": 81 + }, + "frame": { + "x": 365, + "y": 81, + "w": 71, + "h": 81 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 71, + "h": 81 + }, + "frame": { + "x": 365, + "y": 81, + "w": 71, + "h": 81 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 71, + "h": 81 + }, + "frame": { + "x": 365, + "y": 81, + "w": 71, + "h": 81 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 71, + "h": 81 + }, + "frame": { + "x": 0, + "y": 162, + "w": 71, + "h": 81 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 71, + "h": 81 + }, + "frame": { + "x": 0, + "y": 162, + "w": 71, + "h": 81 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 71, + "h": 81 + }, + "frame": { + "x": 0, + "y": 162, + "w": 71, + "h": 81 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 71, + "h": 81 + }, + "frame": { + "x": 0, + "y": 162, + "w": 71, + "h": 81 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 71, + "h": 81 + }, + "frame": { + "x": 71, + "y": 162, + "w": 71, + "h": 81 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 71, + "h": 81 + }, + "frame": { + "x": 142, + "y": 162, + "w": 71, + "h": 81 + } + }, + { + "filename": "0117.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 71, + "h": 81 + }, + "frame": { + "x": 213, + "y": 162, + "w": 71, + "h": 81 + } + }, + { + "filename": "0118.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 71, + "h": 81 + }, + "frame": { + "x": 284, + "y": 162, + "w": 71, + "h": 81 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 70, + "h": 81 + }, + "frame": { + "x": 355, + "y": 162, + "w": 70, + "h": 81 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 70, + "h": 81 + }, + "frame": { + "x": 355, + "y": 162, + "w": 70, + "h": 81 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 70, + "h": 81 + }, + "frame": { + "x": 355, + "y": 162, + "w": 70, + "h": 81 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 70, + "h": 81 + }, + "frame": { + "x": 355, + "y": 162, + "w": 70, + "h": 81 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 70, + "h": 81 + }, + "frame": { + "x": 0, + "y": 243, + "w": 70, + "h": 81 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 70, + "h": 81 + }, + "frame": { + "x": 0, + "y": 243, + "w": 70, + "h": 81 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 70, + "h": 81 + }, + "frame": { + "x": 0, + "y": 243, + "w": 70, + "h": 81 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 70, + "h": 81 + }, + "frame": { + "x": 0, + "y": 243, + "w": 70, + "h": 81 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 70, + "h": 81 + }, + "frame": { + "x": 70, + "y": 243, + "w": 70, + "h": 81 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 70, + "h": 81 + }, + "frame": { + "x": 70, + "y": 243, + "w": 70, + "h": 81 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 70, + "h": 81 + }, + "frame": { + "x": 70, + "y": 243, + "w": 70, + "h": 81 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 70, + "h": 81 + }, + "frame": { + "x": 70, + "y": 243, + "w": 70, + "h": 81 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 70, + "h": 81 + }, + "frame": { + "x": 140, + "y": 243, + "w": 70, + "h": 81 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 70, + "h": 81 + }, + "frame": { + "x": 140, + "y": 243, + "w": 70, + "h": 81 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 70, + "h": 81 + }, + "frame": { + "x": 140, + "y": 243, + "w": 70, + "h": 81 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 70, + "h": 81 + }, + "frame": { + "x": 140, + "y": 243, + "w": 70, + "h": 81 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 69, + "h": 81 + }, + "frame": { + "x": 210, + "y": 243, + "w": 69, + "h": 81 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 69, + "h": 81 + }, + "frame": { + "x": 210, + "y": 243, + "w": 69, + "h": 81 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 69, + "h": 81 + }, + "frame": { + "x": 210, + "y": 243, + "w": 69, + "h": 81 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 69, + "h": 81 + }, + "frame": { + "x": 210, + "y": 243, + "w": 69, + "h": 81 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 69, + "h": 81 + }, + "frame": { + "x": 279, + "y": 243, + "w": 69, + "h": 81 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 69, + "h": 81 + }, + "frame": { + "x": 279, + "y": 243, + "w": 69, + "h": 81 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 69, + "h": 81 + }, + "frame": { + "x": 279, + "y": 243, + "w": 69, + "h": 81 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 69, + "h": 81 + }, + "frame": { + "x": 279, + "y": 243, + "w": 69, + "h": 81 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 69, + "h": 81 + }, + "frame": { + "x": 348, + "y": 243, + "w": 69, + "h": 81 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 69, + "h": 81 + }, + "frame": { + "x": 348, + "y": 243, + "w": 69, + "h": 81 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 69, + "h": 81 + }, + "frame": { + "x": 348, + "y": 243, + "w": 69, + "h": 81 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 69, + "h": 81 + }, + "frame": { + "x": 348, + "y": 243, + "w": 69, + "h": 81 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 69, + "h": 81 + }, + "frame": { + "x": 417, + "y": 243, + "w": 69, + "h": 81 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 69, + "h": 81 + }, + "frame": { + "x": 417, + "y": 243, + "w": 69, + "h": 81 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 69, + "h": 81 + }, + "frame": { + "x": 417, + "y": 243, + "w": 69, + "h": 81 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 69, + "h": 81 + }, + "frame": { + "x": 417, + "y": 243, + "w": 69, + "h": 81 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 69, + "h": 81 + }, + "frame": { + "x": 0, + "y": 324, + "w": 69, + "h": 81 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 69, + "h": 81 + }, + "frame": { + "x": 0, + "y": 324, + "w": 69, + "h": 81 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 69, + "h": 81 + }, + "frame": { + "x": 0, + "y": 324, + "w": 69, + "h": 81 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 69, + "h": 81 + }, + "frame": { + "x": 0, + "y": 324, + "w": 69, + "h": 81 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 69, + "h": 81 + }, + "frame": { + "x": 69, + "y": 324, + "w": 69, + "h": 81 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 69, + "h": 81 + }, + "frame": { + "x": 69, + "y": 324, + "w": 69, + "h": 81 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 69, + "h": 81 + }, + "frame": { + "x": 69, + "y": 324, + "w": 69, + "h": 81 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 69, + "h": 81 + }, + "frame": { + "x": 69, + "y": 324, + "w": 69, + "h": 81 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 69, + "h": 81 + }, + "frame": { + "x": 138, + "y": 324, + "w": 69, + "h": 81 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 69, + "h": 81 + }, + "frame": { + "x": 138, + "y": 324, + "w": 69, + "h": 81 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 69, + "h": 81 + }, + "frame": { + "x": 138, + "y": 324, + "w": 69, + "h": 81 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 69, + "h": 81 + }, + "frame": { + "x": 138, + "y": 324, + "w": 69, + "h": 81 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 69, + "h": 81 + }, + "frame": { + "x": 207, + "y": 324, + "w": 69, + "h": 81 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 69, + "h": 81 + }, + "frame": { + "x": 207, + "y": 324, + "w": 69, + "h": 81 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 69, + "h": 81 + }, + "frame": { + "x": 207, + "y": 324, + "w": 69, + "h": 81 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 69, + "h": 81 + }, + "frame": { + "x": 207, + "y": 324, + "w": 69, + "h": 81 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 69, + "h": 81 + }, + "frame": { + "x": 276, + "y": 324, + "w": 69, + "h": 81 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 69, + "h": 81 + }, + "frame": { + "x": 345, + "y": 324, + "w": 69, + "h": 81 + } + }, + { + "filename": "0119.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 69, + "h": 81 + }, + "frame": { + "x": 414, + "y": 324, + "w": 69, + "h": 81 + } + }, + { + "filename": "0120.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 69, + "h": 81 + }, + "frame": { + "x": 0, + "y": 405, + "w": 69, + "h": 81 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 69, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 69, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 69, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 69, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 137, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 137, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 137, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 137, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 137, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 137, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 137, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 137, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 205, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 205, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 205, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 205, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 205, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 205, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 205, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 205, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 205, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 205, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 205, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 205, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 205, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 205, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 205, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 205, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 273, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 273, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 273, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 273, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 273, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 273, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 273, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 273, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 341, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 341, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 341, + "y": 405, + "w": 68, + "h": 81 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 74, + "h": 81 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 68, + "h": 81 + }, + "frame": { + "x": 341, + "y": 405, + "w": 68, + "h": 81 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:666ada1ce52f0d7f3c112d5c211fd67e:3a1315874d0fffd95b7d0d57a76f9d9d:d0a607721d6bb74ae9b6d486116d85e3$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/696_2.json b/public/images/pokemon/variant/exp/696_2.json new file mode 100644 index 00000000000..565ab02f4ae --- /dev/null +++ b/public/images/pokemon/variant/exp/696_2.json @@ -0,0 +1,692 @@ +{ + "textures": [ + { + "image": "696_2.png", + "format": "RGBA8888", + "size": { + "w": 135, + "h": 135 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 53, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 53, + "h": 46 + }, + "frame": { + "x": 0, + "y": 0, + "w": 53, + "h": 46 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 53, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 53, + "h": 46 + }, + "frame": { + "x": 0, + "y": 0, + "w": 53, + "h": 46 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 53, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 53, + "h": 46 + }, + "frame": { + "x": 0, + "y": 0, + "w": 53, + "h": 46 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 53, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 53, + "h": 46 + }, + "frame": { + "x": 0, + "y": 0, + "w": 53, + "h": 46 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 53, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 53, + "h": 46 + }, + "frame": { + "x": 0, + "y": 0, + "w": 53, + "h": 46 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 53, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 53, + "h": 46 + }, + "frame": { + "x": 0, + "y": 0, + "w": 53, + "h": 46 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 53, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 53, + "h": 46 + }, + "frame": { + "x": 53, + "y": 0, + "w": 53, + "h": 46 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 53, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 53, + "h": 46 + }, + "frame": { + "x": 53, + "y": 0, + "w": 53, + "h": 46 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 53, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 53, + "h": 46 + }, + "frame": { + "x": 53, + "y": 0, + "w": 53, + "h": 46 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 53, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 53, + "h": 46 + }, + "frame": { + "x": 53, + "y": 0, + "w": 53, + "h": 46 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 53, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 53, + "h": 46 + }, + "frame": { + "x": 53, + "y": 0, + "w": 53, + "h": 46 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 53, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 53, + "h": 46 + }, + "frame": { + "x": 53, + "y": 0, + "w": 53, + "h": 46 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 53, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 53, + "h": 46 + }, + "frame": { + "x": 53, + "y": 0, + "w": 53, + "h": 46 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 53, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 53, + "h": 46 + }, + "frame": { + "x": 53, + "y": 0, + "w": 53, + "h": 46 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 53, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 53, + "h": 46 + }, + "frame": { + "x": 53, + "y": 0, + "w": 53, + "h": 46 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 53, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 53, + "h": 46 + }, + "frame": { + "x": 53, + "y": 0, + "w": 53, + "h": 46 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 53, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 53, + "h": 46 + }, + "frame": { + "x": 0, + "y": 46, + "w": 53, + "h": 46 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 53, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 53, + "h": 46 + }, + "frame": { + "x": 0, + "y": 46, + "w": 53, + "h": 46 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 53, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 53, + "h": 43 + }, + "frame": { + "x": 0, + "y": 92, + "w": 53, + "h": 43 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 53, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 53, + "h": 43 + }, + "frame": { + "x": 0, + "y": 92, + "w": 53, + "h": 43 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 53, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 53, + "h": 45 + }, + "frame": { + "x": 53, + "y": 46, + "w": 53, + "h": 45 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 53, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 53, + "h": 45 + }, + "frame": { + "x": 53, + "y": 46, + "w": 53, + "h": 45 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 53, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 53, + "h": 45 + }, + "frame": { + "x": 53, + "y": 46, + "w": 53, + "h": 45 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 53, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 53, + "h": 45 + }, + "frame": { + "x": 53, + "y": 46, + "w": 53, + "h": 45 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 53, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 53, + "h": 45 + }, + "frame": { + "x": 53, + "y": 46, + "w": 53, + "h": 45 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 53, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 53, + "h": 45 + }, + "frame": { + "x": 53, + "y": 46, + "w": 53, + "h": 45 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 53, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 53, + "h": 45 + }, + "frame": { + "x": 53, + "y": 46, + "w": 53, + "h": 45 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 53, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 53, + "h": 45 + }, + "frame": { + "x": 53, + "y": 46, + "w": 53, + "h": 45 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 53, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 53, + "h": 44 + }, + "frame": { + "x": 53, + "y": 91, + "w": 53, + "h": 44 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 53, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 53, + "h": 44 + }, + "frame": { + "x": 53, + "y": 91, + "w": 53, + "h": 44 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 53, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 53, + "h": 44 + }, + "frame": { + "x": 53, + "y": 91, + "w": 53, + "h": 44 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 53, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 53, + "h": 44 + }, + "frame": { + "x": 53, + "y": 91, + "w": 53, + "h": 44 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:f6c90e8287d3ce2aa68c9fef98f6e12f:24cf84ba4764bd88b4e751ca1911a8d5:58b7763fb9abdd043e9bfa400cfafdef$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/729_2.json b/public/images/pokemon/variant/exp/729_2.json new file mode 100644 index 00000000000..530888eaf6e --- /dev/null +++ b/public/images/pokemon/variant/exp/729_2.json @@ -0,0 +1,272 @@ +{ + "textures": [ + { + "image": "729_2.png", + "format": "RGBA8888", + "size": { + "w": 141, + "h": 141 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 51 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 49, + "h": 51 + }, + "frame": { + "x": 0, + "y": 0, + "w": 49, + "h": 51 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 51 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 49, + "h": 51 + }, + "frame": { + "x": 0, + "y": 51, + "w": 49, + "h": 51 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 51 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 49, + "h": 51 + }, + "frame": { + "x": 0, + "y": 51, + "w": 49, + "h": 51 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 51 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 48, + "h": 50 + }, + "frame": { + "x": 49, + "y": 0, + "w": 48, + "h": 50 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 51 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 48, + "h": 50 + }, + "frame": { + "x": 49, + "y": 0, + "w": 48, + "h": 50 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 51 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 42, + "h": 47 + }, + "frame": { + "x": 97, + "y": 0, + "w": 42, + "h": 47 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 51 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 42, + "h": 47 + }, + "frame": { + "x": 97, + "y": 0, + "w": 42, + "h": 47 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 51 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 40, + "h": 47 + }, + "frame": { + "x": 97, + "y": 47, + "w": 40, + "h": 47 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 51 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 46, + "h": 48 + }, + "frame": { + "x": 49, + "y": 50, + "w": 46, + "h": 48 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 51 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 46, + "h": 48 + }, + "frame": { + "x": 49, + "y": 50, + "w": 46, + "h": 48 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 51 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 45, + "h": 47 + }, + "frame": { + "x": 95, + "y": 94, + "w": 45, + "h": 47 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 51 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 45, + "h": 47 + }, + "frame": { + "x": 95, + "y": 94, + "w": 45, + "h": 47 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:4df3ec883b357e664a50e3015060795f:29a8d34f9df9fa51691fda1da5961207:b2d5dd692ec79c7357afdffa7b3670a9$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/729_3.json b/public/images/pokemon/variant/exp/729_3.json new file mode 100644 index 00000000000..632cef739a2 --- /dev/null +++ b/public/images/pokemon/variant/exp/729_3.json @@ -0,0 +1,272 @@ +{ + "textures": [ + { + "image": "729_3.png", + "format": "RGBA8888", + "size": { + "w": 141, + "h": 141 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 51 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 49, + "h": 51 + }, + "frame": { + "x": 0, + "y": 0, + "w": 49, + "h": 51 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 51 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 49, + "h": 51 + }, + "frame": { + "x": 0, + "y": 51, + "w": 49, + "h": 51 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 51 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 49, + "h": 51 + }, + "frame": { + "x": 0, + "y": 51, + "w": 49, + "h": 51 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 51 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 48, + "h": 50 + }, + "frame": { + "x": 49, + "y": 0, + "w": 48, + "h": 50 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 51 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 48, + "h": 50 + }, + "frame": { + "x": 49, + "y": 0, + "w": 48, + "h": 50 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 51 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 42, + "h": 47 + }, + "frame": { + "x": 97, + "y": 0, + "w": 42, + "h": 47 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 51 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 42, + "h": 47 + }, + "frame": { + "x": 97, + "y": 0, + "w": 42, + "h": 47 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 51 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 40, + "h": 47 + }, + "frame": { + "x": 97, + "y": 47, + "w": 40, + "h": 47 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 51 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 46, + "h": 48 + }, + "frame": { + "x": 49, + "y": 50, + "w": 46, + "h": 48 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 51 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 46, + "h": 48 + }, + "frame": { + "x": 49, + "y": 50, + "w": 46, + "h": 48 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 51 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 45, + "h": 47 + }, + "frame": { + "x": 95, + "y": 94, + "w": 45, + "h": 47 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 50, + "h": 51 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 45, + "h": 47 + }, + "frame": { + "x": 95, + "y": 94, + "w": 45, + "h": 47 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:4df3ec883b357e664a50e3015060795f:29a8d34f9df9fa51691fda1da5961207:b2d5dd692ec79c7357afdffa7b3670a9$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/747_3.json b/public/images/pokemon/variant/exp/747_3.json new file mode 100644 index 00000000000..bb29c3787a8 --- /dev/null +++ b/public/images/pokemon/variant/exp/747_3.json @@ -0,0 +1,188 @@ +{ + "textures": [ + { + "image": "747_3.png", + "format": "RGBA8888", + "size": { + "w": 110, + "h": 110 + }, + "scale": 1, + "frames": [ + { + "filename": "0003.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 55, + "h": 47 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 55, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 47 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 55, + "h": 47 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 55, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 47 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 55, + "h": 47 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 55, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 47 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 55, + "h": 47 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 55, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 47 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 55, + "h": 47 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 55, + "h": 46 + }, + "frame": { + "x": 55, + "y": 0, + "w": 55, + "h": 46 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 55, + "h": 47 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 55, + "h": 46 + }, + "frame": { + "x": 55, + "y": 0, + "w": 55, + "h": 46 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 55, + "h": 47 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 55, + "h": 46 + }, + "frame": { + "x": 55, + "y": 46, + "w": 55, + "h": 46 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 55, + "h": 47 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 55, + "h": 46 + }, + "frame": { + "x": 55, + "y": 46, + "w": 55, + "h": 46 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:e4c4f790c4f0286f608dcdb15a609059:464f7ae7db1c0d034c2a1a65612b0da8:b26f7254994561969f00f765318acf1c$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/754_2.json b/public/images/pokemon/variant/exp/754_2.json new file mode 100644 index 00000000000..5fcde58d92d --- /dev/null +++ b/public/images/pokemon/variant/exp/754_2.json @@ -0,0 +1,1133 @@ +{ + "textures": [ + { + "image": "754_2.png", + "format": "RGBA8888", + "size": { + "w": 234, + "h": 234 + }, + "scale": 1, + "frames": [ + { + "filename": "0036.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + }, + "frame": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + }, + "frame": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + }, + "frame": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + }, + "frame": { + "x": 93, + "y": 0, + "w": 93, + "h": 68 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + }, + "frame": { + "x": 93, + "y": 0, + "w": 93, + "h": 68 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + }, + "frame": { + "x": 93, + "y": 0, + "w": 93, + "h": 68 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + }, + "frame": { + "x": 93, + "y": 0, + "w": 93, + "h": 68 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + }, + "frame": { + "x": 93, + "y": 0, + "w": 93, + "h": 68 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + }, + "frame": { + "x": 93, + "y": 0, + "w": 93, + "h": 68 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 0, + "w": 48, + "h": 68 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 0, + "w": 48, + "h": 68 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 0, + "w": 48, + "h": 68 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 0, + "w": 48, + "h": 68 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 0, + "w": 48, + "h": 68 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 0, + "w": 48, + "h": 68 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 0, + "w": 48, + "h": 68 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 0, + "w": 48, + "h": 68 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 0, + "w": 48, + "h": 68 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 0, + "w": 48, + "h": 68 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + }, + "frame": { + "x": 0, + "y": 68, + "w": 93, + "h": 68 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + }, + "frame": { + "x": 0, + "y": 68, + "w": 93, + "h": 68 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + }, + "frame": { + "x": 93, + "y": 68, + "w": 93, + "h": 68 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 68, + "w": 48, + "h": 68 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 68, + "w": 48, + "h": 68 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 68, + "w": 48, + "h": 68 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 68, + "w": 48, + "h": 68 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 68, + "w": 48, + "h": 68 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 68, + "w": 48, + "h": 68 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 68, + "w": 48, + "h": 68 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 68, + "w": 48, + "h": 68 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 68, + "w": 48, + "h": 68 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 68, + "w": 48, + "h": 68 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 68, + "w": 48, + "h": 68 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 85, + "h": 68 + }, + "frame": { + "x": 0, + "y": 136, + "w": 85, + "h": 68 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 85, + "h": 68 + }, + "frame": { + "x": 0, + "y": 136, + "w": 85, + "h": 68 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 85, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 85, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 85, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 85, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 85, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 85, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 85, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 85, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 85, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 85, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 133, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 133, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 133, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 133, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 133, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 133, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 181, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 181, + "y": 136, + "w": 48, + "h": 68 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:f79fcee4451cea6aad915f561b31bf78:95fdb55190edb6ce0d5847a4e46b4d5c:f7cb0e9bb3adbe899317e6e2e306035d$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/754_3.json b/public/images/pokemon/variant/exp/754_3.json new file mode 100644 index 00000000000..ce40f9a8231 --- /dev/null +++ b/public/images/pokemon/variant/exp/754_3.json @@ -0,0 +1,1133 @@ +{ + "textures": [ + { + "image": "754_3.png", + "format": "RGBA8888", + "size": { + "w": 234, + "h": 234 + }, + "scale": 1, + "frames": [ + { + "filename": "0036.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + }, + "frame": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + }, + "frame": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + }, + "frame": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + }, + "frame": { + "x": 93, + "y": 0, + "w": 93, + "h": 68 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + }, + "frame": { + "x": 93, + "y": 0, + "w": 93, + "h": 68 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + }, + "frame": { + "x": 93, + "y": 0, + "w": 93, + "h": 68 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + }, + "frame": { + "x": 93, + "y": 0, + "w": 93, + "h": 68 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + }, + "frame": { + "x": 93, + "y": 0, + "w": 93, + "h": 68 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + }, + "frame": { + "x": 93, + "y": 0, + "w": 93, + "h": 68 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 0, + "w": 48, + "h": 68 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 0, + "w": 48, + "h": 68 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 0, + "w": 48, + "h": 68 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 0, + "w": 48, + "h": 68 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 0, + "w": 48, + "h": 68 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 0, + "w": 48, + "h": 68 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 0, + "w": 48, + "h": 68 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 0, + "w": 48, + "h": 68 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 0, + "w": 48, + "h": 68 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 0, + "w": 48, + "h": 68 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + }, + "frame": { + "x": 0, + "y": 68, + "w": 93, + "h": 68 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + }, + "frame": { + "x": 0, + "y": 68, + "w": 93, + "h": 68 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + }, + "frame": { + "x": 93, + "y": 68, + "w": 93, + "h": 68 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 68, + "w": 48, + "h": 68 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 68, + "w": 48, + "h": 68 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 68, + "w": 48, + "h": 68 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 68, + "w": 48, + "h": 68 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 68, + "w": 48, + "h": 68 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 68, + "w": 48, + "h": 68 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 68, + "w": 48, + "h": 68 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 68, + "w": 48, + "h": 68 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 68, + "w": 48, + "h": 68 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 68, + "w": 48, + "h": 68 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 68, + "w": 48, + "h": 68 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 85, + "h": 68 + }, + "frame": { + "x": 0, + "y": 136, + "w": 85, + "h": 68 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 85, + "h": 68 + }, + "frame": { + "x": 0, + "y": 136, + "w": 85, + "h": 68 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 85, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 85, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 85, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 85, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 85, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 85, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 85, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 85, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 85, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 85, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 133, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 133, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 133, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 133, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 133, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 133, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 181, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 181, + "y": 136, + "w": 48, + "h": 68 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:f79fcee4451cea6aad915f561b31bf78:95fdb55190edb6ce0d5847a4e46b4d5c:f7cb0e9bb3adbe899317e6e2e306035d$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/862.json b/public/images/pokemon/variant/exp/862.json new file mode 100644 index 00000000000..afcf3da4864 --- /dev/null +++ b/public/images/pokemon/variant/exp/862.json @@ -0,0 +1,32 @@ +{ + "1": { + "1b2627": "1b2627", + "474749": "156a66", + "010101": "010101", + "f5f5f6": "f5ffea", + "b2b3b2": "90c093", + "303034": "094448", + "949496": "1c8155", + "463f39": "156a66", + "6f7071": "01473a", + "df84ad": "ff69fa", + "9b4f69": "d414dd", + "fcfcfc": "fcfcfc", + "494d56": "156a66" + }, + "2": { + "1b2627": "060724", + "474749": "8655e1", + "010101": "010101", + "f5f5f6": "342d4c", + "b2b3b2": "18133d", + "303034": "5a3eb9", + "949496": "302e89", + "463f39": "8655e1", + "6f7071": "2e1d7b", + "df84ad": "54f1ff", + "9b4f69": "0099ce", + "fcfcfc": "fcfcfc", + "494d56": "8655e1" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/890-eternamax.json b/public/images/pokemon/variant/exp/890-eternamax.json new file mode 100644 index 00000000000..18f3ca3f097 --- /dev/null +++ b/public/images/pokemon/variant/exp/890-eternamax.json @@ -0,0 +1,28 @@ +{ + "1": { + "25134c": "162a52", + "010101": "010101", + "3622a7": "406d89", + "6461ba": "4989a6", + "31245f": "264864", + "ab2a4c": "0d6fae", + "ffb6b6": "a6fbff", + "ff5657": "45c5e5", + "ffdfdf": "f1faff", + "e23434": "1c98c7", + "ff8c8c": "6ee7f8" + }, + "2": { + "25134c": "354e95", + "010101": "010101", + "3622a7": "bfd1fa", + "6461ba": "e1ecff", + "31245f": "87a3dd", + "ab2a4c": "ac4709", + "ffb6b6": "ffd456", + "ff5657": "d47823", + "ffdfdf": "ffee85", + "e23434": "c86016", + "ff8c8c": "ed972e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/890.json b/public/images/pokemon/variant/exp/890.json new file mode 100644 index 00000000000..781768fde0d --- /dev/null +++ b/public/images/pokemon/variant/exp/890.json @@ -0,0 +1,19 @@ +{ + "2": { + "26124d": "4963af", + "3a15bc": "bfd1fa", + "010101": "010101", + "b21833": "7b2f0e", + "eb1533": "cb7622", + "9a2433": "732208", + "3d2871": "87a3dd", + "f46d70": "f1bd4b", + "fb2553": "934516", + "675cc5": "675cc5", + "ffbcbc": "de9335", + "12042d": "12042d", + "e22dbc": "298fb9", + "f18cd5": "73e5dc", + "fefefe": "fefefe" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/212-mega_2.json b/public/images/pokemon/variant/exp/back/212-mega_2.json new file mode 100644 index 00000000000..9f2d24c2594 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/212-mega_2.json @@ -0,0 +1,440 @@ +{ + "textures": [ + { + "image": "212-mega_2.png", + "format": "RGBA8888", + "size": { + "w": 344, + "h": 344 + }, + "scale": 1, + "frames": [ + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 76, + "h": 86 + }, + "frame": { + "x": 0, + "y": 0, + "w": 76, + "h": 86 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 76, + "h": 86 + }, + "frame": { + "x": 0, + "y": 0, + "w": 76, + "h": 86 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 76, + "h": 86 + }, + "frame": { + "x": 0, + "y": 86, + "w": 76, + "h": 86 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 76, + "h": 86 + }, + "frame": { + "x": 0, + "y": 172, + "w": 76, + "h": 86 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 76, + "h": 86 + }, + "frame": { + "x": 0, + "y": 258, + "w": 76, + "h": 86 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 74, + "h": 86 + }, + "frame": { + "x": 76, + "y": 0, + "w": 74, + "h": 86 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 74, + "h": 86 + }, + "frame": { + "x": 150, + "y": 0, + "w": 74, + "h": 86 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 74, + "h": 86 + }, + "frame": { + "x": 150, + "y": 0, + "w": 74, + "h": 86 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 74, + "h": 86 + }, + "frame": { + "x": 224, + "y": 0, + "w": 74, + "h": 86 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 74, + "h": 86 + }, + "frame": { + "x": 76, + "y": 86, + "w": 74, + "h": 86 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 74, + "h": 86 + }, + "frame": { + "x": 76, + "y": 172, + "w": 74, + "h": 86 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 74, + "h": 86 + }, + "frame": { + "x": 76, + "y": 258, + "w": 74, + "h": 86 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 74, + "h": 86 + }, + "frame": { + "x": 76, + "y": 258, + "w": 74, + "h": 86 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 74, + "h": 86 + }, + "frame": { + "x": 150, + "y": 86, + "w": 74, + "h": 86 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 74, + "h": 86 + }, + "frame": { + "x": 224, + "y": 86, + "w": 74, + "h": 86 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 74, + "h": 86 + }, + "frame": { + "x": 224, + "y": 86, + "w": 74, + "h": 86 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 74, + "h": 86 + }, + "frame": { + "x": 150, + "y": 172, + "w": 74, + "h": 86 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 72, + "h": 86 + }, + "frame": { + "x": 150, + "y": 258, + "w": 72, + "h": 86 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 72, + "h": 86 + }, + "frame": { + "x": 222, + "y": 258, + "w": 72, + "h": 86 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 71, + "h": 86 + }, + "frame": { + "x": 224, + "y": 172, + "w": 71, + "h": 86 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:1b7ede0d536069418738b9c0f67f14fd:7b469c796eb673d31bdab8ad7b99b881:d0a607721d6bb74ae9b6d486116d85e3$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/212-mega_3.json b/public/images/pokemon/variant/exp/back/212-mega_3.json new file mode 100644 index 00000000000..fd9c5893ddc --- /dev/null +++ b/public/images/pokemon/variant/exp/back/212-mega_3.json @@ -0,0 +1,440 @@ +{ + "textures": [ + { + "image": "212-mega_3.png", + "format": "RGBA8888", + "size": { + "w": 344, + "h": 344 + }, + "scale": 1, + "frames": [ + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 76, + "h": 86 + }, + "frame": { + "x": 0, + "y": 0, + "w": 76, + "h": 86 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 76, + "h": 86 + }, + "frame": { + "x": 0, + "y": 0, + "w": 76, + "h": 86 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 76, + "h": 86 + }, + "frame": { + "x": 0, + "y": 86, + "w": 76, + "h": 86 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 76, + "h": 86 + }, + "frame": { + "x": 0, + "y": 172, + "w": 76, + "h": 86 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 76, + "h": 86 + }, + "frame": { + "x": 0, + "y": 258, + "w": 76, + "h": 86 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 74, + "h": 86 + }, + "frame": { + "x": 76, + "y": 0, + "w": 74, + "h": 86 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 74, + "h": 86 + }, + "frame": { + "x": 150, + "y": 0, + "w": 74, + "h": 86 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 74, + "h": 86 + }, + "frame": { + "x": 150, + "y": 0, + "w": 74, + "h": 86 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 74, + "h": 86 + }, + "frame": { + "x": 224, + "y": 0, + "w": 74, + "h": 86 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 74, + "h": 86 + }, + "frame": { + "x": 76, + "y": 86, + "w": 74, + "h": 86 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 74, + "h": 86 + }, + "frame": { + "x": 76, + "y": 172, + "w": 74, + "h": 86 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 74, + "h": 86 + }, + "frame": { + "x": 76, + "y": 258, + "w": 74, + "h": 86 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 74, + "h": 86 + }, + "frame": { + "x": 76, + "y": 258, + "w": 74, + "h": 86 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 74, + "h": 86 + }, + "frame": { + "x": 150, + "y": 86, + "w": 74, + "h": 86 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 74, + "h": 86 + }, + "frame": { + "x": 224, + "y": 86, + "w": 74, + "h": 86 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 74, + "h": 86 + }, + "frame": { + "x": 224, + "y": 86, + "w": 74, + "h": 86 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 74, + "h": 86 + }, + "frame": { + "x": 150, + "y": 172, + "w": 74, + "h": 86 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 72, + "h": 86 + }, + "frame": { + "x": 150, + "y": 258, + "w": 72, + "h": 86 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 72, + "h": 86 + }, + "frame": { + "x": 222, + "y": 258, + "w": 72, + "h": 86 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 79, + "h": 86 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 71, + "h": 86 + }, + "frame": { + "x": 224, + "y": 172, + "w": 71, + "h": 86 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:1b7ede0d536069418738b9c0f67f14fd:7b469c796eb673d31bdab8ad7b99b881:d0a607721d6bb74ae9b6d486116d85e3$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/754_2.json b/public/images/pokemon/variant/exp/back/754_2.json new file mode 100644 index 00000000000..f32f0133f99 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/754_2.json @@ -0,0 +1,1112 @@ +{ + "textures": [ + { + "image": "754_2.png", + "format": "RGBA8888", + "size": { + "w": 222, + "h": 222 + }, + "scale": 1, + "frames": [ + { + "filename": "0036.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 92, + "h": 68 + }, + "frame": { + "x": 0, + "y": 0, + "w": 92, + "h": 68 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 92, + "h": 68 + }, + "frame": { + "x": 92, + "y": 0, + "w": 92, + "h": 68 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 92, + "h": 68 + }, + "frame": { + "x": 92, + "y": 0, + "w": 92, + "h": 68 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 92, + "h": 68 + }, + "frame": { + "x": 92, + "y": 0, + "w": 92, + "h": 68 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 92, + "h": 68 + }, + "frame": { + "x": 92, + "y": 0, + "w": 92, + "h": 68 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 92, + "h": 68 + }, + "frame": { + "x": 92, + "y": 0, + "w": 92, + "h": 68 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 92, + "h": 68 + }, + "frame": { + "x": 92, + "y": 0, + "w": 92, + "h": 68 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 184, + "y": 0, + "w": 38, + "h": 68 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 184, + "y": 0, + "w": 38, + "h": 68 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 184, + "y": 0, + "w": 38, + "h": 68 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 184, + "y": 0, + "w": 38, + "h": 68 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 184, + "y": 0, + "w": 38, + "h": 68 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 184, + "y": 0, + "w": 38, + "h": 68 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 184, + "y": 0, + "w": 38, + "h": 68 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 184, + "y": 0, + "w": 38, + "h": 68 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 184, + "y": 0, + "w": 38, + "h": 68 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 184, + "y": 0, + "w": 38, + "h": 68 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 184, + "y": 0, + "w": 38, + "h": 68 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 92, + "h": 68 + }, + "frame": { + "x": 0, + "y": 68, + "w": 92, + "h": 68 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 92, + "h": 68 + }, + "frame": { + "x": 0, + "y": 68, + "w": 92, + "h": 68 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 92, + "h": 68 + }, + "frame": { + "x": 0, + "y": 136, + "w": 92, + "h": 68 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 92, + "h": 68 + }, + "frame": { + "x": 0, + "y": 136, + "w": 92, + "h": 68 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 88, + "h": 68 + }, + "frame": { + "x": 92, + "y": 68, + "w": 88, + "h": 68 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 88, + "h": 68 + }, + "frame": { + "x": 92, + "y": 68, + "w": 88, + "h": 68 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 40, + "h": 68 + }, + "frame": { + "x": 180, + "y": 68, + "w": 40, + "h": 68 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 40, + "h": 68 + }, + "frame": { + "x": 180, + "y": 68, + "w": 40, + "h": 68 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 39, + "h": 68 + }, + "frame": { + "x": 92, + "y": 136, + "w": 39, + "h": 68 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 39, + "h": 68 + }, + "frame": { + "x": 92, + "y": 136, + "w": 39, + "h": 68 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 39, + "h": 68 + }, + "frame": { + "x": 92, + "y": 136, + "w": 39, + "h": 68 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 39, + "h": 68 + }, + "frame": { + "x": 92, + "y": 136, + "w": 39, + "h": 68 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 39, + "h": 68 + }, + "frame": { + "x": 92, + "y": 136, + "w": 39, + "h": 68 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 39, + "h": 68 + }, + "frame": { + "x": 92, + "y": 136, + "w": 39, + "h": 68 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 131, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 131, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 131, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 131, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 131, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 131, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 131, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 131, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 131, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 131, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 169, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 169, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 169, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 169, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 169, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 169, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 169, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 169, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 169, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 169, + "y": 136, + "w": 38, + "h": 68 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:3adad944aac48ad53efa41f8c9916d1c:ea15b954875ad08814f50cbbf849c1b3:f7cb0e9bb3adbe899317e6e2e306035d$" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/862.json b/public/images/pokemon/variant/exp/back/862.json new file mode 100644 index 00000000000..d7d0dd5b874 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/862.json @@ -0,0 +1,30 @@ +{ + "1": { + "010101": "010101", + "1b2627": "1b2627", + "474749": "156a66", + "303034": "094448", + "6f7071": "01473a", + "b2b3b2": "90c093", + "463f39": "001b1a", + "f5f5f6": "f5ffea", + "949496": "1c8155", + "9b4f69": "d414dd", + "df84ad": "ff69fa", + "fcfcfc": "fcfcfc" + }, + "2": { + "010101": "010101", + "1b2627": "180c46", + "474749": "8655e1", + "303034": "5a3eb9", + "6f7071": "2e1d7b", + "b2b3b2": "1f1a43", + "463f39": "161058", + "f5f5f6": "342d4c", + "949496": "302e89", + "9b4f69": "0099ce", + "df84ad": "54f1ff", + "fcfcfc": "fcfcfc" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/970.json b/public/images/pokemon/variant/exp/back/970.json new file mode 100644 index 00000000000..cc48d2a3f3c --- /dev/null +++ b/public/images/pokemon/variant/exp/back/970.json @@ -0,0 +1,26 @@ +{ + "1": { + "242737": "242737", + "366956": "521d0c", + "41968b": "c57833", + "5de0aa": "fbce5d", + "262b6b": "323b51", + "3253d6": "577b81", + "2c369a": "435469", + "a02c75": "3f4a6f", + "fd84ba": "bbe3ee", + "e0548f": "758eb4" + }, + "2": { + "242737": "2e1d1a", + "366956": "6d171f", + "41968b": "b21a1a", + "5de0aa": "d95e3e", + "262b6b": "b07963", + "3253d6": "ffe6ca", + "2c369a": "d9aa8a", + "a02c75": "153532", + "fd84ba": "429d72", + "e0548f": "28625e" + } +} \ No newline at end of file diff --git a/public/images/pokemon_icons_7.json b/public/images/pokemon_icons_7.json index d4b52c7ab36..bd9f404eb26 100644 --- a/public/images/pokemon_icons_7.json +++ b/public/images/pokemon_icons_7.json @@ -5979,6 +5979,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:8e8bd4d6d941cb88610eb6155fd86133:38ee262ea69421a5e49109e3abfe85dd:2e7c5873ead8fd8fce82a0b3fcc86b42$" + "smartupdate": "$TexturePacker:SmartUpdate:a4de8d1c4f7d4f58c929b8b5479e03f1:3c8ac308e19a7f9420a4df8a78188490:2e7c5873ead8fd8fce82a0b3fcc86b42$" } } diff --git a/public/images/pokemon_icons_7.png b/public/images/pokemon_icons_7.png index 40c3e96a588..c9a396ed5c6 100644 Binary files a/public/images/pokemon_icons_7.png and b/public/images/pokemon_icons_7.png differ diff --git a/public/images/pokemon_icons_8.json b/public/images/pokemon_icons_8.json index bac1c6fbea6..11a2dcc1f4a 100644 --- a/public/images/pokemon_icons_8.json +++ b/public/images/pokemon_icons_8.json @@ -7365,6 +7365,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:c7db0232f46f4f968b13cb4a8cdb7bce:bcba724c9d58839d9045773dbcc992bc:8190d2ecf16422e962cfb1a751b5e1fc$" + "smartupdate": "$TexturePacker:SmartUpdate:4716314f809733c6bcb221809776ba11:4fb09375a87d8a348dc0e609db8a95fd:8190d2ecf16422e962cfb1a751b5e1fc$" } } diff --git a/public/images/pokemon_icons_8.png b/public/images/pokemon_icons_8.png index 0ef0389a595..8f7b398a034 100644 Binary files a/public/images/pokemon_icons_8.png and b/public/images/pokemon_icons_8.png differ diff --git a/src/battle-scene-events.ts b/src/battle-scene-events.ts new file mode 100644 index 00000000000..22959493f06 --- /dev/null +++ b/src/battle-scene-events.ts @@ -0,0 +1,76 @@ +import Move from "./data/move"; + +/** Alias for all {@linkcode BattleScene} events */ +export enum BattleSceneEventType { + /** + * Triggers when a move is successfully used + * @see {@linkcode MoveUsedEvent} + */ + MOVE_USED = "onMoveUsed", + /** + * Triggers on the first turn of a new battle + * @see {@linkcode TurnInitEvent} + */ + TURN_INIT = "onTurnInit", + /** + * Triggers after a turn ends in battle + * @see {@linkcode TurnEndEvent} + */ + TURN_END = "onTurnEnd", + /** + * Triggers when a new {@linkcode Arena} is created during initialization + * @see {@linkcode NewArenaEvent} + */ + NEW_ARENA = "onNewArena", +} + +/** + * Container class for {@linkcode BattleSceneEventType.MOVE_USED} events + * @extends Event +*/ +export class MoveUsedEvent extends Event { + /** The ID of the {@linkcode Pokemon} that used the {@linkcode Move} */ + public userId: number; + /** The {@linkcode Move} used */ + public move: Move; + /** The amount of PP used on the {@linkcode Move} this turn */ + public ppUsed: number; + constructor(userId: number, move: Move, ppUsed: number) { + super(BattleSceneEventType.MOVE_USED); + + this.userId = userId; + this.move = move; + this.ppUsed = ppUsed; + } +} +/** + * Container class for {@linkcode BattleSceneEventType.TURN_INIT} events + * @extends Event +*/ +export class TurnInitEvent extends Event { + constructor() { + super(BattleSceneEventType.TURN_INIT); + } +} +/** + * Container class for {@linkcode BattleSceneEventType.TURN_END} events + * @extends Event +*/ +export class TurnEndEvent extends Event { + /** The amount of turns in the current battle */ + public turnCount: number; + constructor(turnCount: number) { + super(BattleSceneEventType.TURN_END); + + this.turnCount = turnCount; + } +} +/** + * Container class for {@linkcode BattleSceneEventType.NEW_ARENA} events + * @extends Event +*/ +export class NewArenaEvent extends Event { + constructor() { + super(BattleSceneEventType.NEW_ARENA); + } +} diff --git a/src/battle-scene.ts b/src/battle-scene.ts index ba035cc7221..bd38ec2a0bc 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -2,7 +2,7 @@ import Phaser from "phaser"; import UI from "./ui/ui"; import { NextEncounterPhase, NewBiomeEncounterPhase, SelectBiomePhase, MessagePhase, TurnInitPhase, ReturnPhase, LevelCapPhase, ShowTrainerPhase, LoginPhase, MovePhase, TitlePhase, SwitchPhase } from "./phases"; import Pokemon, { PlayerPokemon, EnemyPokemon } from "./field/pokemon"; -import PokemonSpecies, { PokemonSpeciesFilter, allSpecies, getPokemonSpecies, initSpecies } from "./data/pokemon-species"; +import PokemonSpecies, { PokemonSpeciesFilter, allSpecies, getPokemonSpecies } from "./data/pokemon-species"; import * as Utils from "./utils"; import { Modifier, ModifierBar, ConsumablePokemonModifier, ConsumableModifier, PokemonHpRestoreModifier, HealingBoosterModifier, PersistentModifier, PokemonHeldItemModifier, ModifierPredicate, DoubleBattleChanceBoosterModifier, FusePokemonModifier, PokemonFormChangeItemModifier, TerastallizeModifier, overrideModifiers, overrideHeldItems } from "./modifier/modifier"; import { PokeballType } from "./data/pokeball"; @@ -15,10 +15,9 @@ import { GameData, PlayerGender } from "./system/game-data"; import { TextStyle, addTextObject } from "./ui/text"; import { Moves } from "./data/enums/moves"; import { allMoves } from "./data/move"; -import { initMoves } from "./data/move"; import { ModifierPoolType, getDefaultModifierTypeForTier, getEnemyModifierTypesForWave, getLuckString, getLuckTextTint, getModifierPoolForType, getPartyLuckValue } from "./modifier/modifier-type"; import AbilityBar from "./ui/ability-bar"; -import { BlockItemTheftAbAttr, DoubleBattleChanceAbAttr, IncrementMovePriorityAbAttr, applyAbAttrs, initAbilities } from "./data/ability"; +import { BlockItemTheftAbAttr, DoubleBattleChanceAbAttr, IncrementMovePriorityAbAttr, applyAbAttrs } from "./data/ability"; import { allAbilities } from "./data/ability"; import Battle, { BattleType, FixedBattleConfig, fixedBattles } from "./battle"; import { GameMode, GameModes, gameModes } from "./game-mode"; @@ -57,6 +56,7 @@ import { Localizable } from "./plugins/i18n"; import * as Overrides from "./overrides"; import {InputsController} from "./inputs-controller"; import {UiInputs} from "./ui-inputs"; +import { NewArenaEvent } from "./battle-scene-events"; export const bypassLogin = import.meta.env.VITE_BYPASS_LOGIN === "1"; @@ -152,7 +152,8 @@ export default class BattleScene extends SceneBase { public money: integer; public pokemonInfoContainer: PokemonInfoContainer; private party: PlayerPokemon[]; - private waveCountText: Phaser.GameObjects.Text; + /** Combined Biome and Wave count text */ + private biomeWaveText: Phaser.GameObjects.Text; private moneyText: Phaser.GameObjects.Text; private scoreText: Phaser.GameObjects.Text; private luckLabelText: Phaser.GameObjects.Text; @@ -185,13 +186,16 @@ export default class BattleScene extends SceneBase { public rngSeedOverride: string = ""; public rngOffset: integer = 0; + /** + * Allows subscribers to listen for events + * + * Current Events: + * - {@linkcode BattleSceneEventType.MOVE_USED} {@linkcode MoveUsedEvent} + */ + public readonly eventTarget: EventTarget = new EventTarget(); + constructor() { super("battle"); - - initSpecies(); - initMoves(); - initAbilities(); - this.phaseQueue = []; this.phaseQueuePrepend = []; this.phaseQueuePrependSpliceIndex = -1; @@ -348,9 +352,9 @@ export default class BattleScene extends SceneBase { this.candyBar.setup(); this.fieldUI.add(this.candyBar); - this.waveCountText = addTextObject(this, (this.game.canvas.width / 6) - 2, 0, startingWave.toString(), TextStyle.BATTLE_INFO); - this.waveCountText.setOrigin(1, 0); - this.fieldUI.add(this.waveCountText); + this.biomeWaveText = addTextObject(this, (this.game.canvas.width / 6) - 2, 0, startingWave.toString(), TextStyle.BATTLE_INFO); + this.biomeWaveText.setOrigin(1, 0); + this.fieldUI.add(this.biomeWaveText); this.moneyText = addTextObject(this, (this.game.canvas.width / 6) - 2, 0, "", TextStyle.MONEY); this.moneyText.setOrigin(1, 0); @@ -478,7 +482,7 @@ export default class BattleScene extends SceneBase { } }); - this.updateWaveCountText(); + this.updateBiomeWaveText(); this.updateMoneyText(); this.updateScoreText(); } @@ -553,17 +557,17 @@ export default class BattleScene extends SceneBase { const species = getPokemonSpecies(parseInt(s)); loadPokemonAssets.push(species.loadAssets(this, false, 0, false)); } - + Promise.all(loadPokemonAssets).then(() => { const starterCandyColors = {}; const rgbaToHexFunc = (r, g, b) => [r, g, b].map(x => x.toString(16).padStart(2, '0')).join(''); - + for (let s of Object.keys(speciesStarters)) { const species = getPokemonSpecies(parseInt(s)); - + starterCandyColors[species.speciesId] = species.generateCandyColors(this).map(c => rgbaToHexFunc(c[0], c[1], c[2])); } - + console.log(JSON.stringify(starterCandyColors)); resolve(); @@ -669,7 +673,7 @@ export default class BattleScene extends SceneBase { addPokemonIcon(pokemon: Pokemon, x: number, y: number, originX: number = 0.5, originY: number = 0.5, ignoreOverride: boolean = false): Phaser.GameObjects.Container { const container = this.add.container(x, y); - + const icon = this.add.sprite(0, 0, pokemon.getIconAtlasKey(ignoreOverride)); icon.setFrame(pokemon.getIconId(true)); // Temporary fix to show pokemon's default icon if variant icon doesn't exist @@ -695,7 +699,7 @@ export default class BattleScene extends SceneBase { const originalFrame = icon.frame; const iconHeight = (icon.frame.cutHeight <= fusionIcon.frame.cutHeight ? Math.ceil : Math.floor)((icon.frame.cutHeight + fusionIcon.frame.cutHeight) / 4); - + // Inefficient, but for some reason didn't work with only the unique properties as part of the name const iconFrameId = `${icon.frame.name}f${fusionIcon.frame.name}`; @@ -760,7 +764,7 @@ export default class BattleScene extends SceneBase { } this.gameMode = gameModes[GameModes.CLASSIC]; - + this.setSeed(Overrides.SEED_OVERRIDE || Utils.randomString(24)); console.log("Seed:", this.seed); @@ -789,11 +793,11 @@ export default class BattleScene extends SceneBase { for (const p of this.getEnemyParty()) { p.destroy(); } - + this.currentBattle = null; - this.waveCountText.setText(startingWave.toString()); - this.waveCountText.setVisible(false); + this.biomeWaveText.setText(startingWave.toString()); + this.biomeWaveText.setVisible(false); this.updateMoneyText(); this.moneyText.setVisible(false); @@ -818,7 +822,7 @@ export default class BattleScene extends SceneBase { this.trainer.setTexture(`trainer_${this.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`); this.trainer.setPosition(406, 186); this.trainer.setVisible(true); - + this.updateGameInfo(); if (reloadI18n) { @@ -865,7 +869,7 @@ export default class BattleScene extends SceneBase { this.resetSeed(newWaveIndex); const playerField = this.getPlayerField(); - + if (this.gameMode.hasFixedBattles && fixedBattles.hasOwnProperty(newWaveIndex) && trainerData === undefined) { battleConfig = fixedBattles[newWaveIndex]; newDouble = battleConfig.double; @@ -986,12 +990,13 @@ export default class BattleScene extends SceneBase { } } } - + return this.currentBattle; } newArena(biome: Biome): Arena { this.arena = new Arena(this, biome, Biome[biome].toLowerCase()); + this.eventTarget.dispatchEvent(new NewArenaEvent()); this.arenaBg.pipelineData = { terrainColorRatio: this.arena.getBgTerrainColorRatioForBiome() }; @@ -1157,7 +1162,7 @@ export default class BattleScene extends SceneBase { if (!pokemon.pokerus || infectedIndexes.indexOf(p) > -1) { return; } - + this.executeWithSeedOffset(() => { if (p) { spread(p, -1); @@ -1242,16 +1247,17 @@ export default class BattleScene extends SceneBase { }); } - updateWaveCountText(): void { + updateBiomeWaveText(): void { const isBoss = !(this.currentBattle.waveIndex % 10); - this.waveCountText.setText(this.currentBattle.waveIndex.toString()); - this.waveCountText.setColor(!isBoss ? "#404040" : "#f89890"); - this.waveCountText.setShadowColor(!isBoss ? "#ded6b5" : "#984038"); - this.waveCountText.setVisible(true); + const biomeString: string = getBiomeName(this.arena.biomeType); + this.biomeWaveText.setText( biomeString + " - " + this.currentBattle.waveIndex.toString()); + this.biomeWaveText.setColor(!isBoss ? "#ffffff" : "#f89890"); + this.biomeWaveText.setShadowColor(!isBoss ? "#636363" : "#984038"); + this.biomeWaveText.setVisible(true); } updateMoneyText(): void { - this.moneyText.setText(`₽${this.money.toLocaleString("en-US")}`); + this.moneyText.setText(`₽${Utils.formatLargeNumber(this.money, 1000)}`); this.moneyText.setVisible(true); } @@ -1295,8 +1301,8 @@ export default class BattleScene extends SceneBase { updateUIPositions(): void { const enemyModifierCount = this.enemyModifiers.filter(m => m.isIconVisible(this)).length; - this.waveCountText.setY(-(this.game.canvas.height / 6) + (enemyModifierCount ? enemyModifierCount <= 12 ? 15 : 24 : 0)); - this.moneyText.setY(this.waveCountText.y + 10); + this.biomeWaveText.setY(-(this.game.canvas.height / 6) + (enemyModifierCount ? enemyModifierCount <= 12 ? 15 : 24 : 0)); + this.moneyText.setY(this.biomeWaveText.y + 10); this.scoreText.setY(this.moneyText.y + 10); [ this.luckLabelText, this.luckText ].map(l => l.setY((this.scoreText.visible ? this.scoreText : this.moneyText).y + 10)); const offsetY = (this.scoreText.visible ? this.scoreText : this.moneyText).y + 15; @@ -1622,7 +1628,7 @@ export default class BattleScene extends SceneBase { this.currentPhase = this.phaseQueue.shift(); this.currentPhase.start(); } - + overridePhase(phase: Phase): boolean { if (this.standbyPhase) { return false; @@ -1721,7 +1727,7 @@ export default class BattleScene extends SceneBase { this.queueMessage(`The stack for this item is full.\n You will receive ${defaultModifierType.name} instead.`, null, true); return this.addModifier(defaultModifierType.newModifier(), ignoreUpdate, playSound, false, instant).then(success => resolve(success)); } - + for (const rm of modifiersToRemove) { this.removeModifier(rm); } @@ -1750,7 +1756,7 @@ export default class BattleScene extends SceneBase { } else if (modifier instanceof FusePokemonModifier) { args.push(this.getPokemonById(modifier.fusePokemonId) as PlayerPokemon); } - + if (modifier.shouldApply(args)) { const result = modifier.apply(args); if (result instanceof Promise) { @@ -1760,7 +1766,7 @@ export default class BattleScene extends SceneBase { } } } - + return Promise.allSettled([this.party.map(p => p.updateInfo(instant)), ...modifierPromises]).then(() => resolve(success)); } else { const args = [ this ]; @@ -2109,7 +2115,7 @@ export default class BattleScene extends SceneBase { return false; } - + updateGameInfo(): void { const gameInfo = { playTime: this.sessionPlayTime ? this.sessionPlayTime : 0, diff --git a/src/battle.ts b/src/battle.ts index 0312cf2c3b6..eab2a2405c3 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -11,6 +11,7 @@ import { BattleSpec } from "./enums/battle-spec"; import { PlayerGender } from "./system/game-data"; import { MoneyMultiplierModifier, PokemonHeldItemModifier } from "./modifier/modifier"; import { PokeballType } from "./data/pokeball"; +import {trainerConfigs} from "#app/data/trainer-config"; export enum BattleType { WILD, @@ -89,7 +90,7 @@ export default class Battle { this.moneyScattered = 0; this.lastUsedPokeball = null; } - + private initBattleSpec(): void { let spec = BattleSpec.DEFAULT; if (this.gameMode.isWaveFinal(this.waveIndex) && this.gameMode.isClassic) { @@ -116,14 +117,14 @@ export default class Battle { } let levelOffset = 0; - + const deviation = 10 / levelWaveIndex; levelOffset = Math.abs(this.randSeedGaussForLevel(deviation)); return Math.max(Math.round(baseLevel + levelOffset), 1); } - randSeedGaussForLevel(value: number): number { + randSeedGaussForLevel(value: number): number { let rand = 0; for (let i = value; i > 0; i--) { rand += Phaser.Math.RND.realInRange(0, 1); @@ -162,7 +163,7 @@ export default class Battle { scene.applyModifiers(MoneyMultiplierModifier, true, moneyAmount); scene.addMoney(moneyAmount.value); - + scene.queueMessage(`You picked up ₽${moneyAmount.value.toLocaleString("en-US")}!`, null, true); scene.currentBattle.moneyScattered = 0; @@ -309,6 +310,10 @@ function getRandomTrainerFunc(trainerPool: (TrainerType | TrainerType[])[]): Get : trainerPoolEntry; trainerTypes.push(trainerType); } + // If the trainer type has a double variant, there's a 33% chance of it being a double battle + if (trainerConfigs[trainerTypes[rand]].trainerTypeDouble) { + return new Trainer(scene, trainerTypes[rand], Utils.randSeedInt(3) ? TrainerVariant.DOUBLE : TrainerVariant.DEFAULT); + } return new Trainer(scene, trainerTypes[rand], TrainerVariant.DEFAULT); }; } @@ -331,15 +336,15 @@ export const fixedBattles: FixedBattleConfigs = { [145]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_5, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)), [182]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.LORELEI, TrainerType.WILL, TrainerType.SIDNEY, TrainerType.AARON, TrainerType.SHAUNTAL, TrainerType.MALVA, [ TrainerType.HALA, TrainerType.MOLAYNE ], TrainerType.RIKA, TrainerType.CRISPIN ])), + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.LORELEI, TrainerType.WILL, TrainerType.SIDNEY, TrainerType.AARON, TrainerType.SHAUNTAL, TrainerType.MALVA, [ TrainerType.HALA, TrainerType.MOLAYNE ],TrainerType.MARNIE_ELITE, TrainerType.RIKA, TrainerType.CRISPIN ])), [184]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(182) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.BRUNO, TrainerType.KOGA, TrainerType.PHOEBE, TrainerType.BERTHA, TrainerType.MARSHAL, TrainerType.SIEBOLD, TrainerType.OLIVIA, TrainerType.POPPY, TrainerType.AMARYS ])), + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.BRUNO, TrainerType.KOGA, TrainerType.PHOEBE, TrainerType.BERTHA, TrainerType.MARSHAL, TrainerType.SIEBOLD, TrainerType.OLIVIA, TrainerType.NESSA_ELITE, TrainerType.POPPY, TrainerType.AMARYS ])), [186]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(182) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.AGATHA, TrainerType.BRUNO, TrainerType.GLACIA, TrainerType.FLINT, TrainerType.GRIMSLEY, TrainerType.WIKSTROM, TrainerType.ACEROLA, TrainerType.LARRY_ELITE, TrainerType.LACEY ])), + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.AGATHA, TrainerType.BRUNO, TrainerType.GLACIA, TrainerType.FLINT, TrainerType.GRIMSLEY, TrainerType.WIKSTROM, TrainerType.ACEROLA, [TrainerType.BEA_ELITE,TrainerType.ALLISTER_ELITE], TrainerType.LARRY_ELITE, TrainerType.LACEY ])), [188]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(182) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.LANCE, TrainerType.KAREN, TrainerType.DRAKE, TrainerType.LUCIAN, TrainerType.CAITLIN, TrainerType.DRASNA, TrainerType.KAHILI, TrainerType.HASSEL, TrainerType.DRAYTON ])), + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.LANCE, TrainerType.KAREN, TrainerType.DRAKE, TrainerType.LUCIAN, TrainerType.CAITLIN, TrainerType.DRASNA, TrainerType.KAHILI,TrainerType.RAIHAN_ELITE, TrainerType.HASSEL, TrainerType.DRAYTON ])), [190]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(182) - .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.BLUE, [ TrainerType.RED, TrainerType.LANCE_CHAMPION ], [ TrainerType.STEVEN, TrainerType.WALLACE ], TrainerType.CYNTHIA, [ TrainerType.ALDER, TrainerType.IRIS ], TrainerType.DIANTHA, TrainerType.HAU, [ TrainerType.GEETA, TrainerType.NEMONA ], TrainerType.KIERAN, TrainerType.LEON ])), + .setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.BLUE, [ TrainerType.RED, TrainerType.LANCE_CHAMPION ], [ TrainerType.STEVEN, TrainerType.WALLACE ], TrainerType.CYNTHIA, [ TrainerType.ALDER, TrainerType.IRIS ], TrainerType.DIANTHA, TrainerType.HAU,TrainerType.LEON, [ TrainerType.GEETA, TrainerType.NEMONA ], TrainerType.KIERAN])), [195]: new FixedBattleConfig().setBattleType(BattleType.TRAINER) .setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_6, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)) }; diff --git a/src/data/ability.ts b/src/data/ability.ts index 0553f5d982f..bfbd20b8be0 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -2,14 +2,14 @@ import Pokemon, { HitResult, PokemonMove } from "../field/pokemon"; import { Type } from "./type"; import * as Utils from "../utils"; import { BattleStat, getBattleStatName } from "./battle-stat"; -import { PokemonHealPhase, ShowAbilityPhase, StatChangePhase } from "../phases"; +import { MovePhase, PokemonHealPhase, ShowAbilityPhase, StatChangePhase } from "../phases"; import { getPokemonMessage, getPokemonPrefix } from "../messages"; import { Weather, WeatherType } from "./weather"; import { BattlerTag } from "./battler-tags"; import { BattlerTagType } from "./enums/battler-tag-type"; import { StatusEffect, getStatusEffectDescriptor, getStatusEffectHealText } from "./status-effect"; import { Gender } from "./gender"; -import Move, { AttackMove, MoveCategory, MoveFlags, MoveTarget, StatusMoveTypeImmunityAttr, FlinchAttr, OneHitKOAttr, HitHealAttr, StrengthSapHealAttr, allMoves, StatusMove, VariablePowerAttr, applyMoveAttrs, IncrementMovePriorityAttr } from "./move"; +import Move, { AttackMove, MoveCategory, MoveFlags, MoveTarget, StatusMoveTypeImmunityAttr, FlinchAttr, OneHitKOAttr, HitHealAttr, StrengthSapHealAttr, allMoves, StatusMove, SelfStatusMove, VariablePowerAttr, applyMoveAttrs, IncrementMovePriorityAttr } from "./move"; import { ArenaTagSide, ArenaTrapTag } from "./arena-tag"; import { ArenaTagType } from "./enums/arena-tag-type"; import { Stat } from "./pokemon-stat"; @@ -20,8 +20,10 @@ import { SpeciesFormChangeManualTrigger } from "./pokemon-forms"; import { Abilities } from "./enums/abilities"; import i18next, { Localizable } from "#app/plugins/i18n.js"; import { Command } from "../ui/command-ui-handler"; -import { getPokeballName } from "./pokeball"; import { BerryModifierType } from "#app/modifier/modifier-type"; +import { getPokeballName } from "./pokeball"; +import { Species } from "./enums/species"; +import {BattlerIndex} from "#app/battle"; export class Ability implements Localizable { public id: Abilities; @@ -68,10 +70,10 @@ export class Ability implements Localizable { const attr = new AttrType(...args); attr.addCondition(condition); this.attrs.push(attr); - + return this; } - + hasAttr(attrType: { new(...args: any[]): AbAttr }): boolean { return !!this.getAttrs(attrType).length; } @@ -117,7 +119,7 @@ export abstract class AbAttr { constructor(showAbility: boolean = true) { this.showAbility = showAbility; } - + apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { return false; } @@ -218,7 +220,7 @@ export class PostBattleInitStatChangeAbAttr extends PostBattleInitAbAttr { pokemon.scene.unshiftPhase(statChangePhase); } } - + return true; } } @@ -254,10 +256,10 @@ export class PreDefendFullHpEndureAbAttr extends PreDefendAbAttr { applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, cancelled: Utils.BooleanHolder, args: any[]): boolean { if (pokemon.hp === pokemon.getMaxHp() && pokemon.getMaxHp() > 1 && //Checks if pokemon has wonder_guard (which forces 1hp) - (args[0] as Utils.NumberHolder).value >= pokemon.hp){ //Damage >= hp + (args[0] as Utils.NumberHolder).value >= pokemon.hp) { //Damage >= hp return pokemon.addTag(BattlerTagType.STURDY, 1); } - + return false; } } @@ -265,7 +267,7 @@ export class PreDefendFullHpEndureAbAttr extends PreDefendAbAttr { export class BlockItemTheftAbAttr extends AbAttr { apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { cancelled.value = true; - + return true; } @@ -280,7 +282,7 @@ export class StabBoostAbAttr extends AbAttr { (args[0] as Utils.NumberHolder).value += 0.5; return true; } - + return false; } } @@ -371,7 +373,7 @@ export class TypeImmunityHealAbAttr extends TypeImmunityAbAttr { } return true; } - + return false; } } @@ -397,7 +399,7 @@ class TypeImmunityStatChangeAbAttr extends TypeImmunityAbAttr { pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ this.stat ], this.levels)); } } - + return ret; } } @@ -423,7 +425,7 @@ class TypeImmunityAddBattlerTagAbAttr extends TypeImmunityAbAttr { pokemon.addTag(this.tagType, this.turnCount, undefined, pokemon.id); } } - + return ret; } } @@ -458,7 +460,7 @@ export class PostDefendDisguiseAbAttr extends PostDefendAbAttr { applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean { if (pokemon.formIndex === 0 && pokemon.battleData.hitCount !== 0 && (move.getMove().category === MoveCategory.SPECIAL || move.getMove().category === MoveCategory.PHYSICAL)) { - + const recoilDamage = Math.ceil((pokemon.getMaxHp() / 8) - attacker.turnData.damageDealt); if (!recoilDamage) { return false; @@ -498,16 +500,16 @@ export class FieldPriorityMoveImmunityAbAttr extends PreDefendAbAttr { const attackPriority = new Utils.IntegerHolder(move.getMove().priority); applyMoveAttrs(IncrementMovePriorityAttr,attacker,null,move.getMove(),attackPriority); applyAbAttrs(IncrementMovePriorityAbAttr, attacker, null, move.getMove(), attackPriority); - - if(move.getMove().moveTarget===MoveTarget.USER) { + + if (move.getMove().moveTarget===MoveTarget.USER) { return false; } - if(attackPriority.value > 0 && !move.getMove().isMultiTarget()) { + if (attackPriority.value > 0 && !move.getMove().isMultiTarget()) { cancelled.value = true; return true; } - + return false; } } @@ -554,7 +556,10 @@ export class MoveImmunityStatChangeAbAttr extends MoveImmunityAbAttr { applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, cancelled: Utils.BooleanHolder, args: any[]): boolean { const ret = super.applyPreDefend(pokemon, passive, attacker, move, cancelled, args); if (ret) { - pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ this.stat ], this.levels)); + const simulated = args.length > 1 && args[1]; + if (!simulated) { + pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ this.stat ], this.levels)); + } } return ret; @@ -782,7 +787,7 @@ export class PostDefendCritStatChangeAbAttr extends PostDefendAbAttr { applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean { pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ this.stat ], this.levels)); - + return true; } @@ -799,14 +804,14 @@ export class PostDefendContactDamageAbAttr extends PostDefendAbAttr { this.damageRatio = damageRatio; } - + applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean { if (move.getMove().checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) { attacker.damageAndUpdate(Math.ceil(attacker.getMaxHp() * (1 / this.damageRatio)), HitResult.OTHER); attacker.turnData.damageTaken += Math.ceil(attacker.getMaxHp() * (1 / this.damageRatio)); return true; } - + return false; } @@ -837,7 +842,7 @@ export class PostDefendAbilitySwapAbAttr extends PostDefendAbAttr { constructor() { super(); } - + applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean { if (move.getMove().checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && !attacker.getAbility().hasAttr(UnswappableAbilityAbAttr)) { const tempAbilityId = attacker.getAbility().id; @@ -845,7 +850,7 @@ export class PostDefendAbilitySwapAbAttr extends PostDefendAbAttr { pokemon.summonData.ability = tempAbilityId; return true; } - + return false; } @@ -861,14 +866,14 @@ export class PostDefendAbilityGiveAbAttr extends PostDefendAbAttr { super(); this.ability = ability; } - + applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean { if (move.getMove().checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && !attacker.getAbility().hasAttr(UnsuppressableAbilityAbAttr) && !attacker.getAbility().hasAttr(PostDefendAbilityGiveAbAttr)) { attacker.summonData.ability = this.ability; return true; } - + return false; } @@ -887,7 +892,7 @@ export class PostDefendMoveDisableAbAttr extends PostDefendAbAttr { this.chance = chance; } - + applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean { if (!attacker.summonData.disabledMove) { if (move.getMove().checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && (this.chance === -1 || pokemon.randSeedInt(100) < this.chance) && !attacker.isMax()) { @@ -946,7 +951,7 @@ export class VariableMovePowerAbAttr extends PreAttackAbAttr { export class VariableMoveTypeAbAttr extends AbAttr { apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { //const power = args[0] as Utils.IntegerHolder; - return false; + return false; } } @@ -955,7 +960,7 @@ export class MoveTypeChangePowerMultiplierAbAttr extends VariableMoveTypeAbAttr private newType: Type; private powerMultiplier: number; - constructor(matchType: Type, newType: Type, powerMultiplier: number){ + constructor(matchType: Type, newType: Type, powerMultiplier: number) { super(true); this.matchType = matchType; this.newType = newType; @@ -969,7 +974,7 @@ export class MoveTypeChangePowerMultiplierAbAttr extends VariableMoveTypeAbAttr (args[1] as Utils.NumberHolder).value *= this.powerMultiplier; return true; } - + return false; } } @@ -986,7 +991,7 @@ export class MoveTypeChangeAttr extends PreAttackAbAttr { private powerMultiplier: number; private condition: PokemonAttackCondition; - constructor(newType: Type, powerMultiplier: number, condition: PokemonAttackCondition){ + constructor(newType: Type, powerMultiplier: number, condition: PokemonAttackCondition) { super(true); this.newType = newType; this.powerMultiplier = powerMultiplier; @@ -1008,21 +1013,21 @@ export class MoveTypeChangeAttr extends PreAttackAbAttr { /** * Class for abilities that boost the damage of moves * For abilities that boost the base power of moves, see VariableMovePowerAbAttr - * @param damageMultiplier the amount to multiply the damage by - * @param condition the condition for this ability to be applied + * @param damageMultiplier the amount to multiply the damage by + * @param condition the condition for this ability to be applied */ export class DamageBoostAbAttr extends PreAttackAbAttr { private damageMultiplier: number; private condition: PokemonAttackCondition; - constructor(damageMultiplier: number, condition: PokemonAttackCondition){ + constructor(damageMultiplier: number, condition: PokemonAttackCondition) { super(true); this.damageMultiplier = damageMultiplier; this.condition = condition; } /** - * + * * @param pokemon the attacker pokemon * @param passive N/A * @param defender the target pokemon @@ -1081,7 +1086,7 @@ export class LowHpMoveTypePowerBoostAbAttr extends MoveTypePowerBoostAbAttr { export class FieldVariableMovePowerAbAttr extends AbAttr { applyPreAttack(pokemon: Pokemon, passive: boolean, defender: Pokemon, move: PokemonMove, args: any[]): boolean { //const power = args[0] as Utils.NumberHolder; - return false; + return false; } } @@ -1210,7 +1215,7 @@ export class PostAttackApplyBattlerTagAbAttr extends PostAttackAbAttr { private chance: (user: Pokemon, target: Pokemon, move: PokemonMove) => integer; private effects: BattlerTagType[]; - + constructor(contactRequired: boolean, chance: (user: Pokemon, target: Pokemon, move: PokemonMove) => integer, ...effects: BattlerTagType[]) { super(); @@ -1287,7 +1292,7 @@ class PostVictoryStatChangeAbAttr extends PostVictoryAbAttr { ? this.stat(pokemon) : this.stat; pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ stat ], this.levels)); - + return true; } } @@ -1334,7 +1339,7 @@ export class PostKnockOutStatChangeAbAttr extends PostKnockOutAbAttr { ? this.stat(pokemon) : this.stat; pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ stat ], this.levels)); - + return true; } } @@ -1350,7 +1355,7 @@ export class CopyFaintedAllyAbilityAbAttr extends PostKnockOutAbAttr { pokemon.scene.queueMessage(getPokemonMessage(knockedOut, `'s ${allAbilities[knockedOut.getAbility().id].name} was taken over!`)); return true; } - + return false; } } @@ -1366,7 +1371,7 @@ export class IgnoreOpponentStatChangesAbAttr extends AbAttr { return true; } } -/** +/** * Ignores opponent's evasion stat changes when determining if a move hits or not * @extends AbAttr * @see {@linkcode apply} @@ -1382,14 +1387,14 @@ export class IgnoreOpponentEvasionAbAttr extends AbAttr { * @param cancelled N/A * @param args [0] {@linkcode Utils.IntegerHolder} of BattleStat.EVA * @returns if evasion level was successfully considered as 0 - */ + */ apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]) { (args[0] as Utils.IntegerHolder).value = 0; return true; } } -export class IntimidateImmunityAbAttr extends AbAttr { +export class IntimidateImmunityAbAttr extends AbAttr { constructor() { super(false); } @@ -1404,7 +1409,7 @@ export class IntimidateImmunityAbAttr extends AbAttr { } } -export class PostIntimidateStatChangeAbAttr extends AbAttr { +export class PostIntimidateStatChangeAbAttr extends AbAttr { private stats: BattleStat[]; private levels: integer; private overwrites: boolean; @@ -1445,7 +1450,7 @@ export class PostSummonMessageAbAttr extends PostSummonAbAttr { } } -export class PostSummonUnnamedMessageAbAttr extends PostSummonAbAttr { +export class PostSummonUnnamedMessageAbAttr extends PostSummonAbAttr { //Attr doesn't force pokemon name on the message private message: string; @@ -1455,7 +1460,7 @@ export class PostSummonUnnamedMessageAbAttr extends PostSummonAbAttr { this.message = message; } - applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean { + applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean { pokemon.scene.queueMessage(this.message); return true; @@ -1534,7 +1539,7 @@ export class PostSummonAllyHealAbAttr extends PostSummonAbAttr { Math.max(Math.floor(pokemon.getMaxHp() / this.healRatio), 1), getPokemonMessage(target, ` drank down all the\nmatcha that ${pokemon.name} made!`), true, !this.showAnim)); return true; } - + return false; } } @@ -1563,7 +1568,7 @@ export class PostSummonClearAllyStatsAbAttr extends PostSummonAbAttr { return true; } - + return false; } } @@ -1576,12 +1581,12 @@ export class DownloadAbAttr extends PostSummonAbAttr { applyPostSummon(pokemon: Pokemon, passive: boolean, args: any[]): boolean { this.enemyDef = 0; this.enemySpDef = 0; - + for (const opponent of pokemon.getOpponents()) { this.enemyDef += opponent.stats[BattleStat.DEF]; this.enemySpDef += opponent.stats[BattleStat.SPDEF]; } - + if (this.enemyDef < this.enemySpDef) { this.stats = [BattleStat.ATK]; } else { @@ -1592,7 +1597,7 @@ export class DownloadAbAttr extends PostSummonAbAttr { pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), false, this.stats, 1)); return true; } - + return false; } } @@ -1654,7 +1659,7 @@ export class TraceAbAttr extends PostSummonAbAttr { if (!targets.length) { return false; } - + let target: Pokemon; if (targets.length > 1) { pokemon.scene.executeWithSeedOffset(() => target = Utils.randSeedItem(targets), pokemon.scene.currentBattle.waveIndex); @@ -1702,7 +1707,7 @@ export class PostSummonTransformAbAttr extends PostSummonAbAttr { pokemon.summonData.battleStats = target.summonData.battleStats.slice(0); pokemon.summonData.moveset = target.getMoveset().map(m => new PokemonMove(m.moveId, m.ppUsed, m.ppUp)); pokemon.summonData.types = target.getTypes(); - + pokemon.scene.playSound("PRSFX- Transform"); pokemon.loadAssets(false).then(() => pokemon.playAnim()); @@ -1768,7 +1773,7 @@ export class ProtectStatAbAttr extends PreStatChangeAbAttr { cancelled.value = true; return true; } - + return false; } @@ -1777,6 +1782,39 @@ export class ProtectStatAbAttr extends PreStatChangeAbAttr { } } +/** + * This attribute applies confusion to the target whenever the user + * directly poisons them with a move, e.g. Poison Puppeteer. + * Called in {@linkcode StatusEffectAttr}. + * @extends PostAttackAbAttr + * @see {@linkcode applyPostAttack} + */ +export class ConfusionOnStatusEffectAbAttr extends PostAttackAbAttr { + /** List of effects to apply confusion after */ + private effects: StatusEffect[]; + + constructor(...effects: StatusEffect[]) { + super(); + this.effects = effects; + } + /** + * Applies confusion to the target pokemon. + * @param pokemon {@link Pokemon} attacking + * @param passive N/A + * @param defender {@link Pokemon} defending + * @param move {@link Move} used to apply status effect and confusion + * @param hitResult N/A + * @param args [0] {@linkcode StatusEffect} applied by move + * @returns true if defender is confused + */ + applyPostAttack(pokemon: Pokemon, passive: boolean, defender: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean { + if (this.effects.indexOf(args[0]) > -1 && !defender.isFainted()) { + return defender.addTag(BattlerTagType.CONFUSED, pokemon.randSeedInt(3,2), move.moveId, defender.id); + } + return false; + } +} + export class PreSetStatusAbAttr extends AbAttr { applyPreSetStatus(pokemon: Pokemon, passive: boolean, effect: StatusEffect, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise { return false; @@ -1860,7 +1898,7 @@ export class MultCritAbAttr extends AbAttr { apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { const critMult = args[0] as Utils.NumberHolder; - if (critMult.value > 1){ + if (critMult.value > 1) { critMult.value *= this.multAmount; return true; } @@ -1885,14 +1923,14 @@ export class ConditionalCritAbAttr extends AbAttr { /** * @param pokemon {@linkcode Pokemon} user. - * @param args [0] {@linkcode Utils.BooleanHolder} If true critical hit is guaranteed. + * @param args [0] {@linkcode Utils.BooleanHolder} If true critical hit is guaranteed. * [1] {@linkcode Pokemon} Target. * [2] {@linkcode Move} used by ability user. */ apply(pokemon: Pokemon, passive: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { const target = (args[1] as Pokemon); const move = (args[2] as Move); - if(!this.condition(pokemon,target,move)) { + if (!this.condition(pokemon,target,move)) { return false; } @@ -1930,7 +1968,7 @@ export class IncrementMovePriorityAbAttr extends AbAttr { if (!this.moveIncrementFunc(pokemon, args[0] as Move)) { return false; } - + (args[1] as Utils.IntegerHolder).value += this.increaseAmount; return true; } @@ -2013,7 +2051,7 @@ function getAnticipationCondition(): AbAttrCondition { +(opponent.ivs[Stat.SPD] & 1) * 8 +(opponent.ivs[Stat.SPATK] & 1) * 16 +(opponent.ivs[Stat.SPDEF] & 1) * 32) * 15/63); - + const type = [ Type.FIGHTING, Type.FLYING, Type.POISON, Type.GROUND, Type.ROCK, Type.BUG, Type.GHOST, Type.STEEL, @@ -2065,10 +2103,10 @@ export class ForewarnAbAttr extends PostSummonAbAttr { } else { movePower = move.getMove().power; } - + if (movePower > maxPowerSeen) { maxPowerSeen = movePower; - maxMove = move.getName(); + maxMove = move.getName(); } } } @@ -2142,7 +2180,7 @@ export class PostWeatherLapseHealAbAttr extends PostWeatherLapseAbAttr { constructor(healFactor: integer, ...weatherTypes: WeatherType[]) { super(...weatherTypes); - + this.healFactor = healFactor; } @@ -2164,7 +2202,7 @@ export class PostWeatherLapseDamageAbAttr extends PostWeatherLapseAbAttr { constructor(damageFactor: integer, ...weatherTypes: WeatherType[]) { super(...weatherTypes); - + this.damageFactor = damageFactor; } @@ -2242,13 +2280,13 @@ export class PostTurnResetStatusAbAttr extends PostTurnAbAttr { this.target = pokemon; } if (this.target?.status) { - + this.target.scene.queueMessage(getPokemonMessage(this.target, getStatusEffectHealText(this.target.status?.effect))); this.target.resetStatus(false); this.target.updateInfo(); return true; } - + return false; } } @@ -2403,44 +2441,44 @@ export class PostTurnHurtIfSleepingAbAttr extends PostTurnAbAttr { /** * Deals damage to all sleeping opponents equal to 1/8 of their max hp (min 1) - * @param {Pokemon} pokemon Pokemon that has this ability + * @param {Pokemon} pokemon Pokemon that has this ability * @param {boolean} passive N/A * @param {any[]} args N/A * @returns {boolean} true if any opponents are sleeping */ applyPostTurn(pokemon: Pokemon, passive: boolean, args: any[]): boolean | Promise { let hadEffect: boolean = false; - for(const opp of pokemon.getOpponents()) { - if(opp.status !== undefined && opp.status.effect === StatusEffect.SLEEP) { + for (const opp of pokemon.getOpponents()) { + if (opp.status !== undefined && opp.status.effect === StatusEffect.SLEEP) { opp.damageAndUpdate(Math.floor(Math.max(1, opp.getMaxHp() / 8)), HitResult.OTHER); pokemon.scene.queueMessage(i18next.t("abilityTriggers:badDreams", {pokemonName: `${getPokemonPrefix(opp)}${opp.name}`})); hadEffect = true; } - + } return hadEffect; } } -/** - * Grabs the last failed Pokeball used - * @extends PostTurnAbAttr +/** + * Grabs the last failed Pokeball used + * @extends PostTurnAbAttr * @see {@linkcode applyPostTurn} */ export class FetchBallAbAttr extends PostTurnAbAttr { constructor() { super(); } - /** - * Adds the last used Pokeball back into the player's inventory - * @param pokemon {@linkcode Pokemon} with this ability - * @param passive N/A - * @param args N/A - * @returns true if player has used a pokeball and this pokemon is owned by the player + /** + * Adds the last used Pokeball back into the player's inventory + * @param pokemon {@linkcode Pokemon} with this ability + * @param passive N/A + * @param args N/A + * @returns true if player has used a pokeball and this pokemon is owned by the player */ applyPostTurn(pokemon: Pokemon, passive: boolean, args: any[]): boolean { const lastUsed = pokemon.scene.currentBattle.lastUsedPokeball; - if(lastUsed !== null && pokemon.isPlayer) { + if (lastUsed !== null && pokemon.isPlayer) { pokemon.scene.pokeballCounts[lastUsed]++; pokemon.scene.currentBattle.lastUsedPokeball = null; pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` found a\n${getPokeballName(lastUsed)}!`)); @@ -2484,6 +2522,62 @@ export class PostBiomeChangeTerrainChangeAbAttr extends PostBiomeChangeAbAttr { } } +/** + * Triggers just after a move is used either by the opponent or the player + * @extends AbAttr + */ +export class PostMoveUsedAbAttr extends AbAttr { + applyPostMoveUsed(pokemon: Pokemon, move: PokemonMove, source: Pokemon, targets: BattlerIndex[], args: any[]): boolean | Promise { + return false; + } +} + +/** + * Triggers after a dance move is used either by the opponent or the player + * @extends PostMoveUsedAbAttr + */ +export class PostDancingMoveAbAttr extends PostMoveUsedAbAttr { + /** + * Resolves the Dancer ability by replicating the move used by the source of the dance + * either on the source itself or on the target of the dance + * @param dancer {@linkcode Pokemon} with Dancer ability + * @param move {@linkcode PokemonMove} Dancing move used by the source + * @param source {@linkcode Pokemon} that used the dancing move + * @param targets {@linkcode BattlerIndex}Targets of the dancing move + * @param args N/A + * + * @return true if the Dancer ability was resolved + */ + applyPostMoveUsed(dancer: Pokemon, move: PokemonMove, source: Pokemon, targets: BattlerIndex[], args: any[]): boolean | Promise { + // The move to replicate cannot come from the Dancer + if (source.getBattlerIndex() !== dancer.getBattlerIndex()) { + // If the move is an AttackMove or a StatusMove the Dancer must replicate the move on the source of the Dance + if (move.getMove() instanceof AttackMove || move.getMove() instanceof StatusMove) { + const target = this.getTarget(dancer, source, targets); + dancer.scene.unshiftPhase(new MovePhase(dancer.scene, dancer, target, move, true)); + } else if (move.getMove() instanceof SelfStatusMove) { + // If the move is a SelfStatusMove (ie. Swords Dance) the Dancer should replicate it on itself + dancer.scene.unshiftPhase(new MovePhase(dancer.scene, dancer, [dancer.getBattlerIndex()], move, true)); + } + } + return true; + } + + /** + * Get the correct targets of Dancer ability + * + * @param dancer {@linkcode Pokemon} Pokemon with Dancer ability + * @param source {@linkcode Pokemon} Source of the dancing move + * @param targets {@linkcode BattlerIndex} Targets of the dancing move + */ + getTarget(dancer: Pokemon, source: Pokemon, targets: BattlerIndex[]) : BattlerIndex[] { + if (dancer.isPlayer()) { + return source.isPlayer() ? targets : [source.getBattlerIndex()]; + } + return source.isPlayer() ? [source.getBattlerIndex()] : targets; + } +} + export class StatChangeMultiplierAbAttr extends AbAttr { private multiplier: integer; @@ -2575,7 +2669,7 @@ export class ArenaTrapAbAttr extends CheckTrappedAbAttr { * @returns if enemy Pokemon is trapped or not */ applyCheckTrapped(pokemon: Pokemon, passive: boolean, trapped: Utils.BooleanHolder, otherPokemon: Pokemon, args: any[]): boolean { - if (otherPokemon.getTypes().includes(Type.GHOST)){ + if (otherPokemon.getTypes().includes(Type.GHOST)) { trapped.value = false; return false; } @@ -2630,7 +2724,7 @@ export class PostFaintAbAttr extends AbAttr { export class PostFaintContactDamageAbAttr extends PostFaintAbAttr { private damageRatio: integer; - + constructor(damageRatio: integer) { super(); @@ -2641,7 +2735,7 @@ export class PostFaintContactDamageAbAttr extends PostFaintAbAttr { if (move.getMove().checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) { const cancelled = new Utils.BooleanHolder(false); pokemon.scene.getField(true).map(p=>applyAbAttrs(FieldPreventExplosiveMovesAbAttr, p, cancelled)); - if (cancelled) { + if (cancelled.value) { return false; } attacker.damageAndUpdate(Math.ceil(attacker.getMaxHp() * (1 / this.damageRatio)), HitResult.OTHER); @@ -2657,7 +2751,7 @@ export class PostFaintContactDamageAbAttr extends PostFaintAbAttr { } } -/** +/** * Attribute used for abilities (Innards Out) that damage the opponent based on how much HP the last attack used to knock out the owner of the ability. */ export class PostFaintHPDamageAbAttr extends PostFaintAbAttr { @@ -2670,7 +2764,7 @@ export class PostFaintHPDamageAbAttr extends PostFaintAbAttr { attacker.damageAndUpdate((damage), HitResult.OTHER); attacker.turnData.damageTaken += damage; return true; - } + } getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string { return getPokemonMessage(pokemon, `'s ${abilityName} hurt\nits attacker!`); @@ -2690,7 +2784,7 @@ export class RedirectMoveAbAttr extends AbAttr { return false; } - + canRedirect(moveId: Moves): boolean { const move = allMoves[moveId]; return !![ MoveTarget.NEAR_OTHER, MoveTarget.OTHER ].find(t => move.moveTarget === t); @@ -2918,6 +3012,29 @@ export class IgnoreTypeStatusEffectImmunityAbAttr extends AbAttr { } } +/** + * Gives money to the user after the battle. + * + * @extends PostBattleAbAttr + * @see {@linkcode applyPostBattle} + */ +export class MoneyAbAttr extends PostBattleAbAttr { + constructor() { + super(); + } + + /** + * @param pokemon {@linkcode Pokemon} that is the user of this ability. + * @param passive N/A + * @param args N/A + * @returns true + */ + applyPostBattle(pokemon: Pokemon, passive: boolean, args: any[]): boolean { + pokemon.scene.currentBattle.moneyScattered += pokemon.scene.getWaveMoneyAmount(0.2); + return true; + } +} + function applyAbAttrsInternal(attrType: { new(...args: any[]): TAttr }, pokemon: Pokemon, applyFunc: AbAttrApplyFunc, args: any[], isAsync: boolean = false, showAbilityInstant: boolean = false, quiet: boolean = false, passive: boolean = false): Promise { return new Promise(resolve => { @@ -3013,6 +3130,11 @@ export function applyPostDefendAbAttrs(attrType: { new(...args: any[]): PostDefe return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostDefend(pokemon, passive, attacker, move, hitResult, args), args); } +export function applyPostMoveUsedAbAttrs(attrType: { new(...args: any[]): PostMoveUsedAbAttr }, + pokemon: Pokemon, move: PokemonMove, source: Pokemon, targets: BattlerIndex[], ...args: any[]): Promise { + return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostMoveUsed(pokemon, move, source, targets, args), args); +} + export function applyBattleStatMultiplierAbAttrs(attrType: { new(...args: any[]): BattleStatMultiplierAbAttr }, pokemon: Pokemon, battleStat: BattleStat, statValue: Utils.NumberHolder, ...args: any[]): Promise { return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyBattleStat(pokemon, passive, battleStat, statValue, args), args); @@ -3031,7 +3153,7 @@ export function applyPostAttackAbAttrs(attrType: { new(...args: any[]): PostAtta export function applyPostKnockOutAbAttrs(attrType: { new(...args: any[]): PostKnockOutAbAttr }, pokemon: Pokemon, knockedOut: Pokemon, ...args: any[]): Promise { return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostKnockOut(pokemon, passive, knockedOut, args), args); -} +} export function applyPostVictoryAbAttrs(attrType: { new(...args: any[]): PostVictoryAbAttr }, pokemon: Pokemon, ...args: any[]): Promise { @@ -3133,7 +3255,7 @@ export function initAbilities() { new Ability(Abilities.BATTLE_ARMOR, 3) .attr(BlockCritAbAttr) .ignorable(), - new Ability(Abilities.STURDY, 3) + new Ability(Abilities.STURDY, 3) .attr(PreDefendFullHpEndureAbAttr) .attr(BlockOneHitKOAbAttr) .ignorable(), @@ -3185,7 +3307,7 @@ export function initAbilities() { .attr(IntimidateImmunityAbAttr) .ignorable(), new Ability(Abilities.SUCTION_CUPS, 3) - .attr(ForceSwitchOutImmunityAbAttr) + .attr(ForceSwitchOutImmunityAbAttr) .ignorable(), new Ability(Abilities.INTIMIDATE, 3) .attr(PostSummonStatChangeAbAttr, BattleStat.ATK, -1, false, true), @@ -3395,7 +3517,7 @@ export function initAbilities() { .conditionalAttr(pokemon => pokemon.status ? pokemon.status.effect === StatusEffect.PARALYSIS : false, BattleStatMultiplierAbAttr, BattleStat.SPD, 2) .conditionalAttr(pokemon => !!pokemon.status, BattleStatMultiplierAbAttr, BattleStat.SPD, 1.5), new Ability(Abilities.NORMALIZE, 4) - .attr(MoveTypeChangeAttr, Type.NORMAL, 1.2, (user, target, move) => move.id !== Moves.HIDDEN_POWER && move.id !== Moves.WEATHER_BALL && + .attr(MoveTypeChangeAttr, Type.NORMAL, 1.2, (user, target, move) => move.id !== Moves.HIDDEN_POWER && move.id !== Moves.WEATHER_BALL && move.id !== Moves.NATURAL_GIFT && move.id !== Moves.JUDGMENT && move.id !== Moves.TECHNO_BLAST), new Ability(Abilities.SNIPER, 4) .attr(MultCritAbAttr, 1.5), @@ -3458,7 +3580,7 @@ export function initAbilities() { .attr(PostSummonWeatherChangeAbAttr, WeatherType.SNOW) .attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.SNOW), new Ability(Abilities.HONEY_GATHER, 4) - .unimplemented(), + .attr(MoneyAbAttr), new Ability(Abilities.FRISK, 4) .attr(FriskAbAttr), new Ability(Abilities.RECKLESS, 4) @@ -3518,8 +3640,8 @@ export function initAbilities() { .attr(MovePowerBoostAbAttr, (user, target, move) => move.category === MoveCategory.SPECIAL && user.status?.effect === StatusEffect.BURN, 1.5), new Ability(Abilities.HARVEST, 5) .attr( - PostTurnLootAbAttr, - "EATEN_BERRIES", + PostTurnLootAbAttr, + "EATEN_BERRIES", /** Rate is doubled when under sun {@link https://dex.pokemonshowdown.com/abilities/harvest} */ (pokemon) => 0.5 * (getWeatherCondition(WeatherType.SUNNY, WeatherType.HARSH_SUN)(pokemon) ? 2 : 1) ) @@ -3769,7 +3891,7 @@ export function initAbilities() { .attr(PostFaintHPDamageAbAttr) .bypassFaint(), new Ability(Abilities.DANCER, 7) - .unimplemented(), + .attr(PostDancingMoveAbAttr), new Ability(Abilities.BATTERY, 7) .unimplemented(), new Ability(Abilities.FLUFFY, 7) @@ -4032,7 +4154,7 @@ export function initAbilities() { .attr(PostDefendApplyArenaTrapTagAbAttr, (target, user, move) => move.category === MoveCategory.PHYSICAL, ArenaTagType.TOXIC_SPIKES) .bypassFaint(), new Ability(Abilities.ARMOR_TAIL, 9) - .attr(FieldPriorityMoveImmunityAbAttr) + .attr(FieldPriorityMoveImmunityAbAttr) .ignorable(), new Ability(Abilities.EARTH_EATER, 9) .attr(TypeImmunityHealAbAttr, Type.GROUND) @@ -4091,6 +4213,6 @@ export function initAbilities() { new Ability(Abilities.POISON_PUPPETEER, 9) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) - .unimplemented(), + .conditionalAttr(pokemon => pokemon.species.speciesId===Species.PECHARUNT,ConfusionOnStatusEffectAbAttr,StatusEffect.POISON,StatusEffect.TOXIC) ); } diff --git a/src/data/api.ts b/src/data/api.ts index 80097e1acc0..2a88fc8d410 100644 --- a/src/data/api.ts +++ b/src/data/api.ts @@ -103,7 +103,7 @@ export async function printPokemon() { const offset = 0; const pokemonResponse = await api.pokemon.listPokemons(offset, 2000); - + pokemonArr = pokemonResponse.results; const types = Utils.getEnumKeys(Type).map(t => t.toLowerCase()); @@ -121,7 +121,7 @@ export async function printPokemon() { if (!dexIdMatch) { continue; } - + const matchingSpecies = pokemonSpeciesList[parseInt(dexIdMatch[1]) - 1]; if (!matchingSpecies) { @@ -236,7 +236,7 @@ export async function printPokemon() { let generationIndex = 0; if (!region) { - while (++generationIndex < 9 && dexId > generationDexNumbers[generationIndex]){} + while (++generationIndex < 9 && dexId > generationDexNumbers[generationIndex]) {} } else { generationIndex = regionalForms.indexOf(region.toLowerCase()) + 6; } @@ -448,7 +448,7 @@ export async function printAbilities() { const replaceText = true; let abilityContent: string = await fs.readFile("./src/data/ability.ts"); - + const api = new MainClient(); let enumStr = "export enum Abilities {\n NONE,"; @@ -516,7 +516,7 @@ export async function printMoves() { const replaceText = true; let moveContent: string = await fs.readFile("./src/data/move.ts"); - + const api = new MainClient(); let enumStr = "export enum Moves {\n NONE,"; @@ -528,7 +528,7 @@ export async function printMoves() { const offset = 0; const movesResponse = await api.move.listMoves(offset, 2000); moves = movesResponse.results; - + console.log(moves); for (const m of moves) { @@ -594,7 +594,7 @@ export async function printTmSpecies() { const api = new MainClient(); const moveIds = Object.keys(tmSpecies).map(k => parseInt(k) as Moves); - + for (const moveId of moveIds) { const move = await api.move.getMoveById(moveId); @@ -643,9 +643,9 @@ export async function printTmSpecies() { console.log("NO MATCH", species.name); continue; } - + const speciesKey = Species[matchingSpecies.speciesId]; - + const matchingIndex = moveTmSpecies[moveId].findIndex(s => Array.isArray(s) ? s[0] === speciesKey : s === speciesKey); if (matchingIndex === -1) { diff --git a/src/data/arena-tag.ts b/src/data/arena-tag.ts index c96164ac2a1..3057132cafc 100644 --- a/src/data/arena-tag.ts +++ b/src/data/arena-tag.ts @@ -1,7 +1,7 @@ import { Arena } from "../field/arena"; import { Type } from "./type"; import * as Utils from "../utils"; -import { MoveCategory, allMoves } from "./move"; +import { MoveCategory, allMoves, MoveTarget } from "./move"; import { getPokemonMessage } from "../messages"; import Pokemon, { HitResult, PokemonMove } from "../field/pokemon"; import { MoveEffectPhase, PokemonHealPhase, StatChangePhase} from "../phases"; @@ -11,6 +11,7 @@ import { Moves } from "./enums/moves"; import { ArenaTagType } from "./enums/arena-tag-type"; import { BlockNonDirectDamageAbAttr, ProtectStatAbAttr, applyAbAttrs } from "./ability"; import { BattleStat } from "./battle-stat"; +import { CommonAnim, CommonBattleAnim } from "./battle-anims"; export enum ArenaTagSide { BOTH, @@ -72,7 +73,7 @@ export class MistTag extends ArenaTag { (args[0] as Utils.BooleanHolder).value = true; arena.scene.queueMessage("The mist prevented\nthe lowering of stats!"); - + return true; } } @@ -146,6 +147,128 @@ class AuroraVeilTag extends WeakenMoveScreenTag { } } +type ProtectConditionFunc = (...args: any[]) => boolean; + +/** + * Abstract class to implement conditional team protection + * applies protection based on the attributes of incoming moves + * @param protectConditionFunc: The function determining if an incoming move is negated + */ +abstract class ConditionalProtectTag extends ArenaTag { + protected protectConditionFunc: ProtectConditionFunc; + + constructor(tagType: ArenaTagType, sourceMove: Moves, sourceId: integer, side: ArenaTagSide, condition: ProtectConditionFunc) { + super(tagType, 1, sourceMove, sourceId, side); + + this.protectConditionFunc = condition; + } + + onAdd(arena: Arena): void { + arena.scene.queueMessage(`${super.getMoveName()} protected${this.side === ArenaTagSide.PLAYER ? " your" : this.side === ArenaTagSide.ENEMY ? " the\nopposing" : ""} team!`); + } + + // Removes default message for effect removal + onRemove(arena: Arena): void { } + + /** + * apply(): Checks incoming moves against the condition function + * and protects the target if conditions are met + * @param arena The arena containing this tag + * @param args[0] (Utils.BooleanHolder) Signals if the move is cancelled + * @param args[1] (Pokemon) The intended target of the move + * @param args[2...] (any[]) The parameters to the condition function + * @returns + */ + apply(arena: Arena, args: any[]): boolean { + if ((args[0] as Utils.BooleanHolder).value) { + return false; + } + + const target = args[1] as Pokemon; + if ((this.side === ArenaTagSide.PLAYER) === target.isPlayer() + && this.protectConditionFunc(...args.slice(2))) { + (args[0] as Utils.BooleanHolder).value = true; + new CommonBattleAnim(CommonAnim.PROTECT, target).play(arena.scene); + arena.scene.queueMessage(`${super.getMoveName()} protected ${getPokemonMessage(target, "!")}`); + return true; + } + return false; + } +} + +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Quick_Guard_(move) Quick Guard} + * Condition: The incoming move has increased priority. + */ +class QuickGuardTag extends ConditionalProtectTag { + constructor(sourceId: integer, side: ArenaTagSide) { + super(ArenaTagType.QUICK_GUARD, Moves.QUICK_GUARD, sourceId, side, + (priority: integer) : boolean => { + return priority > 0; + } + ); + } +} + +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Wide_Guard_(move) Wide Guard} + * Condition: The incoming move can target multiple Pokemon. The move's source + * can be an ally or enemy. + */ +class WideGuardTag extends ConditionalProtectTag { + constructor(sourceId: integer, side: ArenaTagSide) { + super(ArenaTagType.WIDE_GUARD, Moves.WIDE_GUARD, sourceId, side, + (moveTarget: MoveTarget) : boolean => { + switch (moveTarget) { + case MoveTarget.ALL_ENEMIES: + case MoveTarget.ALL_NEAR_ENEMIES: + case MoveTarget.ALL_OTHERS: + case MoveTarget.ALL_NEAR_OTHERS: + return true; + } + return false; + } + ); + } +} + +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Mat_Block_(move) Mat Block} + * Condition: The incoming move is a Physical or Special attack move. + */ +class MatBlockTag extends ConditionalProtectTag { + constructor(sourceId: integer, side: ArenaTagSide) { + super(ArenaTagType.MAT_BLOCK, Moves.MAT_BLOCK, sourceId, side, + (moveCategory: MoveCategory) : boolean => { + return moveCategory !== MoveCategory.STATUS; + } + ); + } + + onAdd(arena: Arena) { + const source = arena.scene.getPokemonById(this.sourceId); + arena.scene.queueMessage(getPokemonMessage(source, " intends to flip up a mat\nand block incoming attacks!")); + } +} + +/** + * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Crafty_Shield_(move) Crafty Shield} + * Condition: The incoming move is a Status move, is not a hazard, and does + * not target all Pokemon or sides of the field. +*/ +class CraftyShieldTag extends ConditionalProtectTag { + constructor(sourceId: integer, side: ArenaTagSide) { + super(ArenaTagType.CRAFTY_SHIELD, Moves.CRAFTY_SHIELD, sourceId, side, + (moveCategory: MoveCategory, moveTarget: MoveTarget) : boolean => { + return moveCategory === MoveCategory.STATUS + && moveTarget !== MoveTarget.ENEMY_SIDE + && moveTarget !== MoveTarget.BOTH_SIDES + && moveTarget !== MoveTarget.ALL; + } + ); + } +} + class WishTag extends ArenaTag { private battlerIndex: BattlerIndex; private triggerMessage: string; @@ -161,7 +284,7 @@ class WishTag extends ArenaTag { this.triggerMessage = getPokemonMessage(user, "'s wish\ncame true!"); this.healHp = Math.max(Math.floor(user.getMaxHp() / 2), 1); } - + onRemove(arena: Arena): void { const target = arena.scene.getField()[this.battlerIndex]; if (target?.isActive(true)) { @@ -299,7 +422,7 @@ class ToxicSpikesTag extends ArenaTrapTag { onAdd(arena: Arena): void { super.onAdd(arena); - + const source = arena.scene.getPokemonById(this.sourceId); arena.scene.queueMessage(`${this.getMoveName()} were scattered\nall around ${source.getOpponentDescriptor()}'s feet!`); } @@ -322,7 +445,7 @@ class ToxicSpikesTag extends ArenaTrapTag { const toxic = this.layers > 1; if (pokemon.trySetStatus(!toxic ? StatusEffect.POISON : StatusEffect.TOXIC, true, null, 0, `the ${this.getMoveName()}`)) { return true; - } + } } } @@ -410,7 +533,7 @@ class StealthRockTag extends ArenaTrapTag { if (cancelled.value) { return false; } - + const damageHpRatio = this.getDamageHpRatio(pokemon); if (damageHpRatio) { @@ -513,6 +636,14 @@ export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMov switch (tagType) { case ArenaTagType.MIST: return new MistTag(turnCount, sourceId, side); + case ArenaTagType.QUICK_GUARD: + return new QuickGuardTag(sourceId, side); + case ArenaTagType.WIDE_GUARD: + return new WideGuardTag(sourceId, side); + case ArenaTagType.MAT_BLOCK: + return new MatBlockTag(sourceId, side); + case ArenaTagType.CRAFTY_SHIELD: + return new CraftyShieldTag(sourceId, side); case ArenaTagType.MUD_SPORT: return new MudSportTag(turnCount, sourceId); case ArenaTagType.WATER_SPORT: diff --git a/src/data/battle-anims.ts b/src/data/battle-anims.ts index ff5b9889b49..efda3ebcb0e 100644 --- a/src/data/battle-anims.ts +++ b/src/data/battle-anims.ts @@ -296,7 +296,7 @@ class ImportedAnimFrame extends AnimFrame { abstract class AnimTimedEvent { public frameIndex: integer; public resourceName: string; - + constructor(frameIndex: integer, resourceName: string) { this.frameIndex = frameIndex; this.resourceName = resourceName; @@ -310,7 +310,7 @@ abstract class AnimTimedEvent { class AnimTimedSoundEvent extends AnimTimedEvent { public volume: number = 100; public pitch: number = 100; - + constructor(frameIndex: integer, resourceName: string, source?: any) { super(frameIndex, resourceName); @@ -813,7 +813,7 @@ export abstract class BattleAnim { this.srcLine = [ userFocusX, userFocusY, targetFocusX, targetFocusY ]; this.dstLine = [ userInitialX, userInitialY, targetInitialX, targetInitialY ]; - + let r = anim.frames.length; let f = 0; @@ -855,7 +855,7 @@ export abstract class BattleAnim { const pokemonSprite = sprites[spriteIndex]; const graphicFrameData = frameData.get(frame.target).get(spriteIndex); pokemonSprite.setPosition(graphicFrameData.x, graphicFrameData.y - ((spriteSource.height / 2) * (spriteSource.parentContainer.scale - 1))); - + pokemonSprite.setAngle(graphicFrameData.angle); pokemonSprite.setScale(graphicFrameData.scaleX * spriteSource.parentContainer.scale, graphicFrameData.scaleY * spriteSource.parentContainer.scale); @@ -873,7 +873,7 @@ export abstract class BattleAnim { scene.field.add(newSprite); spritePriorities.push(1); } - + const graphicIndex = g++; const moveSprite = sprites[graphicIndex]; if (spritePriorities[graphicIndex] !== frame.priority) { @@ -924,7 +924,7 @@ export abstract class BattleAnim { } moveSprite.setFrame(frame.graphicFrame); //console.log(AnimFocus[frame.focus]); - + const graphicFrameData = frameData.get(frame.target).get(graphicIndex); moveSprite.setPosition(graphicFrameData.x, graphicFrameData.y); moveSprite.setAngle(graphicFrameData.angle); @@ -999,7 +999,7 @@ export class CommonBattleAnim extends BattleAnim { export class MoveAnim extends BattleAnim { public move: Moves; - + constructor(move: Moves, user: Pokemon, target: BattlerIndex) { super(user, user.scene.getField()[target]); @@ -1027,7 +1027,7 @@ export class MoveAnim extends BattleAnim { export class MoveChargeAnim extends MoveAnim { private chargeAnim: ChargeAnim; - + constructor(chargeAnim: ChargeAnim, move: Moves, user: Pokemon) { super(move, user, 0); @@ -1060,13 +1060,13 @@ export async function populateAnims() { } const seNames = [];//(await fs.readdir('./public/audio/se/battle_anims/')).map(se => se.toString()); - + const animsData = [];//battleAnimRawData.split('!ruby/array:PBAnimation').slice(1); for (let a = 0; a < animsData.length; a++) { const fields = animsData[a].split("@").slice(1); const nameField = fields.find(f => f.startsWith("name: ")); - + let isOppMove: boolean; let commonAnimId: CommonAnim; let chargeAnimId: ChargeAnim; diff --git a/src/data/battle-stat.ts b/src/data/battle-stat.ts index 3971b850310..46e5a7dac8b 100644 --- a/src/data/battle-stat.ts +++ b/src/data/battle-stat.ts @@ -41,7 +41,7 @@ export function getBattleStatLevelChangeDescription(levels: integer, up: boolean case 4: case 5: case 6: - return "rose drastically"; + return "rose drastically"; default: return "won't go any higher"; } diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index cc8cc2e24de..2cf1c6eff64 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -106,7 +106,7 @@ export class RechargingTag extends BattlerTag { pokemon.scene.queueMessage(getPokemonMessage(pokemon, " must\nrecharge!")); (pokemon.scene.getCurrentPhase() as MovePhase).cancel(); pokemon.getMoveQueue().shift(); - + return true; } } @@ -115,7 +115,7 @@ export class TrappedTag extends BattlerTag { constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType, turnCount: integer, sourceMove: Moves, sourceId: integer) { super(tagType, lapseType, turnCount, sourceMove, sourceId); } - + canAdd(pokemon: Pokemon): boolean { const isGhost = pokemon.isOfType(Type.GHOST); const isTrapped = pokemon.getTag(BattlerTagType.TRAPPED); @@ -178,7 +178,7 @@ export class FlinchedTag extends BattlerTag { } export class InterruptedTag extends BattlerTag { - constructor(sourceMove: Moves){ + constructor(sourceMove: Moves) { super(BattlerTagType.INTERRUPTED, BattlerTagLapseType.PRE_MOVE, 0, sourceMove); } @@ -196,7 +196,7 @@ export class InterruptedTag extends BattlerTag { lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { super.lapse(pokemon, lapseType); (pokemon.scene.getCurrentPhase() as MovePhase).cancel(); - return true; + return true; } } @@ -211,14 +211,14 @@ export class ConfusedTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - + pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), undefined, CommonAnim.CONFUSION)); pokemon.scene.queueMessage(getPokemonMessage(pokemon, " became\nconfused!")); } onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); - + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " snapped\nout of confusion!")); } @@ -245,7 +245,7 @@ export class ConfusedTag extends BattlerTag { (pokemon.scene.getCurrentPhase() as MovePhase).cancel(); } } - + return ret; } @@ -254,6 +254,51 @@ export class ConfusedTag extends BattlerTag { } } +/** + * Tag applied to the {@linkcode Move.DESTINY_BOND} user. + * @extends BattlerTag + * @see {@linkcode apply} + */ +export class DestinyBondTag extends BattlerTag { + constructor(sourceMove: Moves, sourceId: integer) { + super(BattlerTagType.DESTINY_BOND, BattlerTagLapseType.PRE_MOVE, 1, sourceMove, sourceId); + } + + /** + * Lapses either before the user's move and does nothing + * or after receiving fatal damage. When the damage is fatal, + * the attacking Pokemon is taken down as well, unless it's a boss. + * + * @param {Pokemon} pokemon Pokemon that is attacking the Destiny Bond user. + * @param {BattlerTagLapseType} lapseType CUSTOM or PRE_MOVE + * @returns false if the tag source fainted or one turn has passed since the application + */ + lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { + if (lapseType !== BattlerTagLapseType.CUSTOM) { + return super.lapse(pokemon, lapseType); + } + const source = pokemon.scene.getPokemonById(this.sourceId); + if (!source.isFainted()) { + return true; + } + + if (source.getAlly() === pokemon) { + return false; + } + + const targetMessage = getPokemonMessage(pokemon, ""); + + if (pokemon.isBossImmune()) { + pokemon.scene.queueMessage(`${targetMessage} is unaffected\nby the effects of Destiny Bond.`); + return false; + } + + pokemon.scene.queueMessage(`${getPokemonMessage(source, ` took\n${targetMessage} down with it!`)}`); + pokemon.damageAndUpdate(pokemon.hp, HitResult.ONE_HIT_KO, false, false, true); + return false; + } +} + export class InfatuatedTag extends BattlerTag { constructor(sourceMove: integer, sourceId: integer) { super(BattlerTagType.INFATUATED, BattlerTagLapseType.MOVE, 1, sourceMove, sourceId); @@ -265,7 +310,7 @@ export class InfatuatedTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - + pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` fell in love\nwith ${pokemon.scene.getPokemonById(this.sourceId).name}!`)); } @@ -287,7 +332,7 @@ export class InfatuatedTag extends BattlerTag { (pokemon.scene.getCurrentPhase() as MovePhase).cancel(); } } - + return ret; } @@ -328,7 +373,7 @@ export class SeedTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " was seeded!")); this.sourceIndex = pokemon.scene.getPokemonById(this.sourceId).getBattlerIndex(); } @@ -354,7 +399,7 @@ export class SeedTag extends BattlerTag { } } } - + return ret; } @@ -370,7 +415,7 @@ export class NightmareTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " began\nhaving a Nightmare!")); } @@ -394,7 +439,7 @@ export class NightmareTag extends BattlerTag { pokemon.damageAndUpdate(Math.ceil(pokemon.getMaxHp() / 4)); } } - + return ret; } @@ -441,12 +486,12 @@ export class EncoreTag extends BattlerTag { if (pokemon.isMax()) { return false; } - + const lastMoves = pokemon.getLastXMoves(1); if (!lastMoves.length) { return false; } - + const repeatableMove = lastMoves[0]; if (!repeatableMove.move || repeatableMove.virtual) { @@ -463,7 +508,7 @@ export class EncoreTag extends BattlerTag { case Moves.ENCORE: return false; } - + if (allMoves[repeatableMove.move].getAttrs(ChargeAttr).length && repeatableMove.result === MoveResult.OTHER) { return false; } @@ -533,7 +578,7 @@ export class IngrainTag extends TrappedTag { pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, pokemon.getBattlerIndex(), Math.floor(pokemon.getMaxHp() / 16), getPokemonMessage(pokemon, " absorbed\nnutrients with its roots!"), true)); } - + return ret; } @@ -553,7 +598,7 @@ export class AquaRingTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " surrounded\nitself with a veil of water!")); } @@ -564,7 +609,7 @@ export class AquaRingTag extends BattlerTag { pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, pokemon.getBattlerIndex(), Math.floor(pokemon.getMaxHp() / 16), `${this.getMoveName()} restored\n${pokemon.name}\'s HP!`, true)); } - + return ret; } } @@ -585,7 +630,7 @@ export class MinimizeTag extends BattlerTag { lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { //If a pokemon dynamaxes they lose minimized status - if(pokemon.isMax()){ + if (pokemon.isMax()) { return false; } return lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType); @@ -1007,7 +1052,7 @@ export class SlowStartTag extends AbilityBattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " can't\nget it going!"), null, false, null, true); } @@ -1067,7 +1112,7 @@ export class HighestStatBoostTag extends AbilityBattlerTag { this.multiplier = 1.3; break; } - + pokemon.scene.queueMessage(getPokemonMessage(pokemon, `'s ${getStatName(highestStat)}\nwas heightened!`), null, false, null, true); } @@ -1121,7 +1166,7 @@ export class HideSpriteTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - + pokemon.setVisible(false); } @@ -1237,7 +1282,7 @@ export class SaltCuredTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " is being salt cured!")); this.sourceIndex = pokemon.scene.getPokemonById(this.sourceId).getBattlerIndex(); } @@ -1258,7 +1303,7 @@ export class SaltCuredTag extends BattlerTag { pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` is hurt by ${this.getMoveName()}!`)); } } - + return ret; } } @@ -1281,7 +1326,7 @@ export class CursedTag extends BattlerTag { onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - + pokemon.scene.queueMessage(getPokemonMessage(pokemon, " has been cursed!")); this.sourceIndex = pokemon.scene.getPokemonById(this.sourceId).getBattlerIndex(); } @@ -1300,7 +1345,7 @@ export class CursedTag extends BattlerTag { pokemon.scene.queueMessage(getPokemonMessage(pokemon, ` is hurt by the ${this.getMoveName()}!`)); } } - + return ret; } } @@ -1416,6 +1461,8 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: integer, sourc return new MagnetRisenTag(tagType, sourceMove); case BattlerTagType.MINIMIZED: return new MinimizeTag(); + case BattlerTagType.DESTINY_BOND: + return new DestinyBondTag(sourceMove, sourceId); case BattlerTagType.NONE: default: return new BattlerTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId); diff --git a/src/data/berry.ts b/src/data/berry.ts index ddc8a0d2821..e832ab0a43e 100644 --- a/src/data/berry.ts +++ b/src/data/berry.ts @@ -96,7 +96,7 @@ export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc { pokemon.scene.queueMessage(getPokemonMessage(pokemon, getStatusEffectHealText(pokemon.status.effect))); pokemon.resetStatus(); pokemon.updateInfo(); - } + } if (pokemon.getTag(BattlerTagType.CONFUSED)) { pokemon.lapseTag(BattlerTagType.CONFUSED); } @@ -137,7 +137,7 @@ export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc { pokemon.battleData.berriesEaten.push(berryType); } const ppRestoreMove = pokemon.getMoveset().find(m => !m.getPpRatio()) ? pokemon.getMoveset().find(m => !m.getPpRatio()) : pokemon.getMoveset().find(m => m.getPpRatio() < 1); - if(ppRestoreMove !== undefined){ + 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)}!`)); } diff --git a/src/data/biomes.ts b/src/data/biomes.ts index bd01feffe1c..4a29d10debb 100644 --- a/src/data/biomes.ts +++ b/src/data/biomes.ts @@ -5,25 +5,24 @@ import beautify from "json-beautify"; import { TrainerType } from "./enums/trainer-type"; import { TimeOfDay } from "./enums/time-of-day"; import { Biome } from "./enums/biome"; -import { SpeciesFormEvolution } from "./pokemon-evolutions"; +import {pokemonEvolutions, SpeciesFormEvolution} from "./pokemon-evolutions"; +import i18next from "i18next"; export function getBiomeName(biome: Biome | -1) { if (biome === -1) { - return "Somewhere you can't remember"; + return i18next.t("biome:unknownLocation"); } switch (biome) { case Biome.GRASS: - return "Grassy Field"; + return i18next.t("biome:GRASS"); case Biome.RUINS: - return "Ancient Ruins"; + return i18next.t("biome:RUINS"); case Biome.ABYSS: - return "The Abyss"; - case Biome.SPACE: - return "Stratosphere"; + return i18next.t("biome:ABYSS"); case Biome.END: - return "Final Destination"; + return i18next.t("biome:END"); default: - return Utils.toReadableString(Biome[biome]); + return i18next.t(`biome:${Biome[biome].toUpperCase()}`); } } @@ -57,7 +56,7 @@ export const biomeLinks: BiomeLinks = { [Biome.VOLCANO]: [ Biome.BEACH, [ Biome.ICE_CAVE, 4 ] ], [Biome.GRAVEYARD]: Biome.ABYSS, [Biome.DOJO]: [ Biome.PLAINS, [ Biome.TEMPLE, 3 ] ], - [Biome.FACTORY]: [ Biome.PLAINS, [ Biome.LABORATORY, 8 ] ], + [Biome.FACTORY]: [ Biome.PLAINS, [ Biome.LABORATORY, 4 ] ], [Biome.RUINS]: [ Biome.FOREST ], [Biome.WASTELAND]: Biome.BADLANDS, [Biome.ABYSS]: [ Biome.CAVE, [ Biome.SPACE, 3 ], [ Biome.WASTELAND, 3 ] ], @@ -200,7 +199,7 @@ export const biomePokemonPools: BiomePokemonPools = { [TimeOfDay.NIGHT]: [ { 1: [ Species.SHINX ], 15: [ Species.LUXIO ], 30: [ Species.LUXRAY ] } ], [TimeOfDay.ALL]: [ { 1: [ Species.ABRA ], 16: [ Species.KADABRA ] }, { 1: [ Species.BUNEARY ], 20: [ Species.LOPUNNY ] }, { 1: [ Species.ROOKIDEE ], 18: [ Species.CORVISQUIRE ], 38: [ Species.CORVIKNIGHT ] } ] }, - [BiomePoolTier.SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.FARFETCHD, Species.LICKITUNG, Species.CHANSEY, Species.EEVEE, Species.SNORLAX, { 1: [ Species.DUNSPARCE ], 72: [ Species.DUDUNSPARCE ] } ] }, + [BiomePoolTier.SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.FARFETCHD, Species.LICKITUNG, Species.CHANSEY, Species.EEVEE, Species.SNORLAX, { 1: [ Species.DUNSPARCE ], 62: [ Species.DUDUNSPARCE ] } ] }, [BiomePoolTier.ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.DITTO, Species.LATIAS, Species.LATIOS ] }, [BiomePoolTier.BOSS]: { [TimeOfDay.DAWN]: [ Species.DODRIO, Species.FURRET, Species.GUMSHOOS, Species.GREEDENT ], @@ -268,7 +267,7 @@ export const biomePokemonPools: BiomePokemonPools = { [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], - [TimeOfDay.ALL]: [ Species.PINSIR, { 1: [ Species.CHIKORITA ], 16: [ Species.BAYLEEF ], 32: [ Species.MEGANIUM ] }, { 1: [ Species.GIRAFARIG ], 72: [ Species.FARIGIRAF ] }, Species.ZANGOOSE, Species.KECLEON, Species.TROPIUS ] + [TimeOfDay.ALL]: [ Species.PINSIR, { 1: [ Species.CHIKORITA ], 16: [ Species.BAYLEEF ], 32: [ Species.MEGANIUM ] }, { 1: [ Species.GIRAFARIG ], 62: [ Species.FARIGIRAF ] }, Species.ZANGOOSE, Species.KECLEON, Species.TROPIUS ] }, [BiomePoolTier.SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.SCYTHER, Species.SHEDINJA, Species.ROTOM ] }, [BiomePoolTier.ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [] }, @@ -474,8 +473,8 @@ export const biomePokemonPools: BiomePokemonPools = { [TimeOfDay.ALL]: [ { 1: [ Species.TOTODILE ], 18: [ Species.CROCONAW ], 30: [ Species.FERALIGATR ] }, { 1: [ Species.MUDKIP ], 16: [ Species.MARSHTOMP ], 36: [ Species.SWAMPERT ] } ] }, [BiomePoolTier.SUPER_RARE]: { - [TimeOfDay.DAWN]: [ { 1: [ Species.GALAR_SLOWPOKE ], 40: [ Species.GALAR_SLOWBRO ] }, { 1: [ Species.HISUI_SLIGGOO ], 90: [ Species.HISUI_GOODRA ] } ], - [TimeOfDay.DAY]: [ { 1: [ Species.GALAR_SLOWPOKE ], 40: [ Species.GALAR_SLOWBRO ] }, { 1: [ Species.HISUI_SLIGGOO ], 90: [ Species.HISUI_GOODRA ] } ], + [TimeOfDay.DAWN]: [ { 1: [ Species.GALAR_SLOWPOKE ], 40: [ Species.GALAR_SLOWBRO ] }, { 1: [ Species.HISUI_SLIGGOO ], 80: [ Species.HISUI_GOODRA ] } ], + [TimeOfDay.DAY]: [ { 1: [ Species.GALAR_SLOWPOKE ], 40: [ Species.GALAR_SLOWBRO ] }, { 1: [ Species.HISUI_SLIGGOO ], 80: [ Species.HISUI_GOODRA ] } ], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ Species.POLITOED, Species.GALAR_STUNFISK ] @@ -2012,7 +2011,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { } }; -{ +export function initBiomes() { const pokemonBiomes = [ [ Species.BULBASAUR, Type.GRASS, Type.POISON, [ [ Biome.GRASS, BiomePoolTier.RARE ] @@ -3921,7 +3920,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { ], [ Species.PIPLUP, Type.WATER, -1, [ [ Biome.SEA, BiomePoolTier.RARE ] - ] + ] ], [ Species.PRINPLUP, Type.WATER, -1, [ [ Biome.SEA, BiomePoolTier.RARE ] @@ -7157,7 +7156,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [ Biome.JUNGLE, BiomePoolTier.COMMON ] ] ], - [ TrainerType.BAKER, [ + [ TrainerType.BAKER, [ [ Biome.SLUM, BiomePoolTier.UNCOMMON ] ] ], @@ -7166,7 +7165,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { ] ], [ TrainerType.BIKER, [ [ Biome.SLUM, BiomePoolTier.COMMON ] - ] + ] ], [ TrainerType.BLACK_BELT, [ [ Biome.DOJO, BiomePoolTier.COMMON ], @@ -7257,7 +7256,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [ TrainerType.RICH_KID, [] ], [ TrainerType.ROUGHNECK, [ [ Biome.SLUM, BiomePoolTier.COMMON ] - ] + ] ], [ TrainerType.SCIENTIST, [ [ Biome.DESERT, BiomePoolTier.COMMON ], @@ -7265,7 +7264,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { ] ], [ TrainerType.SMASHER, [] ], - [ TrainerType.SNOW_WORKER, [ + [ TrainerType.SNOW_WORKER, [ [ Biome.ICE_CAVE, BiomePoolTier.COMMON ], [ Biome.SNOWY_FOREST, BiomePoolTier.COMMON ] ] @@ -7273,7 +7272,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [ TrainerType.STRIKER, [] ], [ TrainerType.SCHOOL_KID, [ [ Biome.GRASS, BiomePoolTier.COMMON ] - ] + ] ], [ TrainerType.SWIMMER, [ [ Biome.SEA, BiomePoolTier.COMMON ] @@ -7285,7 +7284,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { ], [ TrainerType.VETERAN, [ [ Biome.WASTELAND, BiomePoolTier.COMMON ] - ] + ] ], [ TrainerType.WAITER, [ [ Biome.METROPOLIS, BiomePoolTier.COMMON ] @@ -7677,130 +7676,127 @@ export const biomeTrainerPools: BiomeTrainerPools = { traverseBiome(Biome.TOWN, 0); biomeDepths[Biome.END] = [ Object.values(biomeDepths).map(d => d[0]).reduce((max: integer, value: integer) => Math.max(max, value), 0) + 1, 1 ]; - import("./pokemon-evolutions").then(pe => { - const pokemonEvolutions = pe.pokemonEvolutions; - for (const biome of Utils.getEnumValues(Biome)) { - biomePokemonPools[biome] = {}; - biomeTrainerPools[biome] = {}; + for (const biome of Utils.getEnumValues(Biome)) { + biomePokemonPools[biome] = {}; + biomeTrainerPools[biome] = {}; - for (const tier of Utils.getEnumValues(BiomePoolTier)) { - biomePokemonPools[biome][tier] = {}; - biomeTrainerPools[biome][tier] = []; + for (const tier of Utils.getEnumValues(BiomePoolTier)) { + biomePokemonPools[biome][tier] = {}; + biomeTrainerPools[biome][tier] = []; - for (const tod of Utils.getEnumValues(TimeOfDay)) { - biomePokemonPools[biome][tier][tod] = []; - } + for (const tod of Utils.getEnumValues(TimeOfDay)) { + biomePokemonPools[biome][tier][tod] = []; } } + } - for (const pb of pokemonBiomes) { - const speciesId = pb[0] as Species; - const biomeEntries = pb[3] as (Biome | BiomePoolTier)[][]; + for (const pb of pokemonBiomes) { + const speciesId = pb[0] as Species; + const biomeEntries = pb[3] as (Biome | BiomePoolTier)[][]; - const speciesEvolutions: SpeciesFormEvolution[] = pokemonEvolutions.hasOwnProperty(speciesId) - ? pokemonEvolutions[speciesId] - : []; - - if (!biomeEntries.filter(b => b[0] !== Biome.END).length && !speciesEvolutions.filter(es => !!((pokemonBiomes.find(p => p[0] === es.speciesId))[3] as any[]).filter(b => b[0] !== Biome.END).length).length) { - uncatchableSpecies.push(speciesId); - } + const speciesEvolutions: SpeciesFormEvolution[] = pokemonEvolutions.hasOwnProperty(speciesId) + ? pokemonEvolutions[speciesId] + : []; - for (const b of biomeEntries) { - const biome = b[0]; - const tier = b[1]; - const timesOfDay = b.length > 2 - ? Array.isArray(b[2]) - ? b[2] - : [ b[2] ] - : [ TimeOfDay.ALL ]; - - for (const tod of timesOfDay) { - if (!biomePokemonPools.hasOwnProperty(biome) || !biomePokemonPools[biome].hasOwnProperty(tier) || !biomePokemonPools[biome][tier].hasOwnProperty(tod)) { - continue; - } - - const biomeTierPool = biomePokemonPools[biome][tier][tod]; - - let treeIndex = -1; - let arrayIndex = 0; - - for (let t = 0; t < biomeTierPool.length; t++) { - const existingSpeciesIds = biomeTierPool[t] as unknown as Species[]; - for (let es = 0; es < existingSpeciesIds.length; es++) { - const existingSpeciesId = existingSpeciesIds[es]; - if (pokemonEvolutions.hasOwnProperty(existingSpeciesId) && (pokemonEvolutions[existingSpeciesId] as SpeciesFormEvolution[]).find(ese => ese.speciesId === speciesId)) { - treeIndex = t; - arrayIndex = es + 1; - break; - } else if (speciesEvolutions && speciesEvolutions.find(se => se.speciesId === existingSpeciesId)) { - treeIndex = t; - arrayIndex = es; - break; - } - } - if (treeIndex > -1) { - break; - } - } - - if (treeIndex > -1) { - (biomeTierPool[treeIndex] as unknown as Species[]).splice(arrayIndex, 0, speciesId); - } else { - (biomeTierPool as unknown as Species[][]).push([ speciesId ]); - } - } - } + if (!biomeEntries.filter(b => b[0] !== Biome.END).length && !speciesEvolutions.filter(es => !!((pokemonBiomes.find(p => p[0] === es.speciesId))[3] as any[]).filter(b => b[0] !== Biome.END).length).length) { + uncatchableSpecies.push(speciesId); } - for (const b of Object.keys(biomePokemonPools)) { - for (const t of Object.keys(biomePokemonPools[b])) { - const tier = parseInt(t) as BiomePoolTier; - for (const tod of Object.keys(biomePokemonPools[b][t])) { - const biomeTierTimePool = biomePokemonPools[b][t][tod]; - for (let e = 0; e < biomeTierTimePool.length; e++) { - const entry = biomeTierTimePool[e]; - if (entry.length === 1) { - biomeTierTimePool[e] = entry[0]; - } else { - const newEntry = { - 1: [ entry[0] ] - }; - for (let s = 1; s < entry.length; s++) { - const speciesId = entry[s]; - const prevolution = entry.map(s => pokemonEvolutions[s]).flat().find(e => e && e.speciesId === speciesId); - const level = prevolution.level - (prevolution.level === 1 ? 1 : 0) + (prevolution.wildDelay * 10) - (tier >= BiomePoolTier.BOSS ? 10 : 0); - if (!newEntry.hasOwnProperty(level)) { - newEntry[level] = [ speciesId ]; - } else { - newEntry[level].push(speciesId); - } - } - biomeTierTimePool[e] = newEntry; - } - } - } - } - } + for (const b of biomeEntries) { + const biome = b[0]; + const tier = b[1]; + const timesOfDay = b.length > 2 + ? Array.isArray(b[2]) + ? b[2] + : [ b[2] ] + : [ TimeOfDay.ALL ]; - for (const tb of trainerBiomes) { - const trainerType = tb[0] as TrainerType; - const biomeEntries = tb[1] as BiomePoolTier[][]; - - for (const b of biomeEntries) { - const biome = b[0]; - const tier = b[1]; - - if (!biomeTrainerPools.hasOwnProperty(biome) || !biomeTrainerPools[biome].hasOwnProperty(tier)) { + for (const tod of timesOfDay) { + if (!biomePokemonPools.hasOwnProperty(biome) || !biomePokemonPools[biome].hasOwnProperty(tier) || !biomePokemonPools[biome][tier].hasOwnProperty(tod)) { continue; } - const biomeTierPool = biomeTrainerPools[biome][tier]; - biomeTierPool.push(trainerType); + const biomeTierPool = biomePokemonPools[biome][tier][tod]; + + let treeIndex = -1; + let arrayIndex = 0; + + for (let t = 0; t < biomeTierPool.length; t++) { + const existingSpeciesIds = biomeTierPool[t] as unknown as Species[]; + for (let es = 0; es < existingSpeciesIds.length; es++) { + const existingSpeciesId = existingSpeciesIds[es]; + if (pokemonEvolutions.hasOwnProperty(existingSpeciesId) && (pokemonEvolutions[existingSpeciesId] as SpeciesFormEvolution[]).find(ese => ese.speciesId === speciesId)) { + treeIndex = t; + arrayIndex = es + 1; + break; + } else if (speciesEvolutions && speciesEvolutions.find(se => se.speciesId === existingSpeciesId)) { + treeIndex = t; + arrayIndex = es; + break; + } + } + if (treeIndex > -1) { + break; + } + } + + if (treeIndex > -1) { + (biomeTierPool[treeIndex] as unknown as Species[]).splice(arrayIndex, 0, speciesId); + } else { + (biomeTierPool as unknown as Species[][]).push([ speciesId ]); + } } } + } + for (const b of Object.keys(biomePokemonPools)) { + for (const t of Object.keys(biomePokemonPools[b])) { + const tier = parseInt(t) as BiomePoolTier; + for (const tod of Object.keys(biomePokemonPools[b][t])) { + const biomeTierTimePool = biomePokemonPools[b][t][tod]; + for (let e = 0; e < biomeTierTimePool.length; e++) { + const entry = biomeTierTimePool[e]; + if (entry.length === 1) { + biomeTierTimePool[e] = entry[0]; + } else { + const newEntry = { + 1: [ entry[0] ] + }; + for (let s = 1; s < entry.length; s++) { + const speciesId = entry[s]; + const prevolution = entry.map(s => pokemonEvolutions[s]).flat().find(e => e && e.speciesId === speciesId); + const level = prevolution.level - (prevolution.level === 1 ? 1 : 0) + (prevolution.wildDelay * 10) - (tier >= BiomePoolTier.BOSS ? 10 : 0); + if (!newEntry.hasOwnProperty(level)) { + newEntry[level] = [ speciesId ]; + } else { + newEntry[level].push(speciesId); + } + } + biomeTierTimePool[e] = newEntry; + } + } + } + } + } + + for (const tb of trainerBiomes) { + const trainerType = tb[0] as TrainerType; + const biomeEntries = tb[1] as BiomePoolTier[][]; + + for (const b of biomeEntries) { + const biome = b[0]; + const tier = b[1]; + + if (!biomeTrainerPools.hasOwnProperty(biome) || !biomeTrainerPools[biome].hasOwnProperty(tier)) { + continue; + } + + const biomeTierPool = biomeTrainerPools[biome][tier]; + biomeTierPool.push(trainerType); + } //outputPools(); - }); + } + // used in a commented code // eslint-disable-next-line @typescript-eslint/no-unused-vars diff --git a/src/data/daily-run.ts b/src/data/daily-run.ts index 6fd6c630181..cb4bfddc685 100644 --- a/src/data/daily-run.ts +++ b/src/data/daily-run.ts @@ -54,7 +54,7 @@ export function getDailyRunStarters(scene: BattleScene, seed: string): Starter[] starters.push(getDailyRunStarter(scene, starterSpecies, startingLevel)); } }, 0, seed); - + return starters; } diff --git a/src/data/dialogue.ts b/src/data/dialogue.ts index c457aa47d7a..c6e7d829a1c 100644 --- a/src/data/dialogue.ts +++ b/src/data/dialogue.ts @@ -1,15 +1,15 @@ -import { trainerConfigs } from "./trainer-config"; -import { TrainerType } from "./enums/trainer-type"; -import { BattleSpec } from "../enums/battle-spec"; +import {trainerConfigs} from "./trainer-config"; +import {TrainerType} from "./enums/trainer-type"; +import {BattleSpec} from "../enums/battle-spec"; export interface TrainerTypeMessages { - encounter?: string | string[], - victory?: string | string[], - defeat?: string | string[] + encounter?: string | string[], + victory?: string | string[], + defeat?: string | string[] } export interface TrainerTypeDialogue { - [key: integer]: TrainerTypeMessages | [ TrainerTypeMessages, TrainerTypeMessages ] + [key: integer]: TrainerTypeMessages | [TrainerTypeMessages, TrainerTypeMessages] } export const trainerTypeDialogue = { @@ -84,7 +84,7 @@ export const trainerTypeDialogue = { "Unlike my diabolical self, these are some good Pokémon.", "Too much praise can spoil both Pokémon and people.", ], - defeat:[ + defeat: [ "You should not get angry at your Pokémon, even if you lose a battle.", "Right? Pretty good Pokémon, huh? I'm suited to raising things.", "No matter how much you love your Pokémon, you still have to discipline them when they misbehave." @@ -946,7 +946,7 @@ export const trainerTypeDialogue = { ], victory: [ "I wanted to win…but I lost!", - "I lost…'cause I couldn't win!" + "I lost…'cause I couldn't win!" ], defeat: [ "Hey, wait a sec. Did I just win? I think I just won! Talk about satisfying!", @@ -957,10 +957,10 @@ export const trainerTypeDialogue = { encounter: [ `I want to be the one to help a certain person. That being the case, I cannot afford to lose. $… Our battle starts now.`, - + ], victory: [ - "I am… not enough, I see.", + "I am… not enough, I see.", ], defeat: [ "Victory belongs to me. Well fought.", @@ -971,7 +971,7 @@ export const trainerTypeDialogue = { "I'll be facing you with my usual party as a member of the Elite Four.", ], victory: [ - "That was a great battle!", + "That was a great battle!", ], defeat: [ "Let's give your Pokémon a nice round of applause for their efforts!", @@ -983,7 +983,7 @@ export const trainerTypeDialogue = { $I don't get why everyone doesn't just sit all the time. Standing up's tiring work!`, ], victory: [ - "Guess I should've expected that!", + "Guess I should've expected that!", ], defeat: [ "Heh heh! Don't mind me, just scooping up a W over here. I get it if you're upset, but don't go full Kieran on me, OK?", @@ -995,7 +995,7 @@ export const trainerTypeDialogue = { $Their strength is a sign o' my strength as a gardener and a Gym Leader! Yeh sure yer up to facing all that?`, ], victory: [ - "Yeh believe in yer Pokémon… And they believe in yeh, too… It was a fine battle, sprout.", + "Yeh believe in yer Pokémon… And they believe in yeh, too… It was a fine battle, sprout.", ], defeat: [ "Hohoho… Indeed. Frail little blades o' grass'll break through even concrete.", @@ -1011,7 +1011,7 @@ export const trainerTypeDialogue = { victory: [ "You and your Pokémon have shown me a whole new depth of field! Fantastic! Just fantastic!", `The world you see through a lens, and the world you see with a Pokémon by your side… - $The same world can look entirely different depending on your view.` + $The same world can look entirely different depending on your view.` ], defeat: [ "The photo from the moment of my victory will be a really winner, all right!", @@ -1028,7 +1028,7 @@ export const trainerTypeDialogue = { victory: [ "I must say, I'm warmed up to you! I might even admire you a little.", `Wow! You're great! You've earned my respect! - $I think your focus and will bowled us over totally. ` + $I think your focus and will bowled us over totally. ` ], defeat: [ "I sensed your will to win, but I don't lose!", @@ -2073,7 +2073,77 @@ export const trainerTypeDialogue = { defeat: [ "Things didn't heat up for you.", ] - }, + }, + [TrainerType.MARNIE_ELITE]: { + encounter: [ + "You've made it this far, huh? Let's see if you can handle my Pokémon!", + "I'll give it my best shot, but don't think I'll go easy on you!", + ], + victory: [ + "I can't believe I lost... But you deserved that win. Well done!", + "Looks like I've still got a lot to learn. Great battle, though!", + ], + defeat: [ + "You put up a good fight, but I've got the edge! Better luck next time!", + "Seems like my training's paid off. Thanks for the battle!", + ] + }, + [TrainerType.NESSA_ELITE]: { + encounter: [ + "The tides are turning in my favor. Ready to get swept away?", + "Let's make some waves with this battle! I hope you're prepared!", + ], + victory: [ + "You navigated those waters perfectly... Well done!", + "Looks like my currents were no match for you. Great job!", + ], + defeat: [ + "Water always finds a way. That was a refreshing battle!", + "You fought well, but the ocean's power is unstoppable!", + ] + }, + [TrainerType.BEA_ELITE]: { + encounter: [ + "Prepare yourself! My fighting spirit burns bright!", + "Let's see if you can keep up with my relentless pace!", + ], + victory: [ + "Your strength... It's impressive. You truly deserve this win.", + "I've never felt this intensity before. Amazing job!", + ], + defeat: [ + "Another victory for my intense training regimen! Well done!", + "You've got strength, but I trained harder. Great battle!", + ] + }, + [TrainerType.ALLISTER_ELITE]: { + encounter: [ + "Shadows fall... Are you ready to face your fears?", + "Let's see if you can handle the darkness that I command.", + ], + victory: [ + "You've dispelled the shadows... For now. Well done.", + "Your light pierced through my darkness. Great job.", + ], + defeat: [ + "The shadows have spoken... Your strength isn't enough.", + "Darkness triumphs... Maybe next time you'll see the light.", + ] + }, + [TrainerType.RAIHAN_ELITE]: { + encounter: [ + "Storm's brewing! Let's see if you can weather this fight!", + "Get ready to face the eye of the storm!", + ], + victory: [ + "You've bested the storm... Incredible job!", + "You rode the winds perfectly... Great battle!", + ], + defeat: [ + "Another storm weathered, another victory claimed! Well fought!", + "You got caught in my storm! Better luck next time!", + ] + }, [TrainerType.RIVAL]: [ { encounter: [ @@ -2276,6 +2346,124 @@ export const trainerTypeDialogue = { ] }; + +export const doubleBattleDialogue = { + "blue_red_double": { + encounter: [ + `Blue: Hey Red, let's show them what we're made of! + $Red: ... + $Blue: This is Pallet Town Power!`, + ], + + victory: [ + `Blue: That was a great battle! + $Red: ...`, + ] + }, + "red_blue_double": { + encounter: [ + `Red: ...! + $Blue: He never talks much. + $Blue: But dont let that fool you! He is a champ after all!`, + ], + victory: [ + `Red: ...! + $Blue: Next time we will beat you!`,] + }, + "tate_liza_double": { + encounter: [ + `Tate: Are you suprised? + $Liza: We are two gym leaders at once! + $Tate: We are twins! + $Liza: We dont need to talk to understand each other! + $Tate: Twice the power... + $Liza: Can you handle it?`, + ], + victory: [ + `Tate: What? Our combination was perfect! + $Liza: Looks like we need to train more...`, + ] + }, + "liza_tate_double": { + encounter: [ + `Liza: Hihihi... Are you suprised? + $Tate: Yes, we are really two gym leaders at once! + $Liza: This is my twin brother Tate! + $Tate: And this is my twin sister Liza! + $Liza: Don't you think we are a perfect combination?` + ], + victory: [ + `Liza: Are we... + $Tate: ...not as strong as we thought?`, + ] + }, + "wallace_steven_double": { + encounter: [ + `Steven: Wallace, let's show them the power of the champions! + $Wallace: We will show you the power of Hoenn! + $Steven: Let's go!`, + ], + victory: [ + `Steven: That was a great battle! + $Wallace: We will win next time!`, + ] + }, + "steven_wallace_double": { + encounter: [ + `Steven: Do you have any rare pokémon? + $Wallace: Steven... We are here for a battle, not to show off our pokémon. + $Steven: Oh... I see... Let's go then!`, + ], + victory: [ + `Steven: Now that we are done with the battle, let's show off our pokémon! + $Wallace: Steven...`, + ] + }, + "alder_iris_double": { + encounter: [ + `Alder: We are the strongest trainers in Unova! + $Iris: Fights against strong trainers are the best!`, + ], + victory: [ + `Alder: Wow! You are super strong! + $Iris: We will win next time!`, + ] + }, + "iris_alder_double": { + encounter: [ + `Iris: Welcome Challenger! I am THE Unova Champion! + $Alder: Iris, aren't you a bit too excited?`, + ], + victory: [ + `Iris: A loss like this is not easy to take... + $Alder: But we will only get stronger with every loss!`, + ] + }, + "marnie_piers_double": { + encounter: [ + `Marnie: Brother, let's show them the power of Spikemuth! + $Piers: We bring darkness!`, + ], + victory: [ + `Marnie: You brought light to our darkness! + $Piers: Its too bright...`, + ] + }, + "piers_marnie_double": { + encounter: [ + `Piers: Ready for a concert? + $Marnie: Brother... They are here to fight, not to sing...`, + ], + victory: [ + `Piers: Now that was a great concert! + $Marnie: Brother...`, + ] + }, + + + +}; + export const battleSpecDialogue = { [BattleSpec.FINAL_BOSS]: { encounter: `It appears the time has finally come once again.\nYou know why you have come here, do you not? @@ -2323,7 +2511,7 @@ export function initTrainerTypeDialogue(): void { const trainerTypes = Object.keys(trainerTypeDialogue).map(t => parseInt(t) as TrainerType); for (const trainerType of trainerTypes) { const messages = trainerTypeDialogue[trainerType]; - const messageTypes = [ "encounter", "victory", "defeat" ]; + const messageTypes = ["encounter", "victory", "defeat"]; for (const messageType of messageTypes) { if (Array.isArray(messages)) { if (messages[0][messageType]) { diff --git a/src/data/egg-moves.ts b/src/data/egg-moves.ts index a88dd32a0b7..bed989849d9 100644 --- a/src/data/egg-moves.ts +++ b/src/data/egg-moves.ts @@ -581,7 +581,7 @@ function parseEggMoves(content: string): void { const speciesNames = Utils.getEnumKeys(Species); const speciesValues = Utils.getEnumValues(Species); const lines = content.split(/\n/g); - + lines.forEach((line, l) => { const cols = line.split(",").slice(0, 5); const moveNames = allMoves.map(m => m.name.replace(/ \([A-Z]\)$/, "").toLowerCase()); @@ -608,9 +608,11 @@ function parseEggMoves(content: string): void { console.log(output); } -const eggMovesStr = ""; -if (eggMovesStr) { - setTimeout(() => { - parseEggMoves(eggMovesStr); - }, 1000); +export function initEggMoves() { + const eggMovesStr = ""; + if (eggMovesStr) { + setTimeout(() => { + parseEggMoves(eggMovesStr); + }, 1000); + } } diff --git a/src/data/enums/arena-tag-type.ts b/src/data/enums/arena-tag-type.ts index 2ecac8b5677..90f45f481ba 100644 --- a/src/data/enums/arena-tag-type.ts +++ b/src/data/enums/arena-tag-type.ts @@ -16,5 +16,9 @@ export enum ArenaTagType { REFLECT = "REFLECT", LIGHT_SCREEN = "LIGHT_SCREEN", AURORA_VEIL = "AURORA_VEIL", + QUICK_GUARD = "QUICK_GUARD", + WIDE_GUARD = "WIDE_GUARD", + MAT_BLOCK = "MAT_BLOCK", + CRAFTY_SHIELD = "CRAFTY_SHIELD", TAILWIND = "TAILWIND" } diff --git a/src/data/enums/battler-tag-type.ts b/src/data/enums/battler-tag-type.ts index 9411d70a670..6d36cdafab5 100644 --- a/src/data/enums/battler-tag-type.ts +++ b/src/data/enums/battler-tag-type.ts @@ -56,5 +56,6 @@ export enum BattlerTagType { CHARGED = "CHARGED", GROUNDED = "GROUNDED", MAGNET_RISEN = "MAGNET_RISEN", - MINIMIZED = "MINIMIZED" + MINIMIZED = "MINIMIZED", + DESTINY_BOND = "DESTINY_BOND" } diff --git a/src/data/enums/trainer-type.ts b/src/data/enums/trainer-type.ts index c263baae3b7..bada7662209 100644 --- a/src/data/enums/trainer-type.ts +++ b/src/data/enums/trainer-type.ts @@ -1,7 +1,7 @@ export enum TrainerType { UNKNOWN, - + ACE_TRAINER, ARTIST, BACKERS, @@ -153,6 +153,11 @@ export enum TrainerType { OLIVIA, ACEROLA, KAHILI, + MARNIE_ELITE, + NESSA_ELITE, + BEA_ELITE, + ALLISTER_ELITE, + RAIHAN_ELITE, RIKA, POPPY, LARRY_ELITE, diff --git a/src/data/move.ts b/src/data/move.ts old mode 100644 new mode 100755 index 342e31a93d0..835423be549 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -6,13 +6,13 @@ import { EncoreTag } from "./battler-tags"; import { BattlerTagType } from "./enums/battler-tag-type"; import { getPokemonMessage } from "../messages"; import Pokemon, { AttackMoveResult, EnemyPokemon, HitResult, MoveResult, PlayerPokemon, PokemonMove, TurnMove } from "../field/pokemon"; -import { StatusEffect, getStatusEffectHealText } from "./status-effect"; +import { StatusEffect, getStatusEffectHealText, isNonVolatileStatusEffect, getNonVolatileStatusEffects} from "./status-effect"; import { Type } from "./type"; import * as Utils from "../utils"; import { WeatherType } from "./weather"; import { ArenaTagSide, ArenaTrapTag } from "./arena-tag"; import { ArenaTagType } from "./enums/arena-tag-type"; -import { UnswappableAbilityAbAttr, UncopiableAbilityAbAttr, UnsuppressableAbilityAbAttr, BlockRecoilDamageAttr, BlockOneHitKOAbAttr, IgnoreContactAbAttr, MaxMultiHitAbAttr, applyAbAttrs, BlockNonDirectDamageAbAttr, applyPreSwitchOutAbAttrs, PreSwitchOutAbAttr, applyPostDefendAbAttrs, PostDefendContactApplyStatusEffectAbAttr, MoveAbilityBypassAbAttr, ReverseDrainAbAttr, FieldPreventExplosiveMovesAbAttr, ForceSwitchOutImmunityAbAttr, BlockItemTheftAbAttr } from "./ability"; +import { UnswappableAbilityAbAttr, UncopiableAbilityAbAttr, UnsuppressableAbilityAbAttr, BlockRecoilDamageAttr, BlockOneHitKOAbAttr, IgnoreContactAbAttr, MaxMultiHitAbAttr, applyAbAttrs, BlockNonDirectDamageAbAttr, applyPreSwitchOutAbAttrs, PreSwitchOutAbAttr, applyPostDefendAbAttrs, PostDefendContactApplyStatusEffectAbAttr, MoveAbilityBypassAbAttr, ReverseDrainAbAttr, FieldPreventExplosiveMovesAbAttr, ForceSwitchOutImmunityAbAttr, BlockItemTheftAbAttr, applyPostAttackAbAttrs, ConfusionOnStatusEffectAbAttr } from "./ability"; import { Abilities } from "./enums/abilities"; import { allAbilities } from "./ability"; import { PokemonHeldItemModifier, BerryModifier, PreserveBerryModifier } from "../modifier/modifier"; @@ -75,7 +75,7 @@ export enum MoveFlags { PULSE_MOVE = 1 << 7, PUNCHING_MOVE = 1 << 8, SLICING_MOVE = 1 << 9, - /** + /** * Indicates a move should be affected by {@linkcode Abilities.RECKLESS} * @see {@linkcode Move.recklessMove()} */ @@ -204,6 +204,19 @@ export default class Move implements Localizable { return false; } + isAllyTarget(): boolean { + switch (this.moveTarget) { + case MoveTarget.USER: + case MoveTarget.NEAR_ALLY: + case MoveTarget.ALLY: + case MoveTarget.USER_OR_NEAR_ALLY: + case MoveTarget.USER_AND_ALLIES: + case MoveTarget.USER_SIDE: + return true; + } + return false; + } + isTypeImmune(type: Type): boolean { switch (type) { case Type.GRASS: @@ -223,7 +236,7 @@ export default class Move implements Localizable { return this; } - + partial(): this { this.nameAppend += " (P)"; return this; @@ -459,8 +472,8 @@ export class SelfStatusMove extends Move { } } -/** - * Base class defining all {@linkcode Move} Attributes +/** + * Base class defining all {@linkcode Move} Attributes * @abstract * @see {@linkcode apply} */ @@ -486,7 +499,7 @@ export abstract class MoveAttr { return true; } - /** + /** * @virtual * @returns the {@linkcode MoveCondition} or {@linkcode MoveConditionFunc} for this {@linkcode Move} */ @@ -506,7 +519,7 @@ export abstract class MoveAttr { return null; } - /** + /** * Used by the Enemy AI to rank an attack based on a given user * @see {@linkcode EnemyPokemon.getNextMove} * @virtual @@ -515,7 +528,7 @@ export abstract class MoveAttr { return 0; } - /** + /** * Used by the Enemy AI to rank an attack based on a given target * @see {@linkcode EnemyPokemon.getNextMove} * @virtual @@ -567,7 +580,7 @@ export class MoveEffectAttr extends MoveAttr { /** Applies move effects so long as they are able based on {@linkcode canApply} */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise { - return this.canApply(user, target, move, args); + return this.canApply(user, target, move, args); } } @@ -686,16 +699,16 @@ export class MatchHpAttr extends FixedDamageAttr { super(0); } - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { (args[0] as Utils.IntegerHolder).value = target.hp - user.hp; return true; - } - + } + getCondition(): MoveConditionFunc { return (user, target, move) => user.hp <= target.hp; } - + // TODO /*getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { return 0; @@ -768,7 +781,7 @@ export class SurviveDamageAttr extends ModifiedDamageAttr { getCondition(): MoveConditionFunc { return (user, target, move) => target.hp > 1; } - + getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { return target.hp > 1 ? 0 : -20; } @@ -811,7 +824,7 @@ export class RecoilAttr extends MoveEffectAttr { if (cancelled.value) { return false; } - + user.damageAndUpdate(recoilDamage, HitResult.OTHER, false, true, true); user.scene.queueMessage(getPokemonMessage(user, " is hit\nwith recoil!")); user.turnData.damageTaken += recoilDamage; @@ -923,10 +936,10 @@ export class HalfSacrificialAttr extends MoveEffectAttr { const cancelled = new Utils.BooleanHolder(false); // Check to see if the Pokemon has an ability that blocks non-direct damage applyAbAttrs(BlockNonDirectDamageAbAttr, user, cancelled); - if (!cancelled.value){ + if (!cancelled.value) { user.damageAndUpdate(Math.ceil(user.getMaxHp()/2), HitResult.OTHER, false, true, true); user.scene.queueMessage(getPokemonMessage(user, " cut its own HP to power up its move!")); // Queue recoil message - } + } return true; } @@ -970,7 +983,7 @@ export class HealAttr extends MoveEffectAttr { return true; } - /** + /** * Creates a new {@linkcode PokemonHealPhase}. * This heals the target and shows the appropriate message. */ @@ -1054,7 +1067,7 @@ export class IgnoreWeatherTypeDebuffAttr extends MoveAttr { /** The {@linkcode WeatherType} this move ignores */ public weather: WeatherType; - constructor(weather: WeatherType){ + constructor(weather: WeatherType) { super(); this.weather = weather; } @@ -1124,7 +1137,7 @@ export class SandHealAttr extends WeatherHealAttr { } /** - * Heals the target or the user by either {@linkcode normalHealRatio} or {@linkcode boostedHealRatio} + * Heals the target or the user by either {@linkcode normalHealRatio} or {@linkcode boostedHealRatio} * depending on the evaluation of {@linkcode condition} * @extends HealAttr * @see {@linkcode apply} @@ -1232,7 +1245,7 @@ export class IncrementMovePriorityAttr extends MoveAttr { if (!this.moveIncrementFunc(user, target, move)) { return false; } - + (args[0] as Utils.IntegerHolder).value += this.increaseAmount; return true; } @@ -1307,8 +1320,9 @@ export class MultiHitAttr extends MoveAttr { } break; case MultiHitType.BEAT_UP: + const party = user.isPlayer() ? user.scene.getParty() : user.scene.getEnemyParty(); // No status means the ally pokemon can contribute to Beat Up - hitTimes = user.scene.getParty().reduce((total, pokemon) => { + hitTimes = party.reduce((total, pokemon) => { return total + (pokemon.id === user.id ? 1 : pokemon?.status && pokemon.status.effect !== StatusEffect.NONE ? 0 : 1); }, 0); } @@ -1362,8 +1376,10 @@ export class StatusEffectAttr extends MoveEffectAttr { return false; } } - if (!pokemon.status || (pokemon.status.effect === this.effect && move.chance < 0)) { - return pokemon.trySetStatus(this.effect, true, user, this.cureTurn); + if ((!pokemon.status || (pokemon.status.effect === this.effect && move.chance < 0)) + && pokemon.trySetStatus(this.effect, true, user, this.cureTurn)) { + applyPostAttackAbAttrs(ConfusionOnStatusEffectAbAttr, user, target, new PokemonMove(move.id), null,this.effect); + return true; } } return false; @@ -1413,7 +1429,7 @@ export class PsychoShiftEffectAttr extends MoveEffectAttr { } return statusAfflictResult; } - + return false; } @@ -1542,9 +1558,9 @@ export class EatBerryAttr extends MoveEffectAttr { return false; } - if(this.chosenBerry === undefined) { // if no berry has been provided, pick a random berry from their inventory + if (this.chosenBerry === undefined) { // if no berry has been provided, pick a random berry from their inventory const heldBerries = this.getTargetHeldBerries(target); - if(heldBerries.length <= 0) { + if (heldBerries.length <= 0) { return false; } this.chosenBerry = heldBerries[user.randSeedInt(heldBerries.length)]; @@ -1555,14 +1571,14 @@ export class EatBerryAttr extends MoveEffectAttr { const preserve = new Utils.BooleanHolder(false); target.scene.applyModifiers(PreserveBerryModifier, target.isPlayer(), target, preserve); - if (!preserve.value){ // remove the eaten berry if not preserved + if (!preserve.value) { // remove the eaten berry if not preserved if (!--this.chosenBerry.stackCount) { target.scene.removeModifier(this.chosenBerry, !target.isPlayer()); } target.scene.updateModifiers(target.isPlayer()); } this.chosenBerry = undefined; - + return true; } @@ -1592,10 +1608,10 @@ export class StealEatBerryAttr extends EatBerryAttr { const cancelled = new Utils.BooleanHolder(false); applyAbAttrs(BlockItemTheftAbAttr, target, cancelled); // check for abilities that block item theft - if(cancelled.value === true) { + if (cancelled.value === true) { return false; } - + const heldBerries = this.getTargetHeldBerries(target).filter(i => i.getTransferrable(false)); if (heldBerries.length) { // if the target has berries, pick a random berry and steal it @@ -1633,7 +1649,7 @@ export class HealStatusEffectAttr extends MoveEffectAttr { pokemon.scene.queueMessage(getPokemonMessage(pokemon, getStatusEffectHealText(pokemon.status.effect))); pokemon.resetStatus(); pokemon.updateInfo(); - + return true; } @@ -1677,13 +1693,13 @@ export class BypassBurnDamageReductionAttr extends MoveAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { (args[0] as Utils.BooleanHolder).value = true; - return true; + return true; } } export class WeatherChangeAttr extends MoveEffectAttr { private weatherType: WeatherType; - + constructor(weatherType: WeatherType) { super(); @@ -1701,7 +1717,7 @@ export class WeatherChangeAttr extends MoveEffectAttr { export class ClearWeatherAttr extends MoveEffectAttr { private weatherType: WeatherType; - + constructor(weatherType: WeatherType) { super(); @@ -1719,7 +1735,7 @@ export class ClearWeatherAttr extends MoveEffectAttr { export class TerrainChangeAttr extends MoveEffectAttr { private terrainType: TerrainType; - + constructor(terrainType: TerrainType) { super(); @@ -1757,7 +1773,7 @@ export class OneHitKOAttr extends MoveAttr { } (args[0] as Utils.BooleanHolder).value = true; - + return true; } @@ -2012,7 +2028,7 @@ export class PostVictoryStatChangeAttr extends MoveAttr { this.showMessage = showMessage; } applyPostVictory(user: Pokemon, target: Pokemon, move: Move): void { - if(this.condition && !this.condition(user, target, move)) { + if (this.condition && !this.condition(user, target, move)) { return false; } const statChangeAttr = new StatChangeAttr(this.stats, this.levels, this.showMessage); @@ -2202,7 +2218,7 @@ export class HpSplitAttr extends MoveEffectAttr { } const infoUpdates = []; - + const hpValue = Math.floor((target.hp + user.hp) / 2); if (user.hp < hpValue) { const healing = user.heal(hpValue - user.hp); @@ -2254,13 +2270,13 @@ export class LessPPMorePowerAttr extends VariablePowerAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const ppMax = move.pp; const ppUsed = user.moveset.find((m) => m.moveId === move.id).ppUsed; - + let ppRemains = ppMax - ppUsed; /** Reduce to 0 to avoid negative numbers if user has 1PP before attack and target has Ability.PRESSURE */ - if(ppRemains < 0) { + if (ppRemains < 0) { ppRemains = 0; } - + const power = args[0] as Utils.NumberHolder; switch (ppRemains) { @@ -2308,7 +2324,7 @@ export class MovePowerMultiplierAttr extends VariablePowerAttr { * @returns The base power of the Beat Up hit. */ const beatUpFunc = (user: Pokemon, allyIndex: number): number => { - const party = user.scene.getParty(); + const party = user.isPlayer() ? user.scene.getParty() : user.scene.getEnemyParty(); for (let i = allyIndex; i < party.length; i++) { const pokemon = party[i]; @@ -2525,7 +2541,7 @@ export class CompareWeightPowerAttr extends VariablePowerAttr { if (!userWeight || userWeight === 0) { return false; } - + const relativeWeight = (targetWeight / userWeight) * 100; switch (true) { @@ -2617,7 +2633,7 @@ export class MagnitudePowerAttr extends VariablePowerAttr { const magnitudePowers = [ 10, 30, 50, 70, 90, 100, 110, 150 ]; let rand: integer; - + user.scene.executeWithSeedOffset(() => rand = Utils.randSeedInt(100), user.scene.currentBattle.turn << 6, user.scene.waveSeed); let m = 0; @@ -2713,11 +2729,11 @@ export class PresentPowerAttr extends VariablePowerAttr { export class KnockOffPowerAttr extends VariablePowerAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if(target.getHeldItems().length > 0){ + if (target.getHeldItems().length > 0) { (args[0] as Utils.NumberHolder).value *= 1.5; - return true; + return true; } - + return false; } } @@ -2744,7 +2760,7 @@ export class VariableAtkAttr extends MoveAttr { } export class TargetAtkUserAtkAttr extends VariableAtkAttr { - constructor(){ + constructor() { super(); } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { @@ -2821,17 +2837,17 @@ export class ThunderAccuracyAttr extends VariableAccuracyAttr { * @extends VariableAccuracyAttr * @see {@linkcode apply} */ -export class MinimizeAccuracyAttr extends VariableAccuracyAttr { +export class MinimizeAccuracyAttr extends VariableAccuracyAttr { /** * @see {@linkcode apply} * @param user N/A * @param target {@linkcode Pokemon} target of the move * @param move N/A * @param args [0] Accuracy of the move to be modified - * @returns true if the function succeeds + * @returns true if the function succeeds */ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (target.getTag(BattlerTagType.MINIMIZED)){ + if (target.getTag(BattlerTagType.MINIMIZED)) { const accuracy = args[0] as Utils.NumberHolder; accuracy.value = -1; @@ -3155,7 +3171,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; } @@ -3192,7 +3208,7 @@ export class HiddenPowerTypeAttr extends VariableMoveTypeAttr { +(user.ivs[Stat.SPD] & 1) * 8 +(user.ivs[Stat.SPATK] & 1) * 16 +(user.ivs[Stat.SPDEF] & 1) * 32) * 15/63); - + type.value = [ Type.FIGHTING, Type.FLYING, Type.POISON, Type.GROUND, Type.ROCK, Type.BUG, Type.GHOST, Type.STEEL, @@ -3209,10 +3225,10 @@ export class MatchUserTypeAttr extends VariableMoveTypeAttr { const userTypes = user.getTypes(true); - if(userTypes.includes(Type.STELLAR)) { // will not change to stellar type + if (userTypes.includes(Type.STELLAR)) { // will not change to stellar type const nonTeraTypes = user.getTypes(); type.value = nonTeraTypes[0]; - return true; + return true; } else if (userTypes.length > 0) { type.value = userTypes[0]; return true; @@ -3297,11 +3313,11 @@ export class OneHitKOAccuracyAttr extends VariableAccuracyAttr { export class SheerColdAccuracyAttr extends OneHitKOAccuracyAttr { /** - * Changes the normal One Hit KO Accuracy Attr to implement the Gen VII changes, + * Changes the normal One Hit KO Accuracy Attr to implement the Gen VII changes, * where if the user is Ice-Type, it has more accuracy. * @param {Pokemon} user Pokemon that is using the move; checks the Pokemon's level. * @param {Pokemon} target Pokemon that is receiving the move; checks the Pokemon's level. - * @param {Move} move N/A + * @param {Move} move N/A * @param {any[]} args Uses the accuracy argument, allowing to change it from either 0 if it doesn't pass * the first if/else, or 30/20 depending on the type of the user Pokemon. * @returns Returns true if move is successful, false if misses. @@ -3310,7 +3326,7 @@ export class SheerColdAccuracyAttr extends OneHitKOAccuracyAttr { const accuracy = args[0] as Utils.NumberHolder; if (user.level < target.level) { accuracy.value = 0; - } else { + } else { const baseAccuracy = user.isOfType(Type.ICE) ? 30 : 20; accuracy.value = Math.min(Math.max(baseAccuracy + 100 * (1 - target.level / user.level), 0), 100); } @@ -3354,11 +3370,11 @@ const crashDamageFunc = (user: Pokemon, move: Move) => { if (cancelled.value) { return false; } - + user.damageAndUpdate(Math.floor(user.getMaxHp() / 2), HitResult.OTHER, false, true); user.scene.queueMessage(getPokemonMessage(user, " kept going\nand crashed!")); user.turnData.damageTaken += Math.floor(user.getMaxHp() / 2); - + return true; }; @@ -3366,7 +3382,7 @@ export class TypelessAttr extends MoveAttr { } /** * Attribute used for moves which ignore redirection effects, and always target their original target, i.e. Snipe Shot * Bypasses Storm Drain, Follow Me, Ally Switch, and the like. -*/ +*/ export class BypassRedirectAttr extends MoveAttr { } export class DisableMoveAttr extends MoveEffectAttr { @@ -3386,24 +3402,24 @@ export class DisableMoveAttr extends MoveEffectAttr { if (turnMove.virtual) { continue; } - + const moveIndex = target.getMoveset().findIndex(m => m.moveId === turnMove.move); if (moveIndex === -1) { return false; } - + const disabledMove = target.getMoveset()[moveIndex]; target.summonData.disabledMove = disabledMove.moveId; target.summonData.disabledTurns = 4; user.scene.queueMessage(getPokemonMessage(target, `'s ${disabledMove.getName()}\nwas disabled!`)); - + return true; } - + return false; } - + getCondition(): MoveConditionFunc { return (user, target, move) => { if (target.summonData.disabledMove || target.isMax()) { @@ -3417,7 +3433,7 @@ export class DisableMoveAttr extends MoveEffectAttr { if (turnMove.virtual) { continue; } - + const move = target.getMoveset().find(m => m.moveId === turnMove.move); if (!move) { continue; @@ -3562,7 +3578,7 @@ export class AddBattlerTagAttr extends MoveEffectAttr { } export class CurseAttr extends MoveEffectAttr { - + apply(user: Pokemon, target: Pokemon, move:Move, args: any[]): boolean { if (user.getTypes(true).includes(Type.GHOST)) { if (target.getTag(BattlerTagType.CURSED)) { @@ -3599,7 +3615,7 @@ export class LapseBattlerTagAttr extends MoveEffectAttr { for (const tagType of this.tagTypes) { (this.selfTarget ? user : target).lapseTag(tagType); } - + return true; } } @@ -3621,7 +3637,7 @@ export class RemoveBattlerTagAttr extends MoveEffectAttr { for (const tagType of this.tagTypes) { (this.selfTarget ? user : target).removeTag(tagType); } - + return true; } } @@ -3663,7 +3679,7 @@ export class ProtectAttr extends AddBattlerTagAttr { while (moveHistory.length) { turnMove = moveHistory.shift(); - if(!allMoves[turnMove.move].getAttrs(ProtectAttr).length || turnMove.result !== MoveResult.SUCCESS) { + if (!allMoves[turnMove.move].getAttrs(ProtectAttr).length || turnMove.result !== MoveResult.SUCCESS) { break; } timesUsed++; @@ -3730,8 +3746,8 @@ export class FaintCountdownAttr extends AddBattlerTagAttr { } } -/** - * Attribute used when a move hits a {@linkcode BattlerTagType} for double damage +/** + * Attribute used when a move hits a {@linkcode BattlerTagType} for double damage * @extends MoveAttr */ export class HitsTagAttr extends MoveAttr { @@ -3787,6 +3803,37 @@ export class AddArenaTagAttr extends MoveEffectAttr { } } +/** + * Generic class for removing arena tags + * @param tagTypes: The types of tags that can be removed + * @param selfSideTarget: Is the user removing tags from its own side? + */ +export class RemoveArenaTagsAttr extends MoveEffectAttr { + public tagTypes: ArenaTagType[]; + public selfSideTarget: boolean; + + constructor(tagTypes: ArenaTagType[], selfSideTarget: boolean) { + super(true, MoveEffectTrigger.POST_APPLY); + + this.tagTypes = tagTypes; + this.selfSideTarget = selfSideTarget; + } + + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + if (!super.apply(user, target, move, args)) { + return false; + } + + const side = (this.selfSideTarget ? user : target).isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; + + for (const tagType of this.tagTypes) { + user.scene.arena.removeTagOnSide(tagType, side); + } + + return true; + } +} + export class AddArenaTrapTagAttr extends AddArenaTagAttr { getCondition(): MoveConditionFunc { return (user, target, move) => { @@ -3815,7 +3862,7 @@ export class RemoveArenaTrapAttr extends MoveEffectAttr { return false; } - if(this.targetBothSides){ + if (this.targetBothSides) { user.scene.arena.removeTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.PLAYER); user.scene.arena.removeTagOnSide(ArenaTagType.TOXIC_SPIKES, ArenaTagSide.PLAYER); user.scene.arena.removeTagOnSide(ArenaTagType.STEALTH_ROCK, ArenaTagSide.PLAYER); @@ -3851,7 +3898,7 @@ export class RemoveScreensAttr extends MoveEffectAttr { return false; } - if(this.targetBothSides){ + if (this.targetBothSides) { user.scene.arena.removeTagOnSide(ArenaTagType.REFLECT, ArenaTagSide.PLAYER); user.scene.arena.removeTagOnSide(ArenaTagType.LIGHT_SCREEN, ArenaTagSide.PLAYER); user.scene.arena.removeTagOnSide(ArenaTagType.AURORA_VEIL, ArenaTagSide.PLAYER); @@ -3859,7 +3906,7 @@ export class RemoveScreensAttr extends MoveEffectAttr { user.scene.arena.removeTagOnSide(ArenaTagType.REFLECT, ArenaTagSide.ENEMY); user.scene.arena.removeTagOnSide(ArenaTagType.LIGHT_SCREEN, ArenaTagSide.ENEMY); user.scene.arena.removeTagOnSide(ArenaTagType.AURORA_VEIL, ArenaTagSide.ENEMY); - } else{ + } else { user.scene.arena.removeTagOnSide(ArenaTagType.REFLECT, target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY); user.scene.arena.removeTagOnSide(ArenaTagType.LIGHT_SCREEN, target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY); user.scene.arena.removeTagOnSide(ArenaTagType.AURORA_VEIL, target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY); @@ -3880,7 +3927,7 @@ export class RevivalBlessingAttr extends MoveEffectAttr { } /** - * + * * @param user {@linkcode Pokemon} using this move * @param target {@linkcode Pokemon} target of this move * @param move {@linkcode Move} being used @@ -3890,13 +3937,13 @@ export class RevivalBlessingAttr extends MoveEffectAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { return new Promise(resolve => { // If user is player, checks if the user has fainted pokemon - if(user instanceof PlayerPokemon + if (user instanceof PlayerPokemon && user.scene.getParty().findIndex(p => p.isFainted())>-1) { (user as PlayerPokemon).revivalBlessing().then(() => { resolve(true); }); - // If user is enemy, checks that it is a trainer, and it has fainted non-boss pokemon in party - } else if(user instanceof EnemyPokemon + // If user is enemy, checks that it is a trainer, and it has fainted non-boss pokemon in party + } else if (user instanceof EnemyPokemon && user.hasTrainer() && user.scene.getEnemyParty().findIndex(p => p.isFainted() && !p.isBoss()) > -1) { // Selects a random fainted pokemon @@ -3907,11 +3954,11 @@ export class RevivalBlessingAttr extends MoveEffectAttr { 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); - if(user.scene.currentBattle.double && user.scene.getEnemyParty().length > 1) { + if (user.scene.currentBattle.double && user.scene.getEnemyParty().length > 1) { const allyPokemon = user.getAlly(); - if(slotIndex<=1) { + if (slotIndex<=1) { user.scene.unshiftPhase(new SwitchSummonPhase(user.scene, pokemon.getFieldIndex(), slotIndex, false, false, false)); - } else if(allyPokemon.isFainted()){ + } else if (allyPokemon.isFainted()) { user.scene.unshiftPhase(new SwitchSummonPhase(user.scene, allyPokemon.getFieldIndex(), slotIndex, false, false,false)); } } @@ -3924,7 +3971,7 @@ export class RevivalBlessingAttr extends MoveEffectAttr { } getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { - if(user.hasTrainer() && user.scene.getEnemyParty().findIndex(p => p.isFainted() && !p.isBoss()) > -1) { + if (user.hasTrainer() && user.scene.getEnemyParty().findIndex(p => p.isFainted() && !p.isBoss()) > -1) { return 20; } @@ -3935,16 +3982,16 @@ export class RevivalBlessingAttr extends MoveEffectAttr { export class ForceSwitchOutAttr extends MoveEffectAttr { private user: boolean; private batonPass: boolean; - + constructor(user?: boolean, batonPass?: boolean) { super(false, MoveEffectTrigger.POST_APPLY, true); this.user = !!user; this.batonPass = !!batonPass; } - + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { return new Promise(resolve => { - + // Check if the move category is not STATUS or if the switch out condition is not met if (!this.getSwitchOutCondition()(user, target, move)) { //Apply effects before switch out i.e. poison point, flame body, etc @@ -3955,7 +4002,7 @@ export class ForceSwitchOutAttr extends MoveEffectAttr { // Move the switch out logic inside the conditional block // 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 instanceof PlayerPokemon) { if (switchOutTarget.hp) { applyPreSwitchOutAbAttrs(PreSwitchOutAbAttr, switchOutTarget); (switchOutTarget as PlayerPokemon).switchOut(this.batonPass, true).then(() => resolve(true)); @@ -3971,30 +4018,30 @@ export class ForceSwitchOutAttr extends MoveEffectAttr { switchOutTarget.setVisible(false); 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)); } - } else { + } else { // Switch out logic for everything else switchOutTarget.setVisible(false); - + if (switchOutTarget.hp) { switchOutTarget.hideInfo().then(() => switchOutTarget.destroy()); switchOutTarget.scene.field.remove(switchOutTarget); user.scene.queueMessage(getPokemonMessage(switchOutTarget, " fled!"), null, true, 500); } - + if (!switchOutTarget.getAlly()?.isActive(true)) { user.scene.clearEnemyHeldItemModifiers(); - + if (switchOutTarget.hp) { user.scene.pushPhase(new BattleEndPhase(user.scene)); user.scene.pushPhase(new NewBattlePhase(user.scene)); } } } - + resolve(true); }); } @@ -4013,7 +4060,7 @@ export class ForceSwitchOutAttr extends MoveEffectAttr { return (user, target, move) => { const switchOutTarget = (this.user ? user : target); const player = switchOutTarget instanceof PlayerPokemon; - + if (!this.user && move.category === MoveCategory.STATUS && (target.hasAbilityWithAttr(ForceSwitchOutImmunityAbAttr) || target.isMax())) { return false; } @@ -4063,7 +4110,7 @@ export class RemoveTypeAttr extends MoveEffectAttr { return false; } - if(user.isTerastallized && user.getTeraType() === this.removedType) { // active tera types cannot be removed + if (user.isTerastallized && user.getTeraType() === this.removedType) { // active tera types cannot be removed return false; } @@ -4184,7 +4231,7 @@ 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!`)); @@ -4227,8 +4274,8 @@ export class RandomMovesetMoveAttr extends OverrideMoveEffectAttr { selectTargets = [ moveTargets.targets[user.randSeedInt(moveTargets.targets.length)] ]; break; } - } - const targets = selectTargets; + } + const targets = selectTargets; user.getMoveQueue().push({ move: move.moveId, targets: targets, ignorePP: true }); user.scene.unshiftPhase(new MovePhase(user.scene, user, targets, moveset[moveIndex], true)); return true; @@ -4243,7 +4290,7 @@ export class RandomMoveAttr extends OverrideMoveEffectAttr { return new Promise(resolve => { const moveIds = Utils.getEnumValues(Moves).filter(m => !allMoves[m].hasFlag(MoveFlags.IGNORE_VIRTUAL) && !allMoves[m].name.endsWith(" (N)")); const moveId = moveIds[user.randSeedInt(moveIds.length)]; - + const moveTargets = getMoveTargets(user, moveId); if (!moveTargets.targets.length) { resolve(false); @@ -4396,7 +4443,7 @@ export class NaturePowerAttr extends OverrideMoveEffectAttr { moveId = Moves.TRI_ATTACK; break; } - + user.getMoveQueue().push({ move: moveId, targets: [target.getBattlerIndex()], ignorePP: true }); user.scene.unshiftPhase(new MovePhase(user.scene, user, [target.getBattlerIndex()], new PokemonMove(moveId, 0, 0, true), true)); initMoveAnim(user.scene, moveId).then(() => { @@ -4576,18 +4623,18 @@ export class SketchAttr extends MoveEffectAttr { if (!targetMoveCopiableCondition(user, target, move)) { return false; } - + const targetMoves = target.getMoveHistory().filter(m => !m.virtual); if (!targetMoves.length) { return false; } - + const sketchableMove = targetMoves[0]; - + if (user.getMoveset().find(m => m.moveId === sketchableMove.move)) { return false; } - + return true; }; } @@ -4636,7 +4683,7 @@ export class AbilityCopyAttr extends MoveEffectAttr { user.summonData.ability = target.getAbility().id; user.scene.queueMessage(getPokemonMessage(user, " copied the ") + getPokemonMessage(target, `'s\n${allAbilities[target.getAbility().id].name}!`)); - + if (this.copyToPartner && user.scene.currentBattle?.double && user.getAlly().hp) { user.getAlly().summonData.ability = target.getAbility().id; user.getAlly().scene.queueMessage(getPokemonMessage(user.getAlly(), " copied the ") + getPokemonMessage(target, `'s\n${allAbilities[target.getAbility().id].name}!`)); @@ -4773,6 +4820,31 @@ export class MoneyAttr extends MoveEffectAttr { } } +/** + * Applies {@linkcode BattlerTagType.DESTINY_BOND} to the user. + * + * @extends MoveEffectAttr + */ +export class DestinyBondAttr extends MoveEffectAttr { + constructor() { + super(true, MoveEffectTrigger.PRE_APPLY); + } + + /** + * Applies {@linkcode BattlerTagType.DESTINY_BOND} to the user. + * @param user {@linkcode Pokemon} that is having the tag applied to. + * @param target {@linkcode Pokemon} N/A + * @param move {@linkcode Move} {@linkcode Move.DESTINY_BOND} + * @param {any[]} args N/A + * @returns true + */ + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + user.scene.queueMessage(`${getPokemonMessage(user, " is trying\nto take its foe down with it!")}`); + user.addTag(BattlerTagType.DESTINY_BOND, undefined, move.id, user.id); + return true; + } +} + export class LastResortAttr extends MoveAttr { getCondition(): MoveConditionFunc { return (user: Pokemon, target: Pokemon, move: Move) => { @@ -4873,7 +4945,7 @@ export class FirstMoveCondition extends MoveCondition { export class hitsSameTypeAttr extends VariableMoveTypeMultiplierAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const multiplier = args[0] as Utils.NumberHolder; - if (!user.getTypes().some(type => target.getTypes().includes(type))){ + if (!user.getTypes().some(type => target.getTypes().includes(type))) { multiplier.value = 0; return true; } @@ -4894,7 +4966,7 @@ export function getMoveTargets(user: Pokemon, move: Moves): MoveTargetSet { const moveTarget = allMoves[move].getAttrs(VariableTargetAttr).length ? variableTarget.value : move ? allMoves[move].moveTarget : move === undefined ? MoveTarget.NEAR_ENEMY : []; const opponents = user.getOpponents(); - + let set: Pokemon[] = []; let multiple = false; @@ -5474,8 +5546,7 @@ export function initMoves() { .unimplemented(), new SelfStatusMove(Moves.DESTINY_BOND, Type.GHOST, -1, 5, -1, 0, 2) .ignoresProtect() - .condition(failOnBossCondition) - .unimplemented(), + .attr(DestinyBondAttr), new StatusMove(Moves.PERISH_SONG, Type.NORMAL, -1, 5, -1, 0, 2) .attr(FaintCountdownAttr) .ignoresProtect() @@ -5577,7 +5648,7 @@ export function initMoves() { .partial(), new AttackMove(Moves.RAPID_SPIN, Type.NORMAL, MoveCategory.PHYSICAL, 50, 100, 40, 100, 0, 2) .attr(StatChangeAttr, BattleStat.SPD, 1, true) - .attr(RemoveBattlerTagAttr, [ + .attr(RemoveBattlerTagAttr, [ BattlerTagType.BIND, BattlerTagType.WRAP, BattlerTagType.FIRE_SPIN, @@ -5952,6 +6023,7 @@ export function initMoves() { .unimplemented(), new AttackMove(Moves.FEINT, Type.NORMAL, MoveCategory.PHYSICAL, 30, 100, 10, -1, 2, 4) .attr(RemoveBattlerTagAttr, [ BattlerTagType.PROTECTED ]) + .attr(RemoveArenaTagsAttr, [ ArenaTagType.QUICK_GUARD, ArenaTagType.WIDE_GUARD, ArenaTagType.MAT_BLOCK, ArenaTagType.CRAFTY_SHIELD ], false) .makesContact(false) .ignoresProtect(), new AttackMove(Moves.PLUCK, Type.FLYING, MoveCategory.PHYSICAL, 60, 100, 20, -1, 0, 4) @@ -5972,7 +6044,7 @@ export function initMoves() { new AttackMove(Moves.CLOSE_COMBAT, Type.FIGHTING, MoveCategory.PHYSICAL, 120, 100, 5, 100, 0, 4) .attr(StatChangeAttr, [ BattleStat.DEF, BattleStat.SPDEF ], -1, true), new AttackMove(Moves.PAYBACK, Type.DARK, MoveCategory.PHYSICAL, 50, 100, 10, -1, 0, 4) - .attr(MovePowerMultiplierAttr, (user, target, move) => target.getLastXMoves(1).find(m => m.turn === target.scene.currentBattle.turn) || user.scene.currentBattle.turnCommands[target.getBattlerIndex()].command === Command.BALL ? 2 : 1), + .attr(MovePowerMultiplierAttr, (user, target, move) => target.getLastXMoves(1).find(m => m.turn === target.scene.currentBattle.turn) || user.scene.currentBattle.turnCommands[target.getBattlerIndex()].command === Command.BALL ? 2 : 1), new AttackMove(Moves.ASSURANCE, Type.DARK, MoveCategory.PHYSICAL, 60, 100, 10, -1, 0, 4) .attr(MovePowerMultiplierAttr, (user, target, move) => target.turnData.damageTaken > 0 ? 2 : 1), new StatusMove(Moves.EMBARGO, Type.DARK, 100, 15, -1, 0, 4) @@ -6034,7 +6106,7 @@ export function initMoves() { .attr(AddBattlerTagAttr, BattlerTagType.AQUA_RING, true, true), new SelfStatusMove(Moves.MAGNET_RISE, Type.ELECTRIC, -1, 10, -1, 0, 4) .attr(AddBattlerTagAttr, BattlerTagType.MAGNET_RISEN, true, true) - .condition((user, target, move) => !user.scene.arena.getTag(ArenaTagType.GRAVITY) && + .condition((user, target, move) => !user.scene.arena.getTag(ArenaTagType.GRAVITY) && !user.getTag(BattlerTagType.IGNORE_FLYING) && !user.getTag(BattlerTagType.INGRAIN) && !user.getTag(BattlerTagType.MAGNET_RISEN)) .unimplemented(), @@ -6241,7 +6313,7 @@ export function initMoves() { .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.ACC ], 1, true), new StatusMove(Moves.WIDE_GUARD, Type.ROCK, -1, 10, -1, 3, 5) .target(MoveTarget.USER_SIDE) - .unimplemented(), + .attr(AddArenaTagAttr, ArenaTagType.WIDE_GUARD, 1, true, true), new StatusMove(Moves.GUARD_SPLIT, Type.PSYCHIC, -1, 10, -1, 0, 5) .unimplemented(), new StatusMove(Moves.POWER_SPLIT, Type.PSYCHIC, -1, 10, -1, 0, 5) @@ -6329,7 +6401,7 @@ export function initMoves() { .attr(StatChangeCountPowerAttr), new StatusMove(Moves.QUICK_GUARD, Type.FIGHTING, -1, 15, -1, 3, 5) .target(MoveTarget.USER_SIDE) - .unimplemented(), + .attr(AddArenaTagAttr, ArenaTagType.QUICK_GUARD, 1, true, true), new SelfStatusMove(Moves.ALLY_SWITCH, Type.PSYCHIC, -1, 15, -1, 2, 5) .ignoresProtect() .unimplemented(), @@ -6349,7 +6421,7 @@ export function initMoves() { new AttackMove(Moves.SKY_DROP, Type.FLYING, MoveCategory.PHYSICAL, 60, 100, 10, -1, 0, 5) .attr(ChargeAttr, ChargeAnim.SKY_DROP_CHARGING, "took {TARGET}\ninto the sky!", BattlerTagType.FLYING) // TODO: Add 2nd turn message .condition(failOnGravityCondition) - .ignoresVirtual(), + .ignoresVirtual(), new SelfStatusMove(Moves.SHIFT_GEAR, Type.STEEL, -1, 10, -1, 0, 5) .attr(StatChangeAttr, BattleStat.ATK, 1, true) .attr(StatChangeAttr, BattleStat.SPD, 2, true), @@ -6361,7 +6433,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().reduce((v, m) => v + m.stackCount, 0))), + .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))), 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) @@ -6411,7 +6483,7 @@ export function initMoves() { .attr(HitHealAttr) .triageMove(), new AttackMove(Moves.SACRED_SWORD, Type.FIGHTING, MoveCategory.PHYSICAL, 90, 100, 15, -1, 0, 5) - .attr(IgnoreOpponentStatChangesAttr) + .attr(IgnoreOpponentStatChangesAttr) .slicingMove(), new AttackMove(Moves.RAZOR_SHELL, Type.WATER, MoveCategory.PHYSICAL, 75, 95, 10, 50, 0, 5) .attr(StatChangeAttr, BattleStat.DEF, -1) @@ -6495,7 +6567,9 @@ export function initMoves() { .attr(HitsTagAttr, BattlerTagType.MINIMIZED, true) .condition(failOnGravityCondition), new StatusMove(Moves.MAT_BLOCK, Type.FIGHTING, -1, 10, -1, 0, 6) - .unimplemented(), + .target(MoveTarget.USER_SIDE) + .attr(AddArenaTagAttr, ArenaTagType.MAT_BLOCK, 1, true, true) + .condition(new FirstMoveCondition()), new AttackMove(Moves.BELCH, Type.POISON, MoveCategory.SPECIAL, 120, 90, 10, -1, 0, 6) .condition((user, target, move) => user.battleData.berriesEaten.length > 0), new StatusMove(Moves.ROTOTILLER, Type.GROUND, -1, 10, 100, 0, 6) @@ -6548,7 +6622,7 @@ export function initMoves() { .triageMove(), new StatusMove(Moves.CRAFTY_SHIELD, Type.FAIRY, -1, 10, -1, 3, 6) .target(MoveTarget.USER_SIDE) - .unimplemented(), + .attr(AddArenaTagAttr, ArenaTagType.CRAFTY_SHIELD, 1, true, true), new StatusMove(Moves.FLOWER_SHIELD, Type.FAIRY, -1, 10, 100, 0, 6) .target(MoveTarget.ALL) .unimplemented(), @@ -6856,8 +6930,11 @@ export function initMoves() { .unimplemented(), new AttackMove(Moves.SMART_STRIKE, Type.STEEL, MoveCategory.PHYSICAL, 70, -1, 10, -1, 0, 7), new StatusMove(Moves.PURIFY, Type.POISON, -1, 20, -1, 0, 7) - .triageMove() - .unimplemented(), + .condition( + (user: Pokemon, target: Pokemon, move: Move) => isNonVolatileStatusEffect(user.status?.effect)) + .attr(HealAttr, 0.5) + .attr(HealStatusEffectAttr, true, ...getNonVolatileStatusEffects()) + .triageMove(), new AttackMove(Moves.REVELATION_DANCE, Type.NORMAL, MoveCategory.SPECIAL, 90, 100, 15, -1, 0, 7) .danceMove() .attr(MatchUserTypeAttr), @@ -7032,7 +7109,7 @@ export function initMoves() { .attr(DiscourageFrequentUseAttr) .ignoresVirtual(), new AttackMove(Moves.SNIPE_SHOT, Type.WATER, MoveCategory.SPECIAL, 80, 100, 15, -1, 0, 8) - .attr(HighCritAttr) + .attr(HighCritAttr) .attr(BypassRedirectAttr), new AttackMove(Moves.JAW_LOCK, Type.DARK, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 8) .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, false, 1) @@ -7555,7 +7632,7 @@ export function initMoves() { .attr(StatChangeAttr, BattleStat.SPATK, -1, true, null, true, true) .target(MoveTarget.ALL_NEAR_ENEMIES), new AttackMove(Moves.PSYBLADE, Type.PSYCHIC, MoveCategory.PHYSICAL, 80, 100, 15, -1, 0, 9) - .attr(MovePowerMultiplierAttr, (user, target, move) => user.scene.arena.getTerrainType() === TerrainType.ELECTRIC && user.isGrounded() ? 1.5 : 1) + .attr(MovePowerMultiplierAttr, (user, target, move) => user.scene.arena.getTerrainType() === TerrainType.ELECTRIC && user.isGrounded() ? 1.5 : 1) .slicingMove(), new AttackMove(Moves.HYDRO_STEAM, Type.WATER, MoveCategory.SPECIAL, 80, 100, 15, -1, 0, 9) .attr(IgnoreWeatherTypeDebuffAttr, WeatherType.SUNNY) @@ -7700,4 +7777,4 @@ export function initMoves() { new AttackMove(Moves.MALIGNANT_CHAIN, Type.POISON, MoveCategory.SPECIAL, 100, 100, 5, 50, 0, 9) .attr(StatusEffectAttr, StatusEffect.TOXIC) ); -} +} diff --git a/src/data/nature.ts b/src/data/nature.ts index 4e1a22c36b0..c9709d5ee4c 100644 --- a/src/data/nature.ts +++ b/src/data/nature.ts @@ -35,7 +35,7 @@ export enum 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]); //Translating nature - if(i18next.exists("nature:" + ret)){ + if (i18next.exists("nature:" + ret)) { ret = i18next.t("nature:" + ret as any); } if (includeStatEffects) { diff --git a/src/data/pokemon-evolutions.ts b/src/data/pokemon-evolutions.ts index 3465b5bb152..15193327547 100644 --- a/src/data/pokemon-evolutions.ts +++ b/src/data/pokemon-evolutions.ts @@ -1619,7 +1619,7 @@ interface PokemonPrevolutions { export const pokemonPrevolutions: PokemonPrevolutions = {}; -{ +export function initPokemonPrevolutions(): void { const megaFormKeys = [ SpeciesFormKey.MEGA, "", SpeciesFormKey.MEGA_X, "", SpeciesFormKey.MEGA_Y ].map(sfk => sfk as string); const prevolutionKeys = Object.keys(pokemonEvolutions); prevolutionKeys.forEach(pk => { diff --git a/src/data/pokemon-forms.ts b/src/data/pokemon-forms.ts index d31097ad0e8..6d203fb4664 100644 --- a/src/data/pokemon-forms.ts +++ b/src/data/pokemon-forms.ts @@ -804,7 +804,7 @@ export const pokemonFormChanges: PokemonFormChanges = { ] }; -{ +export function initPokemonForms() { const formChangeKeys = Object.keys(pokemonFormChanges); formChangeKeys.forEach(pk => { const formChanges = pokemonFormChanges[pk]; diff --git a/src/data/pokemon-level-moves.ts b/src/data/pokemon-level-moves.ts index 7b516f74796..1f65758ff90 100644 --- a/src/data/pokemon-level-moves.ts +++ b/src/data/pokemon-level-moves.ts @@ -4381,7 +4381,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.FALSE_SWIPE ], [ 1, Moves.FURY_CUTTER ], [ 1, Moves.X_SCISSOR ], - [ 1, Moves.ENERGY_BALL ], + [ 1, Moves.ENERGY_BALL ], [ 9, Moves.MEGA_DRAIN ], [ 12, Moves.DETECT ], [ 15, Moves.QUICK_GUARD ], @@ -4403,7 +4403,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.FALSE_SWIPE ], [ 1, Moves.FURY_CUTTER ], [ 1, Moves.X_SCISSOR ], - [ 1, Moves.ENERGY_BALL ], + [ 1, Moves.ENERGY_BALL ], [ 1, Moves.SHED_TAIL ], [ 1, Moves.DUAL_CHOP ], [ 5, Moves.MEGA_DRAIN ], @@ -4439,9 +4439,9 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.SCRATCH ], [ 1, Moves.GROWL ], [ 1, Moves.EMBER ], - [ 1, Moves.QUICK_ATTACK ], + [ 1, Moves.QUICK_ATTACK ], [ 1, Moves.FLAMETHROWER ], - [ 1, Moves.FEATHER_DANCE ], + [ 1, Moves.FEATHER_DANCE ], [ 9, Moves.FLAME_CHARGE ], [ 12, Moves.DETECT ], [ 15, Moves.SAND_ATTACK ], @@ -4518,7 +4518,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.WATER_GUN ], [ 1, Moves.SURF ], [ 1, Moves.EARTHQUAKE ], - [ 1, Moves.ROCK_SMASH ], + [ 1, Moves.ROCK_SMASH ], [ 1, Moves.HAMMER_ARM ], [ 9, Moves.ROCK_THROW ], [ 12, Moves.PROTECT ], @@ -4947,7 +4947,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.GROWTH ], [ 1, Moves.TOXIC ], [ 1, Moves.ABSORB ], - [ 1, Moves.TACKLE ], + [ 1, Moves.TACKLE ], [ 1, Moves.STUN_SPORE ], [ 1, Moves.LEECH_SEED ], [ 12, Moves.MEGA_DRAIN ], @@ -5500,7 +5500,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.YAWN ], [ 1, Moves.POISON_GAS ], [ 1, Moves.WRING_OUT ], - [ 1, Moves.SLUDGE ], + [ 1, Moves.SLUDGE ], [ 12, Moves.AMNESIA ], [ 17, Moves.ACID_SPRAY ], [ 20, Moves.ENCORE ], @@ -5963,7 +5963,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.WATER_GUN ], [ 1, Moves.HARDEN ], [ 1, Moves.LEER ], - [ 1, Moves.TAUNT ], + [ 1, Moves.TAUNT ], [ 12, Moves.BUBBLE_BEAM ], [ 16, Moves.KNOCK_OFF ], [ 20, Moves.DOUBLE_HIT ], @@ -6071,7 +6071,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.ARMALDO]: [ [ 1, Moves.FURY_CUTTER ], [ 1, Moves.HARDEN ], - [ 1, Moves.WATER_GUN ], + [ 1, Moves.WATER_GUN ], [ 1, Moves.SMACK_DOWN ], [ 12, Moves.METAL_CLAW ], [ 16, Moves.ANCIENT_POWER ], @@ -6091,7 +6091,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.MILOTIC]: [ [ 0, Moves.WATER_PULSE ], [ 1, Moves.FLAIL ], - [ 1, Moves.SPLASH ], + [ 1, Moves.SPLASH ], [ 1, Moves.TACKLE ], [ 1, Moves.WRAP ], [ 1, Moves.WATER_GUN ], @@ -6113,7 +6113,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.CASTFORM]: [ [ 1, Moves.TACKLE ], [ 10, Moves.WATER_GUN ], - [ 10, Moves.EMBER ], + [ 10, Moves.EMBER ], [ 10, Moves.POWDER_SNOW ], [ 15, Moves.HEADBUTT ], [ 20, Moves.RAIN_DANCE ], @@ -6122,7 +6122,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 25, Moves.WEATHER_BALL ], [ 35, Moves.HYDRO_PUMP ], [ 35, Moves.FIRE_BLAST ], - [ 35, Moves.BLIZZARD ], + [ 35, Moves.BLIZZARD ], [ 45, Moves.HURRICANE ], ], [Species.KECLEON]: [ @@ -6130,7 +6130,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.TAIL_WHIP ], [ 1, Moves.ASTONISH ], [ 1, Moves.LICK ], - [ 1, Moves.SCRATCH ], + [ 1, Moves.SCRATCH ], [ 4, Moves.BIND ], [ 7, Moves.SHADOW_SNEAK ], [ 10, Moves.FEINT ], @@ -6250,7 +6250,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.ABSOL]: [ [ 1, Moves.QUICK_ATTACK ], - [ 1, Moves.LEER ], + [ 1, Moves.LEER ], [ 5, Moves.DOUBLE_TEAM ], [ 10, Moves.KNOCK_OFF ], [ 15, Moves.DETECT ], @@ -6266,16 +6266,16 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.WYNAUT]: [ [ 1, Moves.COUNTER ], [ 1, Moves.MIRROR_COAT ], - [ 1, Moves.SAFEGUARD ], + [ 1, Moves.SAFEGUARD ], [ 1, Moves.DESTINY_BOND ], [ 1, Moves.SPLASH ], [ 1, Moves.CHARM ], [ 1, Moves.ENCORE ], - [ 1, Moves.AMNESIA ], + [ 1, Moves.AMNESIA ], ], [Species.SNORUNT]: [ [ 1, Moves.POWDER_SNOW ], - [ 1, Moves.ASTONISH ], + [ 1, Moves.ASTONISH ], [ 1, Moves.HEADBUTT ], [ 5, Moves.LEER ], [ 10, Moves.DOUBLE_TEAM ], @@ -6298,7 +6298,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.ASTONISH ], [ 1, Moves.LEER ], [ 1, Moves.DOUBLE_TEAM ], - [ 1, Moves.ICE_BALL ], + [ 1, Moves.ICE_BALL ], [ 15, Moves.ICE_SHARD ], [ 20, Moves.PROTECT ], [ 25, Moves.ICY_WIND ], @@ -6312,7 +6312,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.SPHEAL]: [ [ 1, Moves.ROLLOUT ], - [ 1, Moves.DEFENSE_CURL ], + [ 1, Moves.DEFENSE_CURL ], [ 4, Moves.GROWL ], [ 8, Moves.WATER_GUN ], [ 12, Moves.POWDER_SNOW ], @@ -6332,7 +6332,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.ROLLOUT ], [ 1, Moves.DEFENSE_CURL ], [ 1, Moves.GROWL ], - [ 1, Moves.WATER_GUN ], + [ 1, Moves.WATER_GUN ], [ 12, Moves.POWDER_SNOW ], [ 16, Moves.REST ], [ 20, Moves.SNORE ], @@ -6352,7 +6352,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.ROLLOUT ], [ 1, Moves.DEFENSE_CURL ], [ 1, Moves.GROWL ], - [ 1, Moves.WATER_GUN ], + [ 1, Moves.WATER_GUN ], [ 12, Moves.POWDER_SNOW ], [ 16, Moves.REST ], [ 20, Moves.SNORE ], @@ -6376,8 +6376,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.WATER_GUN ], [ 1, Moves.IRON_DEFENSE ], [ 1, Moves.SHELL_SMASH ], - [ 1, Moves.WHIRLPOOL ], - [ 1, Moves.BITE ], + [ 1, Moves.WHIRLPOOL ], + [ 1, Moves.BITE ], [ 5, Moves.SCREECH ], [ 9, Moves.SCARY_FACE ], [ 11, Moves.RAIN_DANCE ], @@ -6397,7 +6397,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.IRON_DEFENSE ], [ 1, Moves.SHELL_SMASH ], [ 1, Moves.WHIRLPOOL ], - [ 1, Moves.CONFUSION ], + [ 1, Moves.CONFUSION ], [ 5, Moves.RAIN_DANCE ], [ 9, Moves.AGILITY ], [ 11, Moves.DRAINING_KISS ], @@ -6447,7 +6447,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.BAGON]: [ [ 1, Moves.EMBER ], - [ 1, Moves.LEER ], + [ 1, Moves.LEER ], [ 5, Moves.BITE ], [ 10, Moves.DRAGON_BREATH ], [ 15, Moves.HEADBUTT ], @@ -6465,7 +6465,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.EMBER ], [ 1, Moves.LEER ], [ 1, Moves.BITE ], - [ 1, Moves.DRAGON_BREATH ], + [ 1, Moves.DRAGON_BREATH ], [ 15, Moves.HEADBUTT ], [ 20, Moves.SCARY_FACE ], [ 25, Moves.CRUNCH ], @@ -6536,7 +6536,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.REGIROCK]: [ [ 1, Moves.CHARGE_BEAM ], - [ 1, Moves.ROCK_THROW ], + [ 1, Moves.ROCK_THROW ], [ 6, Moves.BULLDOZE ], [ 12, Moves.ANCIENT_POWER ], [ 18, Moves.STOMP ], @@ -6553,7 +6553,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.REGICE]: [ [ 1, Moves.CHARGE_BEAM ], - [ 1, Moves.ICY_WIND ], + [ 1, Moves.ICY_WIND ], [ 6, Moves.BULLDOZE ], [ 12, Moves.ANCIENT_POWER ], [ 18, Moves.STOMP ], @@ -6570,10 +6570,10 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.REGISTEEL]: [ [ 1, Moves.CHARGE_BEAM ], - [ 1, Moves.METAL_CLAW ], + [ 1, Moves.METAL_CLAW ], [ 6, Moves.BULLDOZE ], [ 12, Moves.ANCIENT_POWER ], - [ 18, Moves.STOMP ], + [ 18, Moves.STOMP ], [ 24, Moves.IRON_HEAD ], [ 24, Moves.FLASH_CANNON ], [ 30, Moves.CURSE ], @@ -6589,7 +6589,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.LATIAS]: [ [ 1, Moves.STORED_POWER ], - [ 1, Moves.CHARM ], + [ 1, Moves.CHARM ], [ 1, Moves.PSYWAVE ], [ 5, Moves.HELPING_HAND ], [ 10, Moves.RECOVER ], @@ -6631,7 +6631,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.WATER_PULSE ], [ 1, Moves.ANCIENT_POWER ], [ 1, Moves.BODY_SLAM ], - [ 1, Moves.SCARY_FACE ], + [ 1, Moves.SCARY_FACE ], [ 9, Moves.AQUA_TAIL ], [ 18, Moves.CALM_MIND ], [ 27, Moves.MUDDY_WATER ], @@ -6647,7 +6647,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.MUD_SHOT ], [ 1, Moves.ANCIENT_POWER ], [ 1, Moves.LAVA_PLUME ], - [ 1, Moves.SCARY_FACE ], + [ 1, Moves.SCARY_FACE ], [ 9, Moves.EARTH_POWER ], [ 18, Moves.BULK_UP ], [ 27, Moves.EARTHQUAKE ], @@ -6663,7 +6663,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.TWISTER ], [ 1, Moves.ANCIENT_POWER ], [ 1, Moves.AIR_SLASH ], - [ 1, Moves.SCARY_FACE ], + [ 1, Moves.SCARY_FACE ], [ 9, Moves.CRUNCH ], [ 18, Moves.DRAGON_DANCE ], [ 27, Moves.EXTREME_SPEED ], @@ -6695,7 +6695,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.DEOXYS]: [ [ 1, Moves.CONFUSION ], //Custom [ 1, Moves.LEER ], - [ 1, Moves.WRAP ], + [ 1, Moves.WRAP ], [ 7, Moves.NIGHT_SHADE ], [ 13, Moves.TELEPORT ], [ 19, Moves.KNOCK_OFF ], diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index 9ba716a9968..73a7ef64ab3 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -27,6 +27,11 @@ export enum Region { } export function getPokemonSpecies(species: Species): PokemonSpecies { + // If a special pool (named trainers) is used here it CAN happen that they have a array as species (which means choose one of those two). So we catch that with this code block + if (Array.isArray(species)) { + // Pick a random species from the list + species = species[Math.floor(Math.random() * species.length)]; + } if (species >= 2000) { return allSpecies.find(s => s.speciesId === species); } @@ -69,7 +74,7 @@ export function getFusedSpeciesName(speciesAName: string, speciesBName: string): const splitNameA = speciesAName.split(/ /g); const splitNameB = speciesBName.split(/ /g); - + const fragAMatch = fragAPattern.exec(speciesAName); const fragBMatch = fragBPattern.exec(speciesBName); @@ -130,10 +135,11 @@ export abstract class PokemonSpeciesForm { public baseFriendship: integer; public baseExp: integer; public genderDiffs: boolean; + public isStarterSelectable: boolean; constructor(type1: Type, type2: Type, height: number, weight: number, ability1: Abilities, ability2: Abilities, abilityHidden: Abilities, baseTotal: integer, baseHp: integer, baseAtk: integer, baseDef: integer, baseSpatk: integer, baseSpdef: integer, baseSpd: integer, - catchRate: integer, baseFriendship: integer, baseExp: integer, genderDiffs: boolean) { + catchRate: integer, baseFriendship: integer, baseExp: integer, genderDiffs: boolean, isStarterSelectable: boolean) { this.type1 = type1; this.type2 = type2; this.height = height; @@ -147,8 +153,16 @@ export abstract class PokemonSpeciesForm { this.baseFriendship = baseFriendship; this.baseExp = baseExp; this.genderDiffs = genderDiffs; + this.isStarterSelectable = isStarterSelectable; } + /** + * Method to get the root species id of a Pokemon. + * Magmortar.getRootSpeciesId(true) => Magmar + * Magmortar.getRootSpeciesId(false) => Magby + * @param forStarter boolean to get the nonbaby form of a starter + * @returns The species + */ getRootSpeciesId(forStarter: boolean = false): Species { let ret = this.speciesId; while (pokemonPrevolutions.hasOwnProperty(ret) && (!forStarter || !speciesStarters.hasOwnProperty(ret))) { @@ -243,7 +257,7 @@ export abstract class PokemonSpeciesForm { const showGenderDiffs = this.genderDiffs && female && ![ SpeciesFormKey.MEGA, SpeciesFormKey.GIGANTAMAX ].find(k => formSpriteKey === k); const baseSpriteKey = `${showGenderDiffs ? "female__" : ""}${this.speciesId}${formSpriteKey ? `-${formSpriteKey}` : ""}`; - + let config = variantData; `${back ? "back__" : ""}${baseSpriteKey}`.split("__").map(p => config ? config = config[p] : null); const variantSet = config as VariantSet; @@ -274,7 +288,7 @@ export abstract class PokemonSpeciesForm { if (shiny && !isVariant) { ret += "s"; } - + switch (this.speciesId) { case Species.HIPPOPOTAS: case Species.HIPPOWDON: @@ -404,12 +418,14 @@ export abstract class PokemonSpeciesForm { console.warn = () => {}; const frameNames = scene.anims.generateFrameNames(spriteKey, { zeroPad: 4, suffix: ".png", start: 1, end: 400 }); console.warn = originalWarn; - scene.anims.create({ - key: this.getSpriteKey(female, formIndex, shiny, variant), - frames: frameNames, - frameRate: 12, - repeat: -1 - }); + if (!(scene.anims.exists(spriteKey))) { + scene.anims.create({ + key: this.getSpriteKey(female, formIndex, shiny, variant), + frames: frameNames, + frameRate: 12, + repeat: -1 + }); + } let spritePath = this.getSpriteAtlasPath(female, formIndex, shiny, variant).replace("variant/", "").replace(/_[1-3]$/, ""); const useExpSprite = scene.experimentalSprites && scene.hasExpSprite(spriteKey); if (useExpSprite) { @@ -479,7 +495,7 @@ export abstract class PokemonSpeciesForm { for (let i = 0; i < pixelData.length; i += 4) { if (pixelData[i + 3]) { const pixel = pixelData.slice(i, i + 4); - const [ r, g, b, a ] = pixel; + const [ r, g, b, a ] = pixel; if (!spriteColors.find(c => c[0] === r && c[1] === g && c[2] === b)) { spriteColors.push([ r, g, b, a ]); } @@ -494,12 +510,12 @@ export abstract class PokemonSpeciesForm { } pixelColors.push(argbFromRgba({ r: pixelData[i], g: pixelData[i + 1], b: pixelData[i + 2], a: pixelData[i + 3] })); } - + let paletteColors: Map; const originalRandom = Math.random; Math.random = () => Phaser.Math.RND.realInRange(0, 1); - + scene.executeWithSeedOffset(() => { paletteColors = QuantizerCelebi.quantize(pixelColors, 2); }, 0, "This result should not vary"); @@ -541,7 +557,7 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali this.genderDiffs = genderDiffs; this.canChangeForm = !!canChangeForm; this.forms = forms; - + this.localize(); forms.forEach((form, f) => { @@ -632,10 +648,10 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali } let evolutionChance: number; - + const evolutionSpecies = getPokemonSpecies(ev.speciesId); const isRegionalEvolution = !this.isRegional() && evolutionSpecies.isRegional(); - + if (!forTrainer && isRegionalEvolution) { evolutionChance = 0; } else { @@ -645,7 +661,7 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali } else { const maxLevelDiff = this.getStrengthLevelDiff(strength); const minChance: number = 0.875 - 0.125 * strength; - + evolutionChance = Math.min(minChance + easeInFunc(Math.min(level - ev.level, maxLevelDiff) / maxLevelDiff) * (1 - minChance), 1); } } else { @@ -671,7 +687,7 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali totalWeight += evolutionChance; evolutionPool.set(totalWeight, ev.speciesId); - + if ((1 - evolutionChance) < noEvolutionChance) { noEvolutionChance = 1 - evolutionChance; } @@ -681,7 +697,7 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali if (noEvolutionChance === 1 || Phaser.Math.RND.realInRange(0, 1) < noEvolutionChance) { return this.speciesId; } - + const randValue = evolutionPool.size === 1 ? 0 : Utils.randSeedInt(totalWeight); for (const weight of evolutionPool.keys()) { @@ -793,11 +809,14 @@ export class PokemonForm extends PokemonSpeciesForm { public formKey: string; public formSpriteKey: string; + // This is a collection of form keys that have in-run form changes, but should still be separately selectable from the start screen + private starterSelectableKeys: string[] = ["10", "50", "10-pc", "50-pc", "red", "orange", "yellow", "green", "blue", "indigo", "violet"]; + constructor(formName: string, formKey: string, type1: Type, type2: Type, height: number, weight: number, ability1: Abilities, ability2: Abilities, abilityHidden: Abilities, baseTotal: integer, baseHp: integer, baseAtk: integer, baseDef: integer, baseSpatk: integer, baseSpdef: integer, baseSpd: integer, - catchRate: integer, baseFriendship: integer, baseExp: integer, genderDiffs?: boolean, formSpriteKey?: string) { + catchRate: integer, baseFriendship: integer, baseExp: integer, genderDiffs?: boolean, formSpriteKey?: string, isStarterSelectable?: boolean, ) { super(type1, type2, height, weight, ability1, ability2, abilityHidden, baseTotal, baseHp, baseAtk, baseDef, baseSpatk, baseSpdef, baseSpd, - catchRate, baseFriendship, baseExp, !!genderDiffs); + catchRate, baseFriendship, baseExp, !!genderDiffs, (!!isStarterSelectable || !formKey)); this.formName = formName; this.formKey = formKey; this.formSpriteKey = formSpriteKey !== undefined ? formSpriteKey : null; @@ -1067,8 +1086,8 @@ export function initSpecies() { new PokemonSpecies(Species.CHINCHOU, 2, false, false, false, "Angler Pokémon", Type.WATER, Type.ELECTRIC, 0.5, 12, Abilities.VOLT_ABSORB, Abilities.ILLUMINATE, Abilities.WATER_ABSORB, 330, 75, 38, 38, 56, 56, 67, 190, 50, 66, GrowthRate.SLOW, 50, false), new PokemonSpecies(Species.LANTURN, 2, false, false, false, "Light Pokémon", Type.WATER, Type.ELECTRIC, 1.2, 22.5, Abilities.VOLT_ABSORB, Abilities.ILLUMINATE, Abilities.WATER_ABSORB, 460, 125, 58, 58, 76, 76, 67, 75, 50, 161, GrowthRate.SLOW, 50, false), new PokemonSpecies(Species.PICHU, 2, false, false, false, "Tiny Mouse Pokémon", Type.ELECTRIC, null, 0.3, 2, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 205, 20, 40, 15, 35, 35, 60, 190, 70, 41, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Normal", "", Type.ELECTRIC, null, 1.4, 61.5, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 205, 20, 40, 15, 35, 35, 60, 190, 70, 41), - new PokemonForm("Spiky-Eared", "spiky", Type.ELECTRIC, null, 1.4, 61.5, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 205, 20, 40, 15, 35, 35, 60, 190, 70, 41), + new PokemonForm("Normal", "", Type.ELECTRIC, null, 1.4, 61.5, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 205, 20, 40, 15, 35, 35, 60, 190, 70, 41, false, null, true), + new PokemonForm("Spiky-Eared", "spiky", Type.ELECTRIC, null, 1.4, 61.5, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 205, 20, 40, 15, 35, 35, 60, 190, 70, 41, false, null, true), ), new PokemonSpecies(Species.CLEFFA, 2, false, false, false, "Star Shape Pokémon", Type.FAIRY, null, 0.3, 3, Abilities.CUTE_CHARM, Abilities.MAGIC_GUARD, Abilities.FRIEND_GUARD, 218, 50, 25, 28, 45, 55, 15, 150, 140, 44, GrowthRate.FAST, 25, false), new PokemonSpecies(Species.IGGLYBUFF, 2, false, false, false, "Balloon Pokémon", Type.NORMAL, Type.FAIRY, 0.3, 1, Abilities.CUTE_CHARM, Abilities.COMPETITIVE, Abilities.FRIEND_GUARD, 210, 90, 30, 15, 40, 20, 15, 170, 50, 42, GrowthRate.FAST, 25, false), @@ -1102,34 +1121,34 @@ export function initSpecies() { new PokemonSpecies(Species.SLOWKING, 2, false, false, false, "Royal Pokémon", Type.WATER, Type.PSYCHIC, 2, 79.5, Abilities.OBLIVIOUS, Abilities.OWN_TEMPO, Abilities.REGENERATOR, 490, 95, 75, 80, 100, 110, 30, 70, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.MISDREAVUS, 2, false, false, false, "Screech Pokémon", Type.GHOST, null, 0.7, 1, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 435, 60, 60, 60, 85, 85, 85, 45, 35, 87, GrowthRate.FAST, 50, false), new PokemonSpecies(Species.UNOWN, 2, false, false, false, "Symbol Pokémon", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, GrowthRate.MEDIUM_FAST, null, false, false, - new PokemonForm("A", "a", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118), - new PokemonForm("B", "b", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118), - new PokemonForm("C", "c", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118), - new PokemonForm("D", "d", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118), - new PokemonForm("E", "e", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118), - new PokemonForm("F", "f", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118), - new PokemonForm("G", "g", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118), - new PokemonForm("H", "h", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118), - new PokemonForm("I", "i", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118), - new PokemonForm("J", "j", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118), - new PokemonForm("K", "k", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118), - new PokemonForm("L", "l", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118), - new PokemonForm("M", "m", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118), - new PokemonForm("N", "n", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118), - new PokemonForm("O", "o", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118), - new PokemonForm("P", "p", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118), - new PokemonForm("Q", "q", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118), - new PokemonForm("R", "r", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118), - new PokemonForm("S", "s", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118), - new PokemonForm("T", "t", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118), - new PokemonForm("U", "u", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118), - new PokemonForm("V", "v", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118), - new PokemonForm("W", "w", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118), - new PokemonForm("X", "x", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118), - new PokemonForm("Y", "y", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118), - new PokemonForm("Z", "z", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118), - new PokemonForm("!", "exclamation", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118), - new PokemonForm("?", "question", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118), + new PokemonForm("A", "a", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("B", "b", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("C", "c", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("D", "d", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("E", "e", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("F", "f", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("G", "g", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("H", "h", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("I", "i", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("J", "j", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("K", "k", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("L", "l", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("M", "m", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("N", "n", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("O", "o", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("P", "p", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("Q", "q", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("R", "r", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("S", "s", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("T", "t", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("U", "u", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("V", "v", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("W", "w", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("X", "x", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("Y", "y", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("Z", "z", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("!", "exclamation", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("?", "question", Type.PSYCHIC, null, 0.5, 5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), ), new PokemonSpecies(Species.WOBBUFFET, 2, false, false, false, "Patient Pokémon", Type.PSYCHIC, null, 1.3, 28.5, Abilities.SHADOW_TAG, Abilities.NONE, Abilities.TELEPATHY, 405, 190, 33, 58, 33, 58, 33, 45, 50, 142, GrowthRate.MEDIUM_FAST, 50, true), new PokemonSpecies(Species.GIRAFARIG, 2, false, false, false, "Long Neck Pokémon", Type.NORMAL, Type.PSYCHIC, 1.5, 41.5, Abilities.INNER_FOCUS, Abilities.EARLY_BIRD, Abilities.SAP_SIPPER, 455, 70, 80, 65, 90, 65, 85, 60, 70, 159, GrowthRate.MEDIUM_FAST, 50, true), @@ -1433,9 +1452,9 @@ export function initSpecies() { new PokemonSpecies(Species.SHIELDON, 4, false, false, false, "Shield Pokémon", Type.ROCK, Type.STEEL, 0.5, 57, Abilities.STURDY, Abilities.NONE, Abilities.SOUNDPROOF, 350, 30, 42, 118, 42, 88, 30, 45, 70, 70, GrowthRate.ERRATIC, 87.5, false), new PokemonSpecies(Species.BASTIODON, 4, false, false, false, "Shield Pokémon", Type.ROCK, Type.STEEL, 1.3, 149.5, Abilities.STURDY, Abilities.NONE, Abilities.SOUNDPROOF, 495, 60, 52, 168, 47, 138, 30, 45, 70, 173, GrowthRate.ERRATIC, 87.5, false), new PokemonSpecies(Species.BURMY, 4, false, false, false, "Bagworm Pokémon", Type.BUG, null, 0.2, 3.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.OVERCOAT, 224, 40, 29, 45, 29, 45, 36, 120, 70, 45, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Plant Cloak", "plant", Type.BUG, null, 0.2, 3.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.OVERCOAT, 224, 40, 29, 45, 29, 45, 36, 120, 70, 45), - new PokemonForm("Sandy Cloak", "sandy", Type.BUG, null, 0.2, 3.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.OVERCOAT, 224, 40, 29, 45, 29, 45, 36, 120, 70, 45), - new PokemonForm("Trash Cloak", "trash", Type.BUG, null, 0.2, 3.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.OVERCOAT, 224, 40, 29, 45, 29, 45, 36, 120, 70, 45), + new PokemonForm("Plant Cloak", "plant", Type.BUG, null, 0.2, 3.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.OVERCOAT, 224, 40, 29, 45, 29, 45, 36, 120, 70, 45, false, null, true), + new PokemonForm("Sandy Cloak", "sandy", Type.BUG, null, 0.2, 3.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.OVERCOAT, 224, 40, 29, 45, 29, 45, 36, 120, 70, 45, false, null, true), + new PokemonForm("Trash Cloak", "trash", Type.BUG, null, 0.2, 3.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.OVERCOAT, 224, 40, 29, 45, 29, 45, 36, 120, 70, 45, false, null, true), ), new PokemonSpecies(Species.WORMADAM, 4, false, false, false, "Bagworm Pokémon", Type.BUG, Type.GRASS, 0.5, 6.5, Abilities.ANTICIPATION, Abilities.NONE, Abilities.OVERCOAT, 424, 60, 59, 85, 79, 105, 36, 45, 70, 148, GrowthRate.MEDIUM_FAST, 0, false, false, new PokemonForm("Plant Cloak", "plant", Type.BUG, Type.GRASS, 0.5, 6.5, Abilities.ANTICIPATION, Abilities.NONE, Abilities.OVERCOAT, 424, 60, 59, 85, 79, 105, 36, 45, 70, 148), @@ -1454,8 +1473,8 @@ export function initSpecies() { new PokemonForm("Sunshine Form", "sunshine", Type.GRASS, null, 0.5, 9.3, Abilities.FLOWER_GIFT, Abilities.NONE, Abilities.NONE, 450, 70, 60, 70, 87, 78, 85, 75, 50, 158), ), new PokemonSpecies(Species.SHELLOS, 4, false, false, false, "Sea Slug Pokémon", Type.WATER, null, 0.3, 6.3, Abilities.STICKY_HOLD, Abilities.STORM_DRAIN, Abilities.SAND_FORCE, 325, 76, 48, 48, 57, 62, 34, 190, 50, 65, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("East Sea", "east", Type.WATER, null, 0.3, 6.3, Abilities.STICKY_HOLD, Abilities.STORM_DRAIN, Abilities.SAND_FORCE, 325, 76, 48, 48, 57, 62, 34, 190, 50, 65), - new PokemonForm("West Sea", "west", Type.WATER, null, 0.3, 6.3, Abilities.STICKY_HOLD, Abilities.STORM_DRAIN, Abilities.SAND_FORCE, 325, 76, 48, 48, 57, 62, 34, 190, 50, 65), + new PokemonForm("East Sea", "east", Type.WATER, null, 0.3, 6.3, Abilities.STICKY_HOLD, Abilities.STORM_DRAIN, Abilities.SAND_FORCE, 325, 76, 48, 48, 57, 62, 34, 190, 50, 65, false, null, true), + new PokemonForm("West Sea", "west", Type.WATER, null, 0.3, 6.3, Abilities.STICKY_HOLD, Abilities.STORM_DRAIN, Abilities.SAND_FORCE, 325, 76, 48, 48, 57, 62, 34, 190, 50, 65, false, null, true), ), new PokemonSpecies(Species.GASTRODON, 4, false, false, false, "Sea Slug Pokémon", Type.WATER, Type.GROUND, 0.9, 29.9, Abilities.STICKY_HOLD, Abilities.STORM_DRAIN, Abilities.SAND_FORCE, 475, 111, 83, 68, 92, 82, 39, 75, 50, 166, GrowthRate.MEDIUM_FAST, 50, false, false, new PokemonForm("East Sea", "east", Type.WATER, Type.GROUND, 0.9, 29.9, Abilities.STICKY_HOLD, Abilities.STORM_DRAIN, Abilities.SAND_FORCE, 475, 111, 83, 68, 92, 82, 39, 75, 50, 166), @@ -1532,12 +1551,12 @@ export function initSpecies() { new PokemonSpecies(Species.DUSKNOIR, 4, false, false, false, "Gripper Pokémon", Type.GHOST, null, 2.2, 106.6, Abilities.PRESSURE, Abilities.NONE, Abilities.FRISK, 525, 45, 100, 135, 65, 135, 45, 45, 35, 263, GrowthRate.FAST, 50, false), new PokemonSpecies(Species.FROSLASS, 4, false, false, false, "Snow Land Pokémon", Type.ICE, Type.GHOST, 1.3, 26.6, Abilities.SNOW_CLOAK, Abilities.NONE, Abilities.CURSED_BODY, 480, 70, 80, 70, 80, 70, 110, 75, 50, 168, GrowthRate.MEDIUM_FAST, 0, false), new PokemonSpecies(Species.ROTOM, 4, false, false, false, "Plasma Pokémon", Type.ELECTRIC, Type.GHOST, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 440, 50, 50, 77, 95, 77, 91, 45, 50, 154, GrowthRate.MEDIUM_FAST, null, false, false, - new PokemonForm("Normal", "", Type.ELECTRIC, Type.GHOST, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 440, 50, 50, 77, 95, 77, 91, 45, 50, 154), - new PokemonForm("Heat", "heat", Type.ELECTRIC, Type.FIRE, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 154), - new PokemonForm("Wash", "wash", Type.ELECTRIC, Type.WATER, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 154), - new PokemonForm("Frost", "frost", Type.ELECTRIC, Type.ICE, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 154), - new PokemonForm("Fan", "fan", Type.ELECTRIC, Type.FLYING, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 154), - new PokemonForm("Mow", "mow", Type.ELECTRIC, Type.GRASS, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 154), + new PokemonForm("Normal", "", Type.ELECTRIC, Type.GHOST, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 440, 50, 50, 77, 95, 77, 91, 45, 50, 154, false, null, true), + new PokemonForm("Heat", "heat", Type.ELECTRIC, Type.FIRE, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 154, false, null, true), + new PokemonForm("Wash", "wash", Type.ELECTRIC, Type.WATER, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 154, false, null, true), + new PokemonForm("Frost", "frost", Type.ELECTRIC, Type.ICE, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 154, false, null, true), + new PokemonForm("Fan", "fan", Type.ELECTRIC, Type.FLYING, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 154, false, null, true), + new PokemonForm("Mow", "mow", Type.ELECTRIC, Type.GRASS, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 154, false, null, true), ), new PokemonSpecies(Species.UXIE, 4, true, false, false, "Knowledge Pokémon", Type.PSYCHIC, null, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 580, 75, 75, 130, 75, 130, 95, 3, 140, 290, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.MESPRIT, 4, true, false, false, "Emotion Pokémon", Type.PSYCHIC, null, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 580, 80, 105, 105, 105, 105, 80, 3, 140, 290, GrowthRate.SLOW, null, false), @@ -1553,7 +1572,7 @@ export function initSpecies() { new PokemonSpecies(Species.HEATRAN, 4, true, false, false, "Lava Dome Pokémon", Type.FIRE, Type.STEEL, 1.7, 430, Abilities.FLASH_FIRE, Abilities.NONE, Abilities.FLAME_BODY, 600, 91, 90, 106, 130, 106, 77, 3, 100, 300, GrowthRate.SLOW, 50, false), new PokemonSpecies(Species.REGIGIGAS, 4, true, false, false, "Colossal Pokémon", Type.NORMAL, null, 3.7, 420, Abilities.SLOW_START, Abilities.NONE, Abilities.NORMALIZE, 670, 110, 160, 110, 80, 110, 100, 3, 0, 335, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.GIRATINA, 4, false, true, false, "Renegade Pokémon", Type.GHOST, Type.DRAGON, 4.5, 750, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 150, 100, 120, 100, 120, 90, 3, 0, 340, GrowthRate.SLOW, null, false, true, - new PokemonForm("Altered Forme", "altered", Type.GHOST, Type.DRAGON, 4.5, 750, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 150, 100, 120, 100, 120, 90, 3, 0, 340), + new PokemonForm("Altered Forme", "altered", Type.GHOST, Type.DRAGON, 4.5, 750, Abilities.PRESSURE, Abilities.NONE, Abilities.TELEPATHY, 680, 150, 100, 120, 100, 120, 90, 3, 0, 340, false, null, true), new PokemonForm("Origin Forme", "origin", Type.GHOST, Type.DRAGON, 6.9, 650, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 680, 150, 120, 100, 120, 100, 90, 3, 0, 340), ), new PokemonSpecies(Species.CRESSELIA, 4, true, false, false, "Lunar Pokémon", Type.PSYCHIC, null, 1.5, 85.6, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 580, 120, 70, 110, 75, 120, 85, 3, 100, 300, GrowthRate.SLOW, 0, false), @@ -1561,7 +1580,7 @@ export function initSpecies() { new PokemonSpecies(Species.MANAPHY, 4, false, false, true, "Seafaring Pokémon", Type.WATER, null, 0.3, 1.4, Abilities.HYDRATION, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 3, 70, 270, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.DARKRAI, 4, false, false, true, "Pitch-Black Pokémon", Type.DARK, null, 1.5, 50.5, Abilities.BAD_DREAMS, Abilities.NONE, Abilities.NONE, 600, 70, 90, 90, 135, 90, 125, 3, 0, 270, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.SHAYMIN, 4, false, false, true, "Gratitude Pokémon", Type.GRASS, null, 0.2, 2.1, Abilities.NATURAL_CURE, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 45, 100, 270, GrowthRate.MEDIUM_SLOW, null, false, true, - new PokemonForm("Land Forme", "land", Type.GRASS, null, 0.2, 2.1, Abilities.NATURAL_CURE, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 45, 100, 270), + new PokemonForm("Land Forme", "land", Type.GRASS, null, 0.2, 2.1, Abilities.NATURAL_CURE, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 45, 100, 270, false, null, true), new PokemonForm("Sky Forme", "sky", Type.GRASS, Type.FLYING, 0.4, 5.2, Abilities.SERENE_GRACE, Abilities.NONE, Abilities.NONE, 600, 100, 103, 75, 120, 75, 127, 45, 100, 270), ), new PokemonSpecies(Species.ARCEUS, 4, false, false, true, "Alpha Pokémon", Type.NORMAL, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324, GrowthRate.SLOW, null, false, true, @@ -1645,9 +1664,9 @@ export function initSpecies() { new PokemonSpecies(Species.PETILIL, 5, false, false, false, "Bulb Pokémon", Type.GRASS, null, 0.5, 6.6, Abilities.CHLOROPHYLL, Abilities.OWN_TEMPO, Abilities.LEAF_GUARD, 280, 45, 35, 50, 70, 50, 30, 190, 50, 56, GrowthRate.MEDIUM_FAST, 0, false), new PokemonSpecies(Species.LILLIGANT, 5, false, false, false, "Flowering Pokémon", Type.GRASS, null, 1.1, 16.3, Abilities.CHLOROPHYLL, Abilities.OWN_TEMPO, Abilities.LEAF_GUARD, 480, 70, 60, 75, 110, 75, 90, 75, 50, 168, GrowthRate.MEDIUM_FAST, 0, false), new PokemonSpecies(Species.BASCULIN, 5, false, false, false, "Hostile Pokémon", Type.WATER, null, 1, 18, Abilities.RECKLESS, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 460, 70, 92, 65, 80, 55, 98, 25, 50, 161, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Red-Striped Form", "red-striped", Type.WATER, null, 1, 18, Abilities.RECKLESS, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 460, 70, 92, 65, 80, 55, 98, 25, 50, 161), - new PokemonForm("Blue-Striped Form", "blue-striped", Type.WATER, null, 1, 18, Abilities.ROCK_HEAD, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 460, 70, 92, 65, 80, 55, 98, 25, 50, 161), - new PokemonForm("White-Striped Form", "white-striped", Type.WATER, null, 1, 18, Abilities.RATTLED, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 460, 70, 92, 65, 80, 55, 98, 25, 50, 161), + new PokemonForm("Red-Striped Form", "red-striped", Type.WATER, null, 1, 18, Abilities.RECKLESS, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 460, 70, 92, 65, 80, 55, 98, 25, 50, 161, false, null, true), + new PokemonForm("Blue-Striped Form", "blue-striped", Type.WATER, null, 1, 18, Abilities.ROCK_HEAD, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 460, 70, 92, 65, 80, 55, 98, 25, 50, 161, false, null, true), + new PokemonForm("White-Striped Form", "white-striped", Type.WATER, null, 1, 18, Abilities.RATTLED, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 460, 70, 92, 65, 80, 55, 98, 25, 50, 161, false, null, true), ), new PokemonSpecies(Species.SANDILE, 5, false, false, false, "Desert Croc Pokémon", Type.GROUND, Type.DARK, 0.7, 15.2, Abilities.INTIMIDATE, Abilities.MOXIE, Abilities.ANGER_POINT, 292, 50, 72, 35, 35, 35, 65, 180, 50, 58, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.KROKOROK, 5, false, false, false, "Desert Croc Pokémon", Type.GROUND, Type.DARK, 1, 33.4, Abilities.INTIMIDATE, Abilities.MOXIE, Abilities.ANGER_POINT, 351, 60, 82, 45, 45, 45, 74, 90, 50, 123, GrowthRate.MEDIUM_SLOW, 50, false), @@ -1690,10 +1709,10 @@ export function initSpecies() { new PokemonSpecies(Species.VANILLISH, 5, false, false, false, "Icy Snow Pokémon", Type.ICE, null, 1.1, 41, Abilities.ICE_BODY, Abilities.SNOW_CLOAK, Abilities.WEAK_ARMOR, 395, 51, 65, 65, 80, 75, 59, 120, 50, 138, GrowthRate.SLOW, 50, false), new PokemonSpecies(Species.VANILLUXE, 5, false, false, false, "Snowstorm Pokémon", Type.ICE, null, 1.3, 57.5, Abilities.ICE_BODY, Abilities.SNOW_WARNING, Abilities.WEAK_ARMOR, 535, 71, 95, 85, 110, 95, 79, 45, 50, 268, GrowthRate.SLOW, 50, false), new PokemonSpecies(Species.DEERLING, 5, false, false, false, "Season Pokémon", Type.NORMAL, Type.GRASS, 0.6, 19.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 335, 60, 60, 50, 40, 50, 75, 190, 70, 67, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Spring Form", "spring", Type.NORMAL, Type.GRASS, 0.6, 19.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 335, 60, 60, 50, 40, 50, 75, 190, 70, 67), - new PokemonForm("Summer Form", "summer", Type.NORMAL, Type.GRASS, 0.6, 19.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 335, 60, 60, 50, 40, 50, 75, 190, 70, 67), - new PokemonForm("Autumn Form", "autumn", Type.NORMAL, Type.GRASS, 0.6, 19.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 335, 60, 60, 50, 40, 50, 75, 190, 70, 67), - new PokemonForm("Winter Form", "winter", Type.NORMAL, Type.GRASS, 0.6, 19.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 335, 60, 60, 50, 40, 50, 75, 190, 70, 67), + new PokemonForm("Spring Form", "spring", Type.NORMAL, Type.GRASS, 0.6, 19.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 335, 60, 60, 50, 40, 50, 75, 190, 70, 67, false, null, true), + new PokemonForm("Summer Form", "summer", Type.NORMAL, Type.GRASS, 0.6, 19.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 335, 60, 60, 50, 40, 50, 75, 190, 70, 67, false, null, true), + new PokemonForm("Autumn Form", "autumn", Type.NORMAL, Type.GRASS, 0.6, 19.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 335, 60, 60, 50, 40, 50, 75, 190, 70, 67, false, null, true), + new PokemonForm("Winter Form", "winter", Type.NORMAL, Type.GRASS, 0.6, 19.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 335, 60, 60, 50, 40, 50, 75, 190, 70, 67, false, null, true), ), new PokemonSpecies(Species.SAWSBUCK, 5, false, false, false, "Season Pokémon", Type.NORMAL, Type.GRASS, 1.9, 92.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 475, 80, 100, 70, 60, 70, 95, 75, 70, 166, GrowthRate.MEDIUM_FAST, 50, false, true, new PokemonForm("Spring Form", "spring", Type.NORMAL, Type.GRASS, 1.9, 92.5, Abilities.CHLOROPHYLL, Abilities.SAP_SIPPER, Abilities.SERENE_GRACE, 475, 80, 100, 70, 60, 70, 95, 75, 70, 166), @@ -1756,17 +1775,17 @@ export function initSpecies() { new PokemonSpecies(Species.TERRAKION, 5, true, false, false, "Cavern Pokémon", Type.ROCK, Type.FIGHTING, 1.9, 260, Abilities.JUSTIFIED, Abilities.NONE, Abilities.NONE, 580, 91, 129, 90, 72, 90, 108, 3, 35, 290, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.VIRIZION, 5, true, false, false, "Grassland Pokémon", Type.GRASS, Type.FIGHTING, 2, 200, Abilities.JUSTIFIED, Abilities.NONE, Abilities.NONE, 580, 91, 90, 72, 90, 129, 108, 3, 35, 290, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.TORNADUS, 5, true, false, false, "Cyclone Pokémon", Type.FLYING, null, 1.5, 63, Abilities.PRANKSTER, Abilities.NONE, Abilities.DEFIANT, 580, 79, 115, 70, 125, 80, 111, 3, 90, 290, GrowthRate.SLOW, 100, false, true, - new PokemonForm("Incarnate Forme", "incarnate", Type.FLYING, null, 1.5, 63, Abilities.PRANKSTER, Abilities.NONE, Abilities.DEFIANT, 580, 79, 115, 70, 125, 80, 111, 3, 90, 290), + new PokemonForm("Incarnate Forme", "incarnate", Type.FLYING, null, 1.5, 63, Abilities.PRANKSTER, Abilities.NONE, Abilities.DEFIANT, 580, 79, 115, 70, 125, 80, 111, 3, 90, 290, false, null, true), new PokemonForm("Therian Forme", "therian", Type.FLYING, null, 1.4, 63, Abilities.REGENERATOR, Abilities.NONE, Abilities.REGENERATOR, 580, 79, 100, 80, 110, 90, 121, 3, 90, 290), ), new PokemonSpecies(Species.THUNDURUS, 5, true, false, false, "Bolt Strike Pokémon", Type.ELECTRIC, Type.FLYING, 1.5, 61, Abilities.PRANKSTER, Abilities.NONE, Abilities.DEFIANT, 580, 79, 115, 70, 125, 80, 111, 3, 90, 290, GrowthRate.SLOW, 100, false, true, - new PokemonForm("Incarnate Forme", "incarnate", Type.ELECTRIC, Type.FLYING, 1.5, 61, Abilities.PRANKSTER, Abilities.NONE, Abilities.DEFIANT, 580, 79, 115, 70, 125, 80, 111, 3, 90, 290), + new PokemonForm("Incarnate Forme", "incarnate", Type.ELECTRIC, Type.FLYING, 1.5, 61, Abilities.PRANKSTER, Abilities.NONE, Abilities.DEFIANT, 580, 79, 115, 70, 125, 80, 111, 3, 90, 290, false, null, true), new PokemonForm("Therian Forme", "therian", Type.ELECTRIC, Type.FLYING, 3, 61, Abilities.VOLT_ABSORB, Abilities.NONE, Abilities.VOLT_ABSORB, 580, 79, 105, 70, 145, 80, 101, 3, 90, 290), ), new PokemonSpecies(Species.RESHIRAM, 5, false, true, false, "Vast White Pokémon", Type.DRAGON, Type.FIRE, 3.2, 330, Abilities.TURBOBLAZE, Abilities.NONE, Abilities.NONE, 680, 100, 120, 100, 150, 120, 90, 3, 0, 340, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.ZEKROM, 5, false, true, false, "Deep Black Pokémon", Type.DRAGON, Type.ELECTRIC, 2.9, 345, Abilities.TERAVOLT, Abilities.NONE, Abilities.NONE, 680, 100, 150, 120, 120, 100, 90, 3, 0, 340, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.LANDORUS, 5, true, false, false, "Abundance Pokémon", Type.GROUND, Type.FLYING, 1.5, 68, Abilities.SAND_FORCE, Abilities.NONE, Abilities.SHEER_FORCE, 600, 89, 125, 90, 115, 80, 101, 3, 90, 300, GrowthRate.SLOW, 100, false, true, - new PokemonForm("Incarnate Forme", "incarnate", Type.GROUND, Type.FLYING, 1.5, 68, Abilities.SAND_FORCE, Abilities.NONE, Abilities.SHEER_FORCE, 600, 89, 125, 90, 115, 80, 101, 3, 90, 300), + new PokemonForm("Incarnate Forme", "incarnate", Type.GROUND, Type.FLYING, 1.5, 68, Abilities.SAND_FORCE, Abilities.NONE, Abilities.SHEER_FORCE, 600, 89, 125, 90, 115, 80, 101, 3, 90, 300, false, null, true), new PokemonForm("Therian Forme", "therian", Type.GROUND, Type.FLYING, 1.3, 68, Abilities.INTIMIDATE, Abilities.NONE, Abilities.INTIMIDATE, 600, 89, 145, 90, 105, 80, 91, 3, 90, 300), ), new PokemonSpecies(Species.KYUREM, 5, false, true, false, "Boundary Pokémon", Type.DRAGON, Type.ICE, 3, 325, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 660, 125, 130, 90, 130, 90, 95, 3, 0, 330, GrowthRate.SLOW, null, false, true, @@ -1779,7 +1798,7 @@ export function initSpecies() { new PokemonForm("Resolute", "resolute", Type.WATER, Type.FIGHTING, 1.4, 48.5, Abilities.JUSTIFIED, Abilities.NONE, Abilities.NONE, 580, 91, 72, 90, 129, 90, 108, 3, 35, 290), ), new PokemonSpecies(Species.MELOETTA, 5, false, false, true, "Melody Pokémon", Type.NORMAL, Type.PSYCHIC, 0.6, 6.5, Abilities.SERENE_GRACE, Abilities.NONE, Abilities.NONE, 600, 100, 77, 77, 128, 128, 90, 3, 100, 270, GrowthRate.SLOW, 0, false, true, - new PokemonForm("Aria Forme", "aria", Type.NORMAL, Type.PSYCHIC, 0.6, 6.5, Abilities.SERENE_GRACE, Abilities.NONE, Abilities.NONE, 600, 100, 77, 77, 128, 128, 90, 3, 100, 270), + new PokemonForm("Aria Forme", "aria", Type.NORMAL, Type.PSYCHIC, 0.6, 6.5, Abilities.SERENE_GRACE, Abilities.NONE, Abilities.NONE, 600, 100, 77, 77, 128, 128, 90, 3, 100, 270, false, null, true), new PokemonForm("Pirouette Forme", "pirouette", Type.NORMAL, Type.FIGHTING, 0.6, 6.5, Abilities.SERENE_GRACE, Abilities.NONE, Abilities.NONE, 600, 100, 128, 90, 77, 77, 128, 3, 100, 270), ), new PokemonSpecies(Species.GENESECT, 5, false, false, true, "Paleozoic Pokémon", Type.BUG, Type.STEEL, 1.5, 82.5, Abilities.DOWNLOAD, Abilities.NONE, Abilities.NONE, 600, 71, 120, 95, 120, 95, 99, 3, 0, 300, GrowthRate.SLOW, null, false, true, @@ -1796,8 +1815,8 @@ export function initSpecies() { new PokemonSpecies(Species.BRAIXEN, 6, false, false, false, "Fox Pokémon", Type.FIRE, null, 1, 14.5, Abilities.BLAZE, Abilities.NONE, Abilities.MAGICIAN, 409, 59, 59, 58, 90, 70, 73, 45, 70, 143, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.DELPHOX, 6, false, false, false, "Fox Pokémon", Type.FIRE, Type.PSYCHIC, 1.5, 39, Abilities.BLAZE, Abilities.NONE, Abilities.MAGICIAN, 534, 75, 69, 72, 114, 100, 104, 45, 70, 240, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.FROAKIE, 6, false, false, false, "Bubble Frog Pokémon", Type.WATER, null, 0.3, 7, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 314, 41, 56, 40, 62, 44, 71, 45, 70, 63, GrowthRate.MEDIUM_SLOW, 87.5, false, false, - new PokemonForm("Normal", "", Type.WATER, null, 0.3, 7, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 314, 41, 56, 40, 62, 44, 71, 45, 70, 63), - new PokemonForm("Battle Bond", "battle-bond", Type.WATER, null, 0.3, 7, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 314, 41, 56, 40, 62, 44, 71, 45, 70, 63, false, ""), + new PokemonForm("Normal", "", Type.WATER, null, 0.3, 7, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 314, 41, 56, 40, 62, 44, 71, 45, 70, 63, false, null, true), + new PokemonForm("Battle Bond", "battle-bond", Type.WATER, null, 0.3, 7, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 314, 41, 56, 40, 62, 44, 71, 45, 70, 63, false, "", true), ), new PokemonSpecies(Species.FROGADIER, 6, false, false, false, "Bubble Frog Pokémon", Type.WATER, null, 0.6, 10.9, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 405, 54, 63, 52, 83, 56, 97, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false, false, new PokemonForm("Normal", "", Type.WATER, null, 0.6, 10.9, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 405, 54, 63, 52, 83, 56, 97, 45, 70, 142), @@ -1814,26 +1833,26 @@ export function initSpecies() { new PokemonSpecies(Species.FLETCHINDER, 6, false, false, false, "Ember Pokémon", Type.FIRE, Type.FLYING, 0.7, 16, Abilities.FLAME_BODY, Abilities.NONE, Abilities.GALE_WINGS, 382, 62, 73, 55, 56, 52, 84, 120, 50, 134, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.TALONFLAME, 6, false, false, false, "Scorching Pokémon", Type.FIRE, Type.FLYING, 1.2, 24.5, Abilities.FLAME_BODY, Abilities.NONE, Abilities.GALE_WINGS, 499, 78, 81, 71, 74, 69, 126, 45, 50, 175, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.SCATTERBUG, 6, false, false, false, "Scatterdust Pokémon", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Meadow Pattern", "meadow", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, ""), - new PokemonForm("Icy Snow Pattern", "icy-snow", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, ""), - new PokemonForm("Polar Pattern", "polar", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, ""), - new PokemonForm("Tundra Pattern", "tundra", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, ""), - new PokemonForm("Continental Pattern", "continental", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, ""), - new PokemonForm("Garden Pattern", "garden", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, ""), - new PokemonForm("Elegant Pattern", "elegant", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, ""), - new PokemonForm("Modern Pattern", "modern", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, ""), - new PokemonForm("Marine Pattern", "marine", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, ""), - new PokemonForm("Archipelago Pattern", "archipelago", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, ""), - new PokemonForm("High Plains Pattern", "high-plains", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, ""), - new PokemonForm("Sandstorm Pattern", "sandstorm", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, ""), - new PokemonForm("River Pattern", "river", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, ""), - new PokemonForm("Monsoon Pattern", "monsoon", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, ""), - new PokemonForm("Savanna Pattern", "savanna", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, ""), - new PokemonForm("Sun Pattern", "sun", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, ""), - new PokemonForm("Ocean Pattern", "ocean", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, ""), - new PokemonForm("Jungle Pattern", "jungle", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, ""), - new PokemonForm("Fancy Pattern", "fancy", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, ""), - new PokemonForm("Poké Ball Pattern", "poke-ball", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, ""), + new PokemonForm("Meadow Pattern", "meadow", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Icy Snow Pattern", "icy-snow", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Polar Pattern", "polar", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Tundra Pattern", "tundra", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Continental Pattern", "continental", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Garden Pattern", "garden", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Elegant Pattern", "elegant", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Modern Pattern", "modern", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Marine Pattern", "marine", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Archipelago Pattern", "archipelago", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("High Plains Pattern", "high-plains", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Sandstorm Pattern", "sandstorm", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("River Pattern", "river", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Monsoon Pattern", "monsoon", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Savanna Pattern", "savanna", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Sun Pattern", "sun", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Ocean Pattern", "ocean", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Jungle Pattern", "jungle", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Fancy Pattern", "fancy", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Poké Ball Pattern", "poke-ball", Type.BUG, null, 0.3, 2.5, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), ), new PokemonSpecies(Species.SPEWPA, 6, false, false, false, "Scatterdust Pokémon", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.SHED_SKIN, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, GrowthRate.MEDIUM_FAST, 50, false, false, new PokemonForm("Meadow Pattern", "meadow", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, ""), @@ -1882,11 +1901,11 @@ export function initSpecies() { new PokemonSpecies(Species.LITLEO, 6, false, false, false, "Lion Cub Pokémon", Type.FIRE, Type.NORMAL, 0.6, 13.5, Abilities.RIVALRY, Abilities.UNNERVE, Abilities.MOXIE, 369, 62, 50, 58, 73, 54, 72, 220, 70, 74, GrowthRate.MEDIUM_SLOW, 12.5, false), new PokemonSpecies(Species.PYROAR, 6, false, false, false, "Royal Pokémon", Type.FIRE, Type.NORMAL, 1.5, 81.5, Abilities.RIVALRY, Abilities.UNNERVE, Abilities.MOXIE, 507, 86, 68, 72, 109, 66, 106, 65, 70, 177, GrowthRate.MEDIUM_SLOW, 12.5, true), new PokemonSpecies(Species.FLABEBE, 6, false, false, false, "Single Bloom Pokémon", Type.FAIRY, null, 0.1, 0.1, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61, GrowthRate.MEDIUM_FAST, 0, false, false, - new PokemonForm("Red Flower", "red", Type.FAIRY, null, 0.1, 0.1, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61), - new PokemonForm("Yellow Flower", "yellow", Type.FAIRY, null, 0.1, 0.1, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61), - new PokemonForm("Orange Flower", "orange", Type.FAIRY, null, 0.1, 0.1, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61), - new PokemonForm("Blue Flower", "blue", Type.FAIRY, null, 0.1, 0.1, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61), - new PokemonForm("White Flower", "white", Type.FAIRY, null, 0.1, 0.1, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61), + new PokemonForm("Red Flower", "red", Type.FAIRY, null, 0.1, 0.1, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61, false, null, true), + new PokemonForm("Yellow Flower", "yellow", Type.FAIRY, null, 0.1, 0.1, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61, false, null, true), + new PokemonForm("Orange Flower", "orange", Type.FAIRY, null, 0.1, 0.1, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61, false, null, true), + new PokemonForm("Blue Flower", "blue", Type.FAIRY, null, 0.1, 0.1, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61, false, null, true), + new PokemonForm("White Flower", "white", Type.FAIRY, null, 0.1, 0.1, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61, false, null, true), ), new PokemonSpecies(Species.FLOETTE, 6, false, false, false, "Single Bloom Pokémon", Type.FAIRY, null, 0.2, 0.9, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 371, 54, 45, 47, 75, 98, 52, 120, 70, 130, GrowthRate.MEDIUM_FAST, 0, false, false, new PokemonForm("Red Flower", "red", Type.FAIRY, null, 0.2, 0.9, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 371, 54, 45, 47, 75, 98, 52, 120, 70, 130), @@ -1907,27 +1926,27 @@ export function initSpecies() { new PokemonSpecies(Species.PANCHAM, 6, false, false, false, "Playful Pokémon", Type.FIGHTING, null, 0.6, 8, Abilities.IRON_FIST, Abilities.MOLD_BREAKER, Abilities.SCRAPPY, 348, 67, 82, 62, 46, 48, 43, 220, 50, 70, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.PANGORO, 6, false, false, false, "Daunting Pokémon", Type.FIGHTING, Type.DARK, 2.1, 136, Abilities.IRON_FIST, Abilities.MOLD_BREAKER, Abilities.SCRAPPY, 495, 95, 124, 78, 69, 71, 58, 65, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.FURFROU, 6, false, false, false, "Poodle Pokémon", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Natural Form", "", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165), - new PokemonForm("Heart Trim", "heart", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false), - new PokemonForm("Star Trim", "star", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false), - new PokemonForm("Diamond Trim", "diamond", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false), - new PokemonForm("Debutante Trim", "debutante", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false), - new PokemonForm("Matron Trim", "matron", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false), - new PokemonForm("Dandy Trim", "dandy", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false), - new PokemonForm("La Reine Trim", "la-reine", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false), - new PokemonForm("Kabuki Trim", "kabuki", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false), - new PokemonForm("Pharaoh Trim", "pharaoh", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false), + new PokemonForm("Natural Form", "", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), + new PokemonForm("Heart Trim", "heart", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), + new PokemonForm("Star Trim", "star", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), + new PokemonForm("Diamond Trim", "diamond", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), + new PokemonForm("Debutante Trim", "debutante", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), + new PokemonForm("Matron Trim", "matron", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), + new PokemonForm("Dandy Trim", "dandy", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), + new PokemonForm("La Reine Trim", "la-reine", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), + new PokemonForm("Kabuki Trim", "kabuki", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), + new PokemonForm("Pharaoh Trim", "pharaoh", Type.NORMAL, null, 1.2, 28, Abilities.FUR_COAT, Abilities.NONE, Abilities.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), ), new PokemonSpecies(Species.ESPURR, 6, false, false, false, "Restraint Pokémon", Type.PSYCHIC, null, 0.3, 3.5, Abilities.KEEN_EYE, Abilities.INFILTRATOR, Abilities.OWN_TEMPO, 355, 62, 48, 54, 63, 60, 68, 190, 50, 71, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.MEOWSTIC, 6, false, false, false, "Constraint Pokémon", Type.PSYCHIC, null, 0.6, 8.5, Abilities.KEEN_EYE, Abilities.INFILTRATOR, Abilities.PRANKSTER, 466, 74, 48, 76, 83, 81, 104, 75, 50, 163, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Male", "male", Type.PSYCHIC, null, 0.6, 8.5, Abilities.KEEN_EYE, Abilities.INFILTRATOR, Abilities.PRANKSTER, 466, 74, 48, 76, 83, 81, 104, 75, 50, 163, false, ""), - new PokemonForm("Female", "female", Type.PSYCHIC, null, 0.6, 8.5, Abilities.KEEN_EYE, Abilities.INFILTRATOR, Abilities.COMPETITIVE, 466, 74, 48, 76, 83, 81, 104, 75, 50, 163, false), + new PokemonForm("Male", "male", Type.PSYCHIC, null, 0.6, 8.5, Abilities.KEEN_EYE, Abilities.INFILTRATOR, Abilities.PRANKSTER, 466, 74, 48, 76, 83, 81, 104, 75, 50, 163, false, "", true), + new PokemonForm("Female", "female", Type.PSYCHIC, null, 0.6, 8.5, Abilities.KEEN_EYE, Abilities.INFILTRATOR, Abilities.COMPETITIVE, 466, 74, 48, 76, 83, 81, 104, 75, 50, 163, false, null, true), ), new PokemonSpecies(Species.HONEDGE, 6, false, false, false, "Sword Pokémon", Type.STEEL, Type.GHOST, 0.8, 2, Abilities.NO_GUARD, Abilities.NONE, Abilities.NONE, 325, 45, 80, 100, 35, 37, 28, 180, 50, 65, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.DOUBLADE, 6, false, false, false, "Sword Pokémon", Type.STEEL, Type.GHOST, 0.8, 4.5, Abilities.NO_GUARD, Abilities.NONE, Abilities.NONE, 448, 59, 110, 150, 45, 49, 35, 90, 50, 157, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.AEGISLASH, 6, false, false, false, "Royal Sword Pokémon", Type.STEEL, Type.GHOST, 1.7, 53, Abilities.STANCE_CHANGE, Abilities.NONE, Abilities.NONE, 500, 60, 50, 140, 50, 140, 60, 45, 50, 250, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Shield Forme", "shield", Type.STEEL, Type.GHOST, 1.7, 53, Abilities.STANCE_CHANGE, Abilities.NONE, Abilities.NONE, 500, 60, 50, 140, 50, 140, 60, 45, 50, 250, false, ""), - new PokemonForm("Blade Forme", "blade", Type.STEEL, Type.GHOST, 1.7, 53, Abilities.STANCE_CHANGE, Abilities.NONE, Abilities.NONE, 500, 60, 140, 50, 140, 50, 60, 45, 50, 250), + new PokemonForm("Shield Forme", "shield", Type.STEEL, Type.GHOST, 1.7, 53, Abilities.STANCE_CHANGE, Abilities.NONE, Abilities.NONE, 500, 60, 50, 140, 50, 140, 60, 45, 50, 250, false, "", true), + new PokemonForm("Blade Forme", "blade", Type.STEEL, Type.GHOST, 1.7, 53, Abilities.STANCE_CHANGE, Abilities.NONE, Abilities.NONE, 500, 60, 140, 50, 140, 50, 60, 45, 50, 250, false, null, true), ), new PokemonSpecies(Species.SPRITZEE, 6, false, false, false, "Perfume Pokémon", Type.FAIRY, null, 0.2, 0.5, Abilities.HEALER, Abilities.NONE, Abilities.AROMA_VEIL, 341, 78, 52, 60, 63, 65, 23, 200, 50, 68, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.AROMATISSE, 6, false, false, false, "Fragrance Pokémon", Type.FAIRY, null, 0.8, 15.5, Abilities.HEALER, Abilities.NONE, Abilities.AROMA_VEIL, 462, 101, 72, 72, 99, 89, 29, 140, 50, 162, GrowthRate.MEDIUM_FAST, 50, false), @@ -1958,10 +1977,10 @@ export function initSpecies() { new PokemonSpecies(Species.PHANTUMP, 6, false, false, false, "Stump Pokémon", Type.GHOST, Type.GRASS, 0.4, 7, Abilities.NATURAL_CURE, Abilities.FRISK, Abilities.HARVEST, 309, 43, 70, 48, 50, 60, 38, 120, 50, 62, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.TREVENANT, 6, false, false, false, "Elder Tree Pokémon", Type.GHOST, Type.GRASS, 1.5, 71, Abilities.NATURAL_CURE, Abilities.FRISK, Abilities.HARVEST, 474, 85, 110, 76, 65, 82, 56, 60, 50, 166, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.PUMPKABOO, 6, false, false, false, "Pumpkin Pokémon", Type.GHOST, Type.GRASS, 0.4, 5, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 335, 49, 66, 70, 44, 55, 51, 120, 50, 67, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Average Size", "", Type.GHOST, Type.GRASS, 0.4, 5, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 335, 49, 66, 70, 44, 55, 51, 120, 50, 67), - new PokemonForm("Small Size", "small", Type.GHOST, Type.GRASS, 0.3, 3.5, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 335, 44, 66, 70, 44, 55, 56, 120, 50, 67), - new PokemonForm("Large Size", "large", Type.GHOST, Type.GRASS, 0.5, 7.5, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 335, 54, 66, 70, 44, 55, 46, 120, 50, 67), - new PokemonForm("Super Size", "super", Type.GHOST, Type.GRASS, 0.8, 15, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 335, 59, 66, 70, 44, 55, 41, 120, 50, 67), + new PokemonForm("Average Size", "", Type.GHOST, Type.GRASS, 0.4, 5, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 335, 49, 66, 70, 44, 55, 51, 120, 50, 67, false, null, true), + new PokemonForm("Small Size", "small", Type.GHOST, Type.GRASS, 0.3, 3.5, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 335, 44, 66, 70, 44, 55, 56, 120, 50, 67, false, null, true), + new PokemonForm("Large Size", "large", Type.GHOST, Type.GRASS, 0.5, 7.5, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 335, 54, 66, 70, 44, 55, 46, 120, 50, 67, false, null, true), + new PokemonForm("Super Size", "super", Type.GHOST, Type.GRASS, 0.8, 15, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 335, 59, 66, 70, 44, 55, 41, 120, 50, 67, false, null, true), ), new PokemonSpecies(Species.GOURGEIST, 6, false, false, false, "Pumpkin Pokémon", Type.GHOST, Type.GRASS, 0.9, 12.5, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 494, 65, 90, 122, 58, 75, 84, 60, 50, 173, GrowthRate.MEDIUM_FAST, 50, false, false, new PokemonForm("Average Size", "", Type.GHOST, Type.GRASS, 0.9, 12.5, Abilities.PICKUP, Abilities.FRISK, Abilities.INSOMNIA, 494, 65, 90, 122, 58, 75, 84, 60, 50, 173), @@ -1974,15 +1993,15 @@ export function initSpecies() { new PokemonSpecies(Species.NOIBAT, 6, false, false, false, "Sound Wave Pokémon", Type.FLYING, Type.DRAGON, 0.5, 8, Abilities.FRISK, Abilities.INFILTRATOR, Abilities.TELEPATHY, 245, 40, 30, 35, 45, 40, 55, 190, 50, 49, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.NOIVERN, 6, false, false, false, "Sound Wave Pokémon", Type.FLYING, Type.DRAGON, 1.5, 85, Abilities.FRISK, Abilities.INFILTRATOR, Abilities.TELEPATHY, 535, 85, 70, 80, 97, 80, 123, 45, 50, 187, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.XERNEAS, 6, false, true, false, "Life Pokémon", Type.FAIRY, null, 3, 215, Abilities.FAIRY_AURA, Abilities.NONE, Abilities.NONE, 680, 126, 131, 95, 131, 98, 99, 45, 0, 340, GrowthRate.SLOW, null, false, true, - new PokemonForm("Neutral Mode", "neutral", Type.FAIRY, null, 3, 215, Abilities.FAIRY_AURA, Abilities.NONE, Abilities.NONE, 680, 126, 131, 95, 131, 98, 99, 45, 0, 340), + new PokemonForm("Neutral Mode", "neutral", Type.FAIRY, null, 3, 215, Abilities.FAIRY_AURA, Abilities.NONE, Abilities.NONE, 680, 126, 131, 95, 131, 98, 99, 45, 0, 340, false, null, true), new PokemonForm("Active Mode", "active", Type.FAIRY, null, 3, 215, Abilities.FAIRY_AURA, Abilities.NONE, Abilities.NONE, 680, 126, 131, 95, 131, 98, 99, 45, 0, 340) ), new PokemonSpecies(Species.YVELTAL, 6, false, true, false, "Destruction Pokémon", Type.DARK, Type.FLYING, 5.8, 203, Abilities.DARK_AURA, Abilities.NONE, Abilities.NONE, 680, 126, 131, 95, 131, 98, 99, 45, 0, 340, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.ZYGARDE, 6, false, true, false, "Order Pokémon", Type.DRAGON, Type.GROUND, 5, 305, Abilities.AURA_BREAK, Abilities.NONE, Abilities.NONE, 600, 108, 100, 121, 81, 95, 95, 3, 0, 300, GrowthRate.SLOW, null, false, false, - new PokemonForm("50% Forme", "50", Type.DRAGON, Type.GROUND, 5, 305, Abilities.AURA_BREAK, Abilities.NONE, Abilities.NONE, 600, 108, 100, 121, 81, 95, 95, 3, 0, 300, false, ""), - new PokemonForm("10% Forme", "10", Type.DRAGON, Type.GROUND, 1.2, 33.5, Abilities.AURA_BREAK, Abilities.NONE, Abilities.NONE, 486, 54, 100, 71, 61, 85, 115, 3, 0, 300), - new PokemonForm("50% Forme Power Construct", "50-pc", Type.DRAGON, Type.GROUND, 5, 305, Abilities.POWER_CONSTRUCT, Abilities.NONE, Abilities.NONE, 600, 108, 100, 121, 81, 95, 95, 3, 0, 300, false, ""), - new PokemonForm("10% Forme Power Construct", "10-pc", Type.DRAGON, Type.GROUND, 1.2, 33.5, Abilities.POWER_CONSTRUCT, Abilities.NONE, Abilities.NONE, 486, 54, 100, 71, 61, 85, 115, 3, 0, 300, false, "10"), + new PokemonForm("50% Forme", "50", Type.DRAGON, Type.GROUND, 5, 305, Abilities.AURA_BREAK, Abilities.NONE, Abilities.NONE, 600, 108, 100, 121, 81, 95, 95, 3, 0, 300, false, "", true), + new PokemonForm("10% Forme", "10", Type.DRAGON, Type.GROUND, 1.2, 33.5, Abilities.AURA_BREAK, Abilities.NONE, Abilities.NONE, 486, 54, 100, 71, 61, 85, 115, 3, 0, 300, false, null, true), + new PokemonForm("50% Forme Power Construct", "50-pc", Type.DRAGON, Type.GROUND, 5, 305, Abilities.POWER_CONSTRUCT, Abilities.NONE, Abilities.NONE, 600, 108, 100, 121, 81, 95, 95, 3, 0, 300, false, "", true), + new PokemonForm("10% Forme Power Construct", "10-pc", Type.DRAGON, Type.GROUND, 1.2, 33.5, Abilities.POWER_CONSTRUCT, Abilities.NONE, Abilities.NONE, 486, 54, 100, 71, 61, 85, 115, 3, 0, 300, false, "10", true), new PokemonForm("Complete Forme", "complete", Type.DRAGON, Type.GROUND, 4.5, 610, Abilities.POWER_CONSTRUCT, Abilities.NONE, Abilities.NONE, 708, 216, 100, 121, 91, 95, 85, 3, 0, 300), ), new PokemonSpecies(Species.DIANCIE, 6, false, false, true, "Jewel Pokémon", Type.ROCK, Type.FAIRY, 0.7, 8.8, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.NONE, 600, 50, 100, 150, 100, 150, 50, 3, 50, 300, GrowthRate.SLOW, null, false, true, @@ -2014,16 +2033,16 @@ export function initSpecies() { new PokemonSpecies(Species.CRABRAWLER, 7, false, false, false, "Boxing Pokémon", Type.FIGHTING, null, 0.6, 7, Abilities.HYPER_CUTTER, Abilities.IRON_FIST, Abilities.ANGER_POINT, 338, 47, 82, 57, 42, 47, 63, 225, 70, 68, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.CRABOMINABLE, 7, false, false, false, "Woolly Crab Pokémon", Type.FIGHTING, Type.ICE, 1.7, 180, Abilities.HYPER_CUTTER, Abilities.IRON_FIST, Abilities.ANGER_POINT, 478, 97, 132, 77, 62, 67, 43, 60, 70, 167, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.ORICORIO, 7, false, false, false, "Dancing Pokémon", Type.FIRE, Type.FLYING, 0.6, 3.4, Abilities.DANCER, Abilities.NONE, Abilities.NONE, 476, 75, 70, 70, 98, 70, 93, 45, 70, 167, GrowthRate.MEDIUM_FAST, 25, false, false, - new PokemonForm("Baile Style", "baile", Type.FIRE, Type.FLYING, 0.6, 3.4, Abilities.DANCER, Abilities.NONE, Abilities.NONE, 476, 75, 70, 70, 98, 70, 93, 45, 70, 167, false, ""), - new PokemonForm("Pom-Pom Style", "pompom", Type.ELECTRIC, Type.FLYING, 0.6, 3.4, Abilities.DANCER, Abilities.NONE, Abilities.NONE, 476, 75, 70, 70, 98, 70, 93, 45, 70, 167), - new PokemonForm("Pau Style", "pau", Type.PSYCHIC, Type.FLYING, 0.6, 3.4, Abilities.DANCER, Abilities.NONE, Abilities.NONE, 476, 75, 70, 70, 98, 70, 93, 45, 70, 167), - new PokemonForm("Sensu Style", "sensu", Type.GHOST, Type.FLYING, 0.6, 3.4, Abilities.DANCER, Abilities.NONE, Abilities.NONE, 476, 75, 70, 70, 98, 70, 93, 45, 70, 167), + new PokemonForm("Baile Style", "baile", Type.FIRE, Type.FLYING, 0.6, 3.4, Abilities.DANCER, Abilities.NONE, Abilities.NONE, 476, 75, 70, 70, 98, 70, 93, 45, 70, 167, false, "", true), + new PokemonForm("Pom-Pom Style", "pompom", Type.ELECTRIC, Type.FLYING, 0.6, 3.4, Abilities.DANCER, Abilities.NONE, Abilities.NONE, 476, 75, 70, 70, 98, 70, 93, 45, 70, 167, false, null, true), + new PokemonForm("Pau Style", "pau", Type.PSYCHIC, Type.FLYING, 0.6, 3.4, Abilities.DANCER, Abilities.NONE, Abilities.NONE, 476, 75, 70, 70, 98, 70, 93, 45, 70, 167, false, null, true), + new PokemonForm("Sensu Style", "sensu", Type.GHOST, Type.FLYING, 0.6, 3.4, Abilities.DANCER, Abilities.NONE, Abilities.NONE, 476, 75, 70, 70, 98, 70, 93, 45, 70, 167, false, null, true), ), new PokemonSpecies(Species.CUTIEFLY, 7, false, false, false, "Bee Fly Pokémon", Type.BUG, Type.FAIRY, 0.1, 0.2, Abilities.HONEY_GATHER, Abilities.SHIELD_DUST, Abilities.SWEET_VEIL, 304, 40, 45, 40, 55, 40, 84, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.RIBOMBEE, 7, false, false, false, "Bee Fly Pokémon", Type.BUG, Type.FAIRY, 0.2, 0.5, Abilities.HONEY_GATHER, Abilities.SHIELD_DUST, Abilities.SWEET_VEIL, 464, 60, 55, 60, 95, 70, 124, 75, 50, 162, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.ROCKRUFF, 7, false, false, false, "Puppy Pokémon", Type.ROCK, null, 0.5, 9.2, Abilities.KEEN_EYE, Abilities.VITAL_SPIRIT, Abilities.STEADFAST, 280, 45, 65, 40, 30, 40, 60, 190, 50, 56, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Normal", "", Type.ROCK, null, 0.5, 9.2, Abilities.KEEN_EYE, Abilities.VITAL_SPIRIT, Abilities.STEADFAST, 280, 45, 65, 40, 30, 40, 60, 190, 50, 56), - new PokemonForm("Own Tempo", "own-tempo", Type.ROCK, null, 0.5, 9.2, Abilities.OWN_TEMPO, Abilities.NONE, Abilities.OWN_TEMPO, 280, 45, 65, 40, 30, 40, 60, 190, 50, 56, false, ""), + new PokemonForm("Normal", "", Type.ROCK, null, 0.5, 9.2, Abilities.KEEN_EYE, Abilities.VITAL_SPIRIT, Abilities.STEADFAST, 280, 45, 65, 40, 30, 40, 60, 190, 50, 56, false, null, true), + new PokemonForm("Own Tempo", "own-tempo", Type.ROCK, null, 0.5, 9.2, Abilities.OWN_TEMPO, Abilities.NONE, Abilities.OWN_TEMPO, 280, 45, 65, 40, 30, 40, 60, 190, 50, 56, false, "", true), ), new PokemonSpecies(Species.LYCANROC, 7, false, false, false, "Wolf Pokémon", Type.ROCK, null, 0.8, 25, Abilities.KEEN_EYE, Abilities.SAND_RUSH, Abilities.STEADFAST, 487, 75, 115, 65, 55, 65, 112, 90, 50, 170, GrowthRate.MEDIUM_FAST, 50, false, false, new PokemonForm("Midday Form", "midday", Type.ROCK, null, 0.8, 25, Abilities.KEEN_EYE, Abilities.SAND_RUSH, Abilities.STEADFAST, 487, 75, 115, 65, 55, 65, 112, 90, 50, 170, false, ""), @@ -2081,26 +2100,26 @@ export function initSpecies() { new PokemonForm("Type: Fairy", "fairy", Type.FAIRY, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), ), new PokemonSpecies(Species.MINIOR, 7, false, false, false, "Meteor Pokémon", Type.ROCK, Type.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, GrowthRate.MEDIUM_SLOW, null, false, false, - new PokemonForm("Red Meteor Form", "red-meteor", Type.ROCK, Type.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, ""), - new PokemonForm("Orange Meteor Form", "orange-meteor", Type.ROCK, Type.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, ""), - new PokemonForm("Yellow Meteor Form", "yellow-meteor", Type.ROCK, Type.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, ""), - new PokemonForm("Green Meteor Form", "green-meteor", Type.ROCK, Type.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, ""), - new PokemonForm("Blue Meteor Form", "blue-meteor", Type.ROCK, Type.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, ""), - new PokemonForm("Indigo Meteor Form", "indigo-meteor", Type.ROCK, Type.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, ""), - new PokemonForm("Violet Meteor Form", "violet-meteor", Type.ROCK, Type.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, ""), - new PokemonForm("Red Core Form", "red", Type.ROCK, Type.FLYING, 0.3, 0.3, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 154), - new PokemonForm("Orange Core Form", "orange", Type.ROCK, Type.FLYING, 0.3, 0.3, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 154), - new PokemonForm("Yellow Core Form", "yellow", Type.ROCK, Type.FLYING, 0.3, 0.3, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 154), - new PokemonForm("Green Core Form", "green", Type.ROCK, Type.FLYING, 0.3, 0.3, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 154), - new PokemonForm("Blue Core Form", "blue", Type.ROCK, Type.FLYING, 0.3, 0.3, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 154), - new PokemonForm("Indigo Core Form", "indigo", Type.ROCK, Type.FLYING, 0.3, 0.3, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 154), - new PokemonForm("Violet Core Form", "violet", Type.ROCK, Type.FLYING, 0.3, 0.3, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 154), + new PokemonForm("Red Meteor Form", "red-meteor", Type.ROCK, Type.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, "", true), + new PokemonForm("Orange Meteor Form", "orange-meteor", Type.ROCK, Type.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, "", true), + new PokemonForm("Yellow Meteor Form", "yellow-meteor", Type.ROCK, Type.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, "", true), + new PokemonForm("Green Meteor Form", "green-meteor", Type.ROCK, Type.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, "", true), + new PokemonForm("Blue Meteor Form", "blue-meteor", Type.ROCK, Type.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, "", true), + new PokemonForm("Indigo Meteor Form", "indigo-meteor", Type.ROCK, Type.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, "", true), + new PokemonForm("Violet Meteor Form", "violet-meteor", Type.ROCK, Type.FLYING, 0.3, 40, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, "", true), + new PokemonForm("Red Core Form", "red", Type.ROCK, Type.FLYING, 0.3, 0.3, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 154, false, null, true), + new PokemonForm("Orange Core Form", "orange", Type.ROCK, Type.FLYING, 0.3, 0.3, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 154, false, null, true), + new PokemonForm("Yellow Core Form", "yellow", Type.ROCK, Type.FLYING, 0.3, 0.3, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 154, false, null, true), + new PokemonForm("Green Core Form", "green", Type.ROCK, Type.FLYING, 0.3, 0.3, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 154, false, null, true), + new PokemonForm("Blue Core Form", "blue", Type.ROCK, Type.FLYING, 0.3, 0.3, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 154, false, null, true), + new PokemonForm("Indigo Core Form", "indigo", Type.ROCK, Type.FLYING, 0.3, 0.3, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 154, false, null, true), + new PokemonForm("Violet Core Form", "violet", Type.ROCK, Type.FLYING, 0.3, 0.3, Abilities.SHIELDS_DOWN, Abilities.NONE, Abilities.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 154, false, null, true), ), new PokemonSpecies(Species.KOMALA, 7, false, false, false, "Drowsing Pokémon", Type.NORMAL, null, 0.4, 19.9, Abilities.COMATOSE, Abilities.NONE, Abilities.NONE, 480, 65, 115, 65, 75, 95, 65, 45, 70, 168, GrowthRate.SLOW, 50, false), new PokemonSpecies(Species.TURTONATOR, 7, false, false, false, "Blast Turtle Pokémon", Type.FIRE, Type.DRAGON, 2, 212, Abilities.SHELL_ARMOR, Abilities.NONE, Abilities.NONE, 485, 60, 78, 135, 91, 85, 36, 70, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.TOGEDEMARU, 7, false, false, false, "Roly-Poly Pokémon", Type.ELECTRIC, Type.STEEL, 0.3, 3.3, Abilities.IRON_BARBS, Abilities.LIGHTNING_ROD, Abilities.STURDY, 435, 65, 98, 63, 40, 73, 96, 180, 50, 152, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.MIMIKYU, 7, false, false, false, "Disguise Pokémon", Type.GHOST, Type.FAIRY, 0.2, 0.7, Abilities.DISGUISE, Abilities.NONE, Abilities.NONE, 476, 55, 90, 80, 50, 105, 96, 45, 50, 167, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Disguised Form", "disguised", Type.GHOST, Type.FAIRY, 0.2, 0.7, Abilities.DISGUISE, Abilities.NONE, Abilities.NONE, 476, 55, 90, 80, 50, 105, 96, 45, 50, 167, false, ""), + new PokemonForm("Disguised Form", "disguised", Type.GHOST, Type.FAIRY, 0.2, 0.7, Abilities.DISGUISE, Abilities.NONE, Abilities.NONE, 476, 55, 90, 80, 50, 105, 96, 45, 50, 167, false, "", true), new PokemonForm("Busted Form", "busted", Type.GHOST, Type.FAIRY, 0.2, 0.7, Abilities.DISGUISE, Abilities.NONE, Abilities.NONE, 476, 55, 90, 80, 50, 105, 96, 45, 50, 167), ), new PokemonSpecies(Species.BRUXISH, 7, false, false, false, "Gnash Teeth Pokémon", Type.WATER, Type.PSYCHIC, 0.9, 19, Abilities.DAZZLING, Abilities.STRONG_JAW, Abilities.WONDER_SKIN, 475, 68, 105, 70, 70, 70, 92, 80, 70, 166, GrowthRate.MEDIUM_FAST, 50, false), @@ -2234,8 +2253,8 @@ export function initSpecies() { new PokemonSpecies(Species.CLOBBOPUS, 8, false, false, false, "Tantrum Pokémon", Type.FIGHTING, null, 0.6, 4, Abilities.LIMBER, Abilities.NONE, Abilities.TECHNICIAN, 310, 50, 68, 60, 50, 50, 32, 180, 50, 62, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.GRAPPLOCT, 8, false, false, false, "Jujitsu Pokémon", Type.FIGHTING, null, 1.6, 39, Abilities.LIMBER, Abilities.NONE, Abilities.TECHNICIAN, 480, 80, 118, 90, 70, 80, 42, 45, 50, 168, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.SINISTEA, 8, false, false, false, "Black Tea Pokémon", Type.GHOST, null, 0.1, 0.2, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, GrowthRate.MEDIUM_FAST, null, false, false, - new PokemonForm("Phony Form", "phony", Type.GHOST, null, 0.1, 0.2, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, ""), - new PokemonForm("Antique Form", "antique", Type.GHOST, null, 0.1, 0.2, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, ""), + new PokemonForm("Phony Form", "phony", Type.GHOST, null, 0.1, 0.2, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, "", true), + new PokemonForm("Antique Form", "antique", Type.GHOST, null, 0.1, 0.2, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, "", true), ), new PokemonSpecies(Species.POLTEAGEIST, 8, false, false, false, "Black Tea Pokémon", Type.GHOST, null, 0.2, 0.4, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 508, 60, 65, 65, 134, 114, 70, 60, 50, 178, GrowthRate.MEDIUM_FAST, null, false, false, new PokemonForm("Phony Form", "phony", Type.GHOST, null, 0.2, 0.4, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 508, 60, 65, 65, 134, 114, 70, 60, 50, 178, false, ""), @@ -2261,15 +2280,15 @@ export function initSpecies() { new PokemonSpecies(Species.RUNERIGUS, 8, false, false, false, "Grudge Pokémon", Type.GROUND, Type.GHOST, 1.6, 66.6, Abilities.WANDERING_SPIRIT, Abilities.NONE, Abilities.NONE, 483, 58, 95, 145, 50, 105, 30, 90, 50, 169, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.MILCERY, 8, false, false, false, "Cream Pokémon", Type.FAIRY, null, 0.2, 0.3, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 270, 45, 40, 40, 50, 61, 34, 200, 50, 54, GrowthRate.MEDIUM_FAST, 0, false), new PokemonSpecies(Species.ALCREMIE, 8, false, false, false, "Cream Pokémon", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, GrowthRate.MEDIUM_FAST, 0, false, true, - new PokemonForm("Vanilla Cream", "vanilla-cream", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, ""), - new PokemonForm("Ruby Cream", "ruby-cream", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false), - new PokemonForm("Matcha Cream", "matcha-cream", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false), - new PokemonForm("Mint Cream", "mint-cream", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false), - new PokemonForm("Lemon Cream", "lemon-cream", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false), - new PokemonForm("Salted Cream", "salted-cream", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false), - new PokemonForm("Ruby Swirl", "ruby-swirl", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false), - new PokemonForm("Caramel Swirl", "caramel-swirl", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false), - new PokemonForm("Rainbow Swirl", "rainbow-swirl", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false), + new PokemonForm("Vanilla Cream", "vanilla-cream", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, "", true), + new PokemonForm("Ruby Cream", "ruby-cream", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), + new PokemonForm("Matcha Cream", "matcha-cream", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), + new PokemonForm("Mint Cream", "mint-cream", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), + new PokemonForm("Lemon Cream", "lemon-cream", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), + new PokemonForm("Salted Cream", "salted-cream", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), + new PokemonForm("Ruby Swirl", "ruby-swirl", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), + new PokemonForm("Caramel Swirl", "caramel-swirl", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), + new PokemonForm("Rainbow Swirl", "rainbow-swirl", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.FAIRY, null, 30, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 595, 80, 70, 85, 140, 150, 65, 100, 50, 173), ), new PokemonSpecies(Species.FALINKS, 8, false, false, false, "Formation Pokémon", Type.FIGHTING, null, 3, 62, Abilities.BATTLE_ARMOR, Abilities.NONE, Abilities.DEFIANT, 470, 65, 100, 100, 70, 60, 75, 45, 50, 165, GrowthRate.MEDIUM_FAST, null, false), @@ -2282,8 +2301,8 @@ export function initSpecies() { new PokemonForm("No Ice", "no-ice", Type.ICE, null, 1.4, 89, Abilities.ICE_FACE, Abilities.NONE, Abilities.NONE, 470, 75, 80, 70, 65, 50, 130, 60, 50, 165), ), new PokemonSpecies(Species.INDEEDEE, 8, false, false, false, "Emotion Pokémon", Type.PSYCHIC, Type.NORMAL, 0.9, 28, Abilities.INNER_FOCUS, Abilities.SYNCHRONIZE, Abilities.PSYCHIC_SURGE, 475, 60, 65, 55, 105, 95, 95, 30, 140, 166, GrowthRate.FAST, 50, false, false, - new PokemonForm("Male", "male", Type.PSYCHIC, Type.NORMAL, 0.9, 28, Abilities.INNER_FOCUS, Abilities.SYNCHRONIZE, Abilities.PSYCHIC_SURGE, 475, 60, 65, 55, 105, 95, 95, 30, 140, 166, false, ""), - new PokemonForm("Female", "female", Type.PSYCHIC, Type.NORMAL, 0.9, 28, Abilities.OWN_TEMPO, Abilities.SYNCHRONIZE, Abilities.PSYCHIC_SURGE, 475, 70, 55, 65, 95, 105, 85, 30, 140, 166), + new PokemonForm("Male", "male", Type.PSYCHIC, Type.NORMAL, 0.9, 28, Abilities.INNER_FOCUS, Abilities.SYNCHRONIZE, Abilities.PSYCHIC_SURGE, 475, 60, 65, 55, 105, 95, 95, 30, 140, 166, false, "", true), + new PokemonForm("Female", "female", Type.PSYCHIC, Type.NORMAL, 0.9, 28, Abilities.OWN_TEMPO, Abilities.SYNCHRONIZE, Abilities.PSYCHIC_SURGE, 475, 70, 55, 65, 95, 105, 85, 30, 140, 166, false, null, true), ), new PokemonSpecies(Species.MORPEKO, 8, false, false, false, "Two-Sided Pokémon", Type.ELECTRIC, Type.DARK, 0.3, 3, Abilities.HUNGER_SWITCH, Abilities.NONE, Abilities.NONE, 436, 58, 95, 58, 70, 58, 97, 180, 50, 153, GrowthRate.MEDIUM_FAST, 50, false, false, new PokemonForm("Full Belly Mode", "full-belly", Type.ELECTRIC, Type.DARK, 0.3, 3, Abilities.HUNGER_SWITCH, Abilities.NONE, Abilities.NONE, 436, 58, 95, 58, 70, 58, 97, 180, 50, 153, false, ""), @@ -2306,11 +2325,11 @@ export function initSpecies() { new PokemonSpecies(Species.DRAKLOAK, 8, false, false, false, "Caretaker Pokémon", Type.DRAGON, Type.GHOST, 1.4, 11, Abilities.CLEAR_BODY, Abilities.INFILTRATOR, Abilities.CURSED_BODY, 410, 68, 80, 50, 60, 50, 102, 45, 50, 144, GrowthRate.SLOW, 50, false), new PokemonSpecies(Species.DRAGAPULT, 8, false, false, false, "Stealth Pokémon", Type.DRAGON, Type.GHOST, 3, 50, Abilities.CLEAR_BODY, Abilities.INFILTRATOR, Abilities.CURSED_BODY, 600, 88, 120, 75, 100, 75, 142, 45, 50, 300, GrowthRate.SLOW, 50, false), new PokemonSpecies(Species.ZACIAN, 8, false, true, false, "Warrior Pokémon", Type.FAIRY, null, 2.8, 110, Abilities.INTREPID_SWORD, Abilities.NONE, Abilities.NONE, 660, 92, 120, 115, 80, 115, 138, 10, 0, 335, GrowthRate.SLOW, null, false, false, - new PokemonForm("Hero of Many Battles", "hero", Type.FAIRY, null, 2.8, 110, Abilities.INTREPID_SWORD, Abilities.NONE, Abilities.NONE, 660, 92, 120, 115, 80, 115, 138, 10, 0, 335, false, ""), + new PokemonForm("Hero of Many Battles", "hero", Type.FAIRY, null, 2.8, 110, Abilities.INTREPID_SWORD, Abilities.NONE, Abilities.NONE, 660, 92, 120, 115, 80, 115, 138, 10, 0, 335, false, "", true), new PokemonForm("Crowned", "crowned", Type.FAIRY, Type.STEEL, 2.8, 355, Abilities.INTREPID_SWORD, Abilities.NONE, Abilities.NONE, 700, 92, 150, 115, 80, 115, 148, 10, 0, 335), ), new PokemonSpecies(Species.ZAMAZENTA, 8, false, true, false, "Warrior Pokémon", Type.FIGHTING, null, 2.9, 210, Abilities.DAUNTLESS_SHIELD, Abilities.NONE, Abilities.NONE, 660, 92, 120, 115, 80, 115, 138, 10, 0, 335, GrowthRate.SLOW, null, false, false, - new PokemonForm("Hero of Many Battles", "hero", Type.FIGHTING, null, 2.9, 210, Abilities.DAUNTLESS_SHIELD, Abilities.NONE, Abilities.NONE, 660, 92, 120, 115, 80, 115, 138, 10, 0, 335, false, ""), + new PokemonForm("Hero of Many Battles", "hero", Type.FIGHTING, null, 2.9, 210, Abilities.DAUNTLESS_SHIELD, Abilities.NONE, Abilities.NONE, 660, 92, 120, 115, 80, 115, 138, 10, 0, 335, false, "", true), new PokemonForm("Crowned", "crowned", Type.FIGHTING, Type.STEEL, 2.9, 785, Abilities.DAUNTLESS_SHIELD, Abilities.NONE, Abilities.NONE, 700, 92, 120, 140, 80, 140, 128, 10, 0, 335), ), new PokemonSpecies(Species.ETERNATUS, 8, false, true, false, "Gigantic Pokémon", Type.POISON, Type.DRAGON, 20, 950, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 690, 140, 85, 95, 145, 95, 130, 255, 0, 345, GrowthRate.SLOW, null, false, true, @@ -2325,8 +2344,8 @@ export function initSpecies() { new PokemonForm("G-Max Rapid Strike Style", SpeciesFormKey.GIGANTAMAX_RAPID, Type.FIGHTING, Type.WATER, 26, 105, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 650, 125, 160, 120, 75, 70, 100, 3, 50, 275), ), new PokemonSpecies(Species.ZARUDE, 8, false, false, true, "Rogue Monkey Pokémon", Type.DARK, Type.GRASS, 1.8, 70, Abilities.LEAF_GUARD, Abilities.NONE, Abilities.NONE, 600, 105, 120, 105, 70, 95, 105, 3, 0, 300, GrowthRate.SLOW, null, false, false, - new PokemonForm("Normal", "", Type.DARK, Type.GRASS, 1.8, 70, Abilities.LEAF_GUARD, Abilities.NONE, Abilities.NONE, 600, 105, 120, 105, 70, 95, 105, 3, 0, 300), - new PokemonForm("Dada", "dada", Type.DARK, Type.GRASS, 1.8, 70, Abilities.LEAF_GUARD, Abilities.NONE, Abilities.NONE, 600, 105, 120, 105, 70, 95, 105, 3, 0, 300), + new PokemonForm("Normal", "", Type.DARK, Type.GRASS, 1.8, 70, Abilities.LEAF_GUARD, Abilities.NONE, Abilities.NONE, 600, 105, 120, 105, 70, 95, 105, 3, 0, 300, false, null, true), + new PokemonForm("Dada", "dada", Type.DARK, Type.GRASS, 1.8, 70, Abilities.LEAF_GUARD, Abilities.NONE, Abilities.NONE, 600, 105, 120, 105, 70, 95, 105, 3, 0, 300, false, null, true), ), new PokemonSpecies(Species.REGIELEKI, 8, true, false, false, "Electron Pokémon", Type.ELECTRIC, null, 1.2, 145, Abilities.TRANSISTOR, Abilities.NONE, Abilities.NONE, 580, 80, 100, 50, 100, 50, 200, 3, 35, 290, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.REGIDRAGO, 8, true, false, false, "Dragon Orb Pokémon", Type.DRAGON, null, 2.1, 200, Abilities.DRAGONS_MAW, Abilities.NONE, Abilities.NONE, 580, 200, 100, 50, 100, 50, 80, 3, 35, 290, GrowthRate.SLOW, null, false), @@ -2341,13 +2360,13 @@ export function initSpecies() { new PokemonSpecies(Species.KLEAVOR, 8, false, false, false, "Axe Pokémon", Type.BUG, Type.ROCK, 1.8, 89, Abilities.SWARM, Abilities.SHEER_FORCE, Abilities.SHARPNESS, 500, 70, 135, 95, 45, 70, 85, 115, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.URSALUNA, 8, false, false, false, "Peat Pokémon", Type.GROUND, Type.NORMAL, 2.4, 290, Abilities.GUTS, Abilities.BULLETPROOF, Abilities.UNNERVE, 550, 130, 140, 105, 45, 80, 50, 75, 50, 275, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.BASCULEGION, 8, false, false, false, "Big Fish Pokémon", Type.WATER, Type.GHOST, 3, 110, Abilities.SWIFT_SWIM, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 530, 120, 112, 65, 80, 75, 78, 135, 50, 265, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Male", "male", Type.WATER, Type.GHOST, 3, 110, Abilities.SWIFT_SWIM, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 530, 120, 112, 65, 80, 75, 78, 135, 50, 265, false, ""), - new PokemonForm("Female", "female", Type.WATER, Type.GHOST, 3, 110, Abilities.SWIFT_SWIM, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 530, 120, 92, 65, 100, 75, 78, 135, 50, 265), + new PokemonForm("Male", "male", Type.WATER, Type.GHOST, 3, 110, Abilities.SWIFT_SWIM, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 530, 120, 112, 65, 80, 75, 78, 135, 50, 265, false, "", true), + new PokemonForm("Female", "female", Type.WATER, Type.GHOST, 3, 110, Abilities.SWIFT_SWIM, Abilities.ADAPTABILITY, Abilities.MOLD_BREAKER, 530, 120, 92, 65, 100, 75, 78, 135, 50, 265, false, null, true), ), new PokemonSpecies(Species.SNEASLER, 8, false, false, false, "Free Climb Pokémon", Type.FIGHTING, Type.POISON, 1.3, 43, Abilities.PRESSURE, Abilities.UNBURDEN, Abilities.POISON_TOUCH, 510, 80, 130, 60, 40, 80, 120, 135, 50, 102, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.OVERQWIL, 8, false, false, false, "Pin Cluster Pokémon", Type.DARK, Type.POISON, 2.5, 60.5, Abilities.POISON_POINT, Abilities.SWIFT_SWIM, Abilities.INTIMIDATE, 510, 85, 115, 95, 65, 65, 85, 135, 50, 179, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.ENAMORUS, 8, true, false, false, "Love-Hate Pokémon", Type.FAIRY, Type.FLYING, 1.6, 48, Abilities.CUTE_CHARM, Abilities.NONE, Abilities.CONTRARY, 580, 74, 115, 70, 135, 80, 106, 3, 50, 116, GrowthRate.SLOW, 0, false, true, - new PokemonForm("Incarnate Forme", "incarnate", Type.FAIRY, Type.FLYING, 1.6, 48, Abilities.CUTE_CHARM, Abilities.NONE, Abilities.CONTRARY, 580, 74, 115, 70, 135, 80, 106, 3, 50, 116), + new PokemonForm("Incarnate Forme", "incarnate", Type.FAIRY, Type.FLYING, 1.6, 48, Abilities.CUTE_CHARM, Abilities.NONE, Abilities.CONTRARY, 580, 74, 115, 70, 135, 80, 106, 3, 50, 116, false, null, true), new PokemonForm("Therian Forme", "therian", Type.FAIRY, Type.FLYING, 1.6, 48, Abilities.OVERCOAT, Abilities.NONE, Abilities.OVERCOAT, 580, 74, 115, 110, 135, 100, 46, 3, 50, 116), ), new PokemonSpecies(Species.SPRIGATITO, 9, false, false, false, "Grass Cat Pokémon", Type.GRASS, null, 0.4, 4.1, Abilities.OVERGROW, Abilities.NONE, Abilities.PROTEAN, 310, 40, 61, 54, 45, 45, 65, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), @@ -2382,10 +2401,10 @@ export function initSpecies() { new PokemonSpecies(Species.DOLLIV, 9, false, false, false, "Olive Pokémon", Type.GRASS, Type.NORMAL, 0.6, 11.9, Abilities.EARLY_BIRD, Abilities.NONE, Abilities.HARVEST, 354, 52, 53, 60, 78, 78, 33, 120, 50, 124, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.ARBOLIVA, 9, false, false, false, "Olive Pokémon", Type.GRASS, Type.NORMAL, 1.4, 48.2, Abilities.SEED_SOWER, Abilities.NONE, Abilities.HARVEST, 510, 78, 69, 90, 125, 109, 39, 45, 50, 255, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.SQUAWKABILLY, 9, false, false, false, "Parrot Pokémon", Type.NORMAL, Type.FLYING, 0.6, 2.4, Abilities.INTIMIDATE, Abilities.HUSTLE, Abilities.GUTS, 417, 82, 96, 51, 45, 51, 92, 190, 50, 146, GrowthRate.ERRATIC, 50, false, false, - new PokemonForm("Green Plumage", "green-plumage", Type.NORMAL, Type.FLYING, 0.6, 2.4, Abilities.INTIMIDATE, Abilities.HUSTLE, Abilities.GUTS, 417, 82, 96, 51, 45, 51, 92, 190, 50, 146), - new PokemonForm("Blue Plumage", "blue-plumage", Type.NORMAL, Type.FLYING, 0.6, 2.4, Abilities.INTIMIDATE, Abilities.HUSTLE, Abilities.GUTS, 417, 82, 96, 51, 45, 51, 92, 190, 50, 146), - new PokemonForm("Yellow Plumage", "yellow-plumage", Type.NORMAL, Type.FLYING, 0.6, 2.4, Abilities.INTIMIDATE, Abilities.HUSTLE, Abilities.SHEER_FORCE, 417, 82, 96, 51, 45, 51, 92, 190, 50, 146), - new PokemonForm("White Plumage", "white-plumage", Type.NORMAL, Type.FLYING, 0.6, 2.4, Abilities.INTIMIDATE, Abilities.HUSTLE, Abilities.SHEER_FORCE, 417, 82, 96, 51, 45, 51, 92, 190, 50, 146), + new PokemonForm("Green Plumage", "green-plumage", Type.NORMAL, Type.FLYING, 0.6, 2.4, Abilities.INTIMIDATE, Abilities.HUSTLE, Abilities.GUTS, 417, 82, 96, 51, 45, 51, 92, 190, 50, 146, false, null, true), + new PokemonForm("Blue Plumage", "blue-plumage", Type.NORMAL, Type.FLYING, 0.6, 2.4, Abilities.INTIMIDATE, Abilities.HUSTLE, Abilities.GUTS, 417, 82, 96, 51, 45, 51, 92, 190, 50, 146, false, null, true), + new PokemonForm("Yellow Plumage", "yellow-plumage", Type.NORMAL, Type.FLYING, 0.6, 2.4, Abilities.INTIMIDATE, Abilities.HUSTLE, Abilities.SHEER_FORCE, 417, 82, 96, 51, 45, 51, 92, 190, 50, 146, false, null, true), + new PokemonForm("White Plumage", "white-plumage", Type.NORMAL, Type.FLYING, 0.6, 2.4, Abilities.INTIMIDATE, Abilities.HUSTLE, Abilities.SHEER_FORCE, 417, 82, 96, 51, 45, 51, 92, 190, 50, 146, false, null, true), ), new PokemonSpecies(Species.NACLI, 9, false, false, false, "Rock Salt Pokémon", Type.ROCK, null, 0.4, 16, Abilities.PURIFYING_SALT, Abilities.STURDY, Abilities.CLEAR_BODY, 280, 55, 55, 75, 35, 35, 25, 255, 50, 56, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.NACLSTACK, 9, false, false, false, "Rock Salt Pokémon", Type.ROCK, null, 0.6, 105, Abilities.PURIFYING_SALT, Abilities.STURDY, Abilities.CLEAR_BODY, 355, 60, 60, 100, 35, 65, 35, 120, 50, 124, GrowthRate.MEDIUM_SLOW, 50, false), @@ -2420,8 +2439,8 @@ export function initSpecies() { new PokemonSpecies(Species.BOMBIRDIER, 9, false, false, false, "Item Drop Pokémon", Type.FLYING, Type.DARK, 1.5, 42.9, Abilities.BIG_PECKS, Abilities.KEEN_EYE, Abilities.ROCKY_PAYLOAD, 485, 70, 103, 85, 60, 85, 82, 25, 50, 243, GrowthRate.SLOW, 50, false), new PokemonSpecies(Species.FINIZEN, 9, false, false, false, "Dolphin Pokémon", Type.WATER, null, 1.3, 60.2, Abilities.WATER_VEIL, Abilities.NONE, Abilities.NONE, 315, 70, 45, 40, 45, 40, 75, 200, 50, 63, GrowthRate.SLOW, 50, false), new PokemonSpecies(Species.PALAFIN, 9, false, false, false, "Dolphin Pokémon", Type.WATER, null, 1.3, 60.2, Abilities.ZERO_TO_HERO, Abilities.NONE, Abilities.NONE, 457, 100, 70, 72, 53, 62, 100, 45, 50, 160, GrowthRate.SLOW, 50, false, false, - new PokemonForm("Zero Form", "zero", Type.WATER, null, 1.3, 60.2, Abilities.ZERO_TO_HERO, Abilities.NONE, Abilities.ZERO_TO_HERO, 457, 100, 70, 72, 53, 62, 100, 45, 50, 160), - new PokemonForm("Hero Form", "hero", Type.WATER, null, 1.8, 97.4, Abilities.ZERO_TO_HERO, Abilities.NONE, Abilities.ZERO_TO_HERO, 650, 100, 160, 97, 106, 87, 100, 45, 50, 160), + new PokemonForm("Zero Form", "zero", Type.WATER, null, 1.3, 60.2, Abilities.ZERO_TO_HERO, Abilities.NONE, Abilities.ZERO_TO_HERO, 457, 100, 70, 72, 53, 62, 100, 45, 50, 160, false, null, true), + new PokemonForm("Hero Form", "hero", Type.WATER, null, 1.8, 97.4, Abilities.ZERO_TO_HERO, Abilities.NONE, Abilities.ZERO_TO_HERO, 650, 100, 160, 97, 106, 87, 100, 45, 50, 160, false, null, true), ), new PokemonSpecies(Species.VAROOM, 9, false, false, false, "Single-Cyl Pokémon", Type.STEEL, Type.POISON, 1, 35, Abilities.OVERCOAT, Abilities.NONE, Abilities.SLOW_START, 300, 45, 70, 63, 30, 45, 47, 190, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.REVAVROOM, 9, false, false, false, "Multi-Cyl Pokémon", Type.STEEL, Type.POISON, 1.8, 120, Abilities.OVERCOAT, Abilities.NONE, Abilities.FILTER, 500, 80, 119, 90, 54, 67, 90, 75, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), @@ -2437,9 +2456,9 @@ export function initSpecies() { new PokemonSpecies(Species.VELUZA, 9, false, false, false, "Jettison Pokémon", Type.WATER, Type.PSYCHIC, 2.5, 90, Abilities.MOLD_BREAKER, Abilities.NONE, Abilities.SHARPNESS, 478, 90, 102, 73, 78, 65, 70, 100, 50, 167, GrowthRate.FAST, 50, false), new PokemonSpecies(Species.DONDOZO, 9, false, false, false, "Big Catfish Pokémon", Type.WATER, null, 12, 220, Abilities.UNAWARE, Abilities.OBLIVIOUS, Abilities.WATER_VEIL, 530, 150, 100, 115, 65, 65, 35, 25, 50, 265, GrowthRate.SLOW, 50, false), new PokemonSpecies(Species.TATSUGIRI, 9, false, false, false, "Mimicry Pokémon", Type.DRAGON, Type.WATER, 0.3, 8, Abilities.COMMANDER, Abilities.NONE, Abilities.STORM_DRAIN, 475, 68, 50, 60, 120, 95, 82, 100, 50, 166, GrowthRate.MEDIUM_SLOW, 50, false, false, - new PokemonForm("Curly Form", "curly", Type.DRAGON, Type.WATER, 0.3, 8, Abilities.COMMANDER, Abilities.NONE, Abilities.STORM_DRAIN, 475, 68, 50, 60, 120, 95, 82, 100, 50, 166), - new PokemonForm("Droopy Form", "droopy", Type.DRAGON, Type.WATER, 0.3, 8, Abilities.COMMANDER, Abilities.NONE, Abilities.STORM_DRAIN, 475, 68, 50, 60, 120, 95, 82, 100, 50, 166), - new PokemonForm("Stretchy Form", "stretchy", Type.DRAGON, Type.WATER, 0.3, 8, Abilities.COMMANDER, Abilities.NONE, Abilities.STORM_DRAIN, 475, 68, 50, 60, 120, 95, 82, 100, 50, 166), + new PokemonForm("Curly Form", "curly", Type.DRAGON, Type.WATER, 0.3, 8, Abilities.COMMANDER, Abilities.NONE, Abilities.STORM_DRAIN, 475, 68, 50, 60, 120, 95, 82, 100, 50, 166, false, null, true), + new PokemonForm("Droopy Form", "droopy", Type.DRAGON, Type.WATER, 0.3, 8, Abilities.COMMANDER, Abilities.NONE, Abilities.STORM_DRAIN, 475, 68, 50, 60, 120, 95, 82, 100, 50, 166, false, null, true), + new PokemonForm("Stretchy Form", "stretchy", Type.DRAGON, Type.WATER, 0.3, 8, Abilities.COMMANDER, Abilities.NONE, Abilities.STORM_DRAIN, 475, 68, 50, 60, 120, 95, 82, 100, 50, 166, false, null, true), ), new PokemonSpecies(Species.ANNIHILAPE, 9, false, false, false, "Rage Monkey Pokémon", Type.FIGHTING, Type.GHOST, 1.2, 56, Abilities.VITAL_SPIRIT, Abilities.INNER_FOCUS, Abilities.DEFIANT, 535, 110, 115, 80, 50, 90, 90, 45, 50, 268, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.CLODSIRE, 9, false, false, false, "Spiny Fish Pokémon", Type.POISON, Type.GROUND, 1.8, 223, Abilities.POISON_POINT, Abilities.WATER_ABSORB, Abilities.UNAWARE, 430, 130, 75, 60, 45, 100, 20, 90, 50, 151, GrowthRate.MEDIUM_FAST, 50, false), @@ -2465,8 +2484,8 @@ export function initSpecies() { new PokemonSpecies(Species.ARCTIBAX, 9, false, false, false, "Ice Fin Pokémon", Type.DRAGON, Type.ICE, 0.8, 30, Abilities.THERMAL_EXCHANGE, Abilities.NONE, Abilities.ICE_BODY, 423, 90, 95, 66, 45, 65, 62, 25, 50, 148, GrowthRate.SLOW, 50, false), new PokemonSpecies(Species.BAXCALIBUR, 9, false, false, false, "Ice Dragon Pokémon", Type.DRAGON, Type.ICE, 2.1, 210, Abilities.THERMAL_EXCHANGE, Abilities.NONE, Abilities.ICE_BODY, 600, 115, 145, 92, 75, 86, 87, 10, 50, 300, GrowthRate.SLOW, 50, false), new PokemonSpecies(Species.GIMMIGHOUL, 9, false, false, false, "Coin Chest Pokémon", Type.GHOST, null, 0.3, 5, Abilities.RATTLED, Abilities.NONE, Abilities.NONE, 300, 45, 30, 70, 75, 70, 10, 45, 50, 60, GrowthRate.SLOW, null, false, false, - new PokemonForm("Chest Form", "chest", Type.GHOST, null, 0.3, 5, Abilities.RATTLED, Abilities.NONE, Abilities.NONE, 300, 45, 30, 70, 75, 70, 10, 45, 50, 60, false, ""), - new PokemonForm("Roaming Form", "roaming", Type.GHOST, null, 0.1, 1, Abilities.RUN_AWAY, Abilities.NONE, Abilities.NONE, 300, 45, 30, 25, 75, 45, 80, 45, 50, 60), + new PokemonForm("Chest Form", "chest", Type.GHOST, null, 0.3, 5, Abilities.RATTLED, Abilities.NONE, Abilities.NONE, 300, 45, 30, 70, 75, 70, 10, 45, 50, 60, false, "", true), + new PokemonForm("Roaming Form", "roaming", Type.GHOST, null, 0.1, 1, Abilities.RUN_AWAY, Abilities.NONE, Abilities.NONE, 300, 45, 30, 25, 75, 45, 80, 45, 50, 60, false, null, true), ), new PokemonSpecies(Species.GHOLDENGO, 9, false, false, false, "Coin Entity Pokémon", Type.STEEL, Type.GHOST, 1.2, 30, Abilities.GOOD_AS_GOLD, Abilities.NONE, Abilities.NONE, 550, 87, 60, 95, 133, 91, 84, 45, 50, 275, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.WO_CHIEN, 9, true, false, false, "Ruinous Pokémon", Type.DARK, Type.GRASS, 1.5, 74.2, Abilities.TABLETS_OF_RUIN, Abilities.NONE, Abilities.NONE, 570, 85, 85, 100, 95, 135, 70, 6, 0, 285, GrowthRate.SLOW, null, false), @@ -2476,25 +2495,25 @@ export function initSpecies() { new PokemonSpecies(Species.ROARING_MOON, 9, false, false, false, "Paradox Pokémon", Type.DRAGON, Type.DARK, 2, 380, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 590, 105, 139, 71, 55, 101, 119, 10, 0, 295, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.IRON_VALIANT, 9, false, false, false, "Paradox Pokémon", Type.FAIRY, Type.FIGHTING, 1.4, 35, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 590, 74, 130, 90, 120, 60, 116, 10, 0, 295, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.KORAIDON, 9, false, true, false, "Paradox Pokémon", Type.FIGHTING, Type.DRAGON, 2.5, 303, Abilities.ORICHALCUM_PULSE, Abilities.NONE, Abilities.NONE, 670, 100, 135, 115, 85, 100, 135, 3, 0, 335, GrowthRate.SLOW, null, false, false, - new PokemonForm("Apex Build", "apex-build", Type.FIGHTING, Type.DRAGON, 2.5, 303, Abilities.ORICHALCUM_PULSE, Abilities.NONE, Abilities.NONE, 670, 100, 135, 115, 85, 100, 135, 3, 0, 335), - new PokemonForm("Limited Build", "limited-build", Type.FIGHTING, Type.DRAGON, 3.5, 303, Abilities.ORICHALCUM_PULSE, Abilities.NONE, Abilities.NONE, 670, 100, 135, 115, 85, 100, 135, 3, 0, 335), - new PokemonForm("Sprinting Build", "sprinting-build", Type.FIGHTING, Type.DRAGON, 3.5, 303, Abilities.ORICHALCUM_PULSE, Abilities.NONE, Abilities.NONE, 670, 100, 135, 115, 85, 100, 135, 3, 0, 335), - new PokemonForm("Swimming Build", "swimming-build", Type.FIGHTING, Type.DRAGON, 3.5, 303, Abilities.ORICHALCUM_PULSE, Abilities.NONE, Abilities.NONE, 670, 100, 135, 115, 85, 100, 135, 3, 0, 335), - new PokemonForm("Gliding Build", "gliding-build", Type.FIGHTING, Type.DRAGON, 3.5, 303, Abilities.ORICHALCUM_PULSE, Abilities.NONE, Abilities.NONE, 670, 100, 135, 115, 85, 100, 135, 3, 0, 335), + new PokemonForm("Apex Build", "apex-build", Type.FIGHTING, Type.DRAGON, 2.5, 303, Abilities.ORICHALCUM_PULSE, Abilities.NONE, Abilities.NONE, 670, 100, 135, 115, 85, 100, 135, 3, 0, 335, false, null, true), + new PokemonForm("Limited Build", "limited-build", Type.FIGHTING, Type.DRAGON, 3.5, 303, Abilities.ORICHALCUM_PULSE, Abilities.NONE, Abilities.NONE, 670, 100, 135, 115, 85, 100, 135, 3, 0, 335, false, null, true), + new PokemonForm("Sprinting Build", "sprinting-build", Type.FIGHTING, Type.DRAGON, 3.5, 303, Abilities.ORICHALCUM_PULSE, Abilities.NONE, Abilities.NONE, 670, 100, 135, 115, 85, 100, 135, 3, 0, 335, false, null, true), + new PokemonForm("Swimming Build", "swimming-build", Type.FIGHTING, Type.DRAGON, 3.5, 303, Abilities.ORICHALCUM_PULSE, Abilities.NONE, Abilities.NONE, 670, 100, 135, 115, 85, 100, 135, 3, 0, 335, false, null, true), + new PokemonForm("Gliding Build", "gliding-build", Type.FIGHTING, Type.DRAGON, 3.5, 303, Abilities.ORICHALCUM_PULSE, Abilities.NONE, Abilities.NONE, 670, 100, 135, 115, 85, 100, 135, 3, 0, 335, false, null, true), ), new PokemonSpecies(Species.MIRAIDON, 9, false, true, false, "Paradox Pokémon", Type.ELECTRIC, Type.DRAGON, 3.5, 240, Abilities.HADRON_ENGINE, Abilities.NONE, Abilities.NONE, 670, 100, 85, 100, 135, 115, 135, 3, 0, 335, GrowthRate.SLOW, null, false, false, - new PokemonForm("Ultimate Mode", "ultimate-mode", Type.ELECTRIC, Type.DRAGON, 3.5, 240, Abilities.HADRON_ENGINE, Abilities.NONE, Abilities.NONE, 670, 100, 85, 100, 135, 115, 135, 3, 0, 335), - new PokemonForm("Low-Power Mode", "low-power-mode", Type.ELECTRIC, Type.DRAGON, 2.8, 240, Abilities.HADRON_ENGINE, Abilities.NONE, Abilities.NONE, 670, 100, 85, 100, 135, 115, 135, 3, 0, 335), - new PokemonForm("Drive Mode", "drive-mode", Type.ELECTRIC, Type.DRAGON, 2.8, 240, Abilities.HADRON_ENGINE, Abilities.NONE, Abilities.NONE, 670, 100, 85, 100, 135, 115, 135, 3, 0, 335), - new PokemonForm("Aquatic Mode", "aquatic-mode", Type.ELECTRIC, Type.DRAGON, 2.8, 240, Abilities.HADRON_ENGINE, Abilities.NONE, Abilities.NONE, 670, 100, 85, 100, 135, 115, 135, 3, 0, 335), - new PokemonForm("Glide Mode", "glide-mode", Type.ELECTRIC, Type.DRAGON, 2.8, 240, Abilities.HADRON_ENGINE, Abilities.NONE, Abilities.NONE, 670, 100, 85, 100, 135, 115, 135, 3, 0, 335), + new PokemonForm("Ultimate Mode", "ultimate-mode", Type.ELECTRIC, Type.DRAGON, 3.5, 240, Abilities.HADRON_ENGINE, Abilities.NONE, Abilities.NONE, 670, 100, 85, 100, 135, 115, 135, 3, 0, 335, false, null, true), + new PokemonForm("Low-Power Mode", "low-power-mode", Type.ELECTRIC, Type.DRAGON, 2.8, 240, Abilities.HADRON_ENGINE, Abilities.NONE, Abilities.NONE, 670, 100, 85, 100, 135, 115, 135, 3, 0, 335, false, null, true), + new PokemonForm("Drive Mode", "drive-mode", Type.ELECTRIC, Type.DRAGON, 2.8, 240, Abilities.HADRON_ENGINE, Abilities.NONE, Abilities.NONE, 670, 100, 85, 100, 135, 115, 135, 3, 0, 335, false, null, true), + new PokemonForm("Aquatic Mode", "aquatic-mode", Type.ELECTRIC, Type.DRAGON, 2.8, 240, Abilities.HADRON_ENGINE, Abilities.NONE, Abilities.NONE, 670, 100, 85, 100, 135, 115, 135, 3, 0, 335, false, null, true), + new PokemonForm("Glide Mode", "glide-mode", Type.ELECTRIC, Type.DRAGON, 2.8, 240, Abilities.HADRON_ENGINE, Abilities.NONE, Abilities.NONE, 670, 100, 85, 100, 135, 115, 135, 3, 0, 335, false, null, true), ), new PokemonSpecies(Species.WALKING_WAKE, 9, false, false, false, "Paradox Pokémon", Type.WATER, Type.DRAGON, 3.5, 280, Abilities.PROTOSYNTHESIS, Abilities.NONE, Abilities.NONE, 590, 99, 83, 91, 125, 83, 109, 5, 0, 295, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.IRON_LEAVES, 9, false, false, false, "Paradox Pokémon", Type.GRASS, Type.PSYCHIC, 1.5, 125, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 590, 90, 130, 88, 70, 108, 104, 5, 0, 295, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.DIPPLIN, 9, false, false, false, "Candy Apple Pokémon", Type.GRASS, Type.DRAGON, 0.4, 9.7, Abilities.SUPERSWEET_SYRUP, Abilities.GLUTTONY, Abilities.STICKY_HOLD, 485, 80, 80, 110, 95, 80, 40, 45, 50, 170, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.POLTCHAGEIST, 9, false, false, false, "Matcha Pokémon", Type.GRASS, Type.GHOST, 0.1, 1.1, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, GrowthRate.SLOW, null, false, false, - new PokemonForm("Counterfeit Form", "counterfeit", Type.GRASS, Type.GHOST, 0.1, 1.1, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62), - new PokemonForm("Artisan Form", "artisan", Type.GRASS, Type.GHOST, 0.1, 1.1, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62), + new PokemonForm("Counterfeit Form", "counterfeit", Type.GRASS, Type.GHOST, 0.1, 1.1, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, null, true), + new PokemonForm("Artisan Form", "artisan", Type.GRASS, Type.GHOST, 0.1, 1.1, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, null, true), ), new PokemonSpecies(Species.SINISTCHA, 9, false, false, false, "Matcha Pokémon", Type.GRASS, Type.GHOST, 0.2, 2.2, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 508, 71, 60, 106, 121, 80, 70, 60, 50, 178, GrowthRate.SLOW, null, false, false, new PokemonForm("Unremarkable Form", "unremarkable", Type.GRASS, Type.GHOST, 0.2, 2.2, Abilities.HOSPITALITY, Abilities.NONE, Abilities.HEATPROOF, 508, 71, 60, 106, 121, 80, 70, 60, 50, 178), @@ -2504,7 +2523,7 @@ export function initSpecies() { new PokemonSpecies(Species.MUNKIDORI, 9, true, false, false, "Retainer Pokémon", Type.POISON, Type.PSYCHIC, 1, 12.2, Abilities.TOXIC_CHAIN, Abilities.NONE, Abilities.FRISK, 555, 88, 75, 66, 130, 90, 106, 3, 0, 276, GrowthRate.SLOW, 100, false), new PokemonSpecies(Species.FEZANDIPITI, 9, true, false, false, "Retainer Pokémon", Type.POISON, Type.FAIRY, 1.4, 30.1, Abilities.TOXIC_CHAIN, Abilities.NONE, Abilities.TECHNICIAN, 555, 88, 91, 82, 70, 125, 99, 3, 0, 276, GrowthRate.SLOW, 100, false), new PokemonSpecies(Species.OGERPON, 9, true, false, false, "Mask Pokémon", Type.GRASS, null, 1.2, 39.8, Abilities.DEFIANT, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275, GrowthRate.SLOW, 0, false, false, - new PokemonForm("Teal Mask", "teal-mask", Type.GRASS, null, 1.2, 39.8, Abilities.DEFIANT, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), + new PokemonForm("Teal Mask", "teal-mask", Type.GRASS, null, 1.2, 39.8, Abilities.DEFIANT, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275, false, null, true), new PokemonForm("Wellspring Mask", "wellspring-mask", Type.GRASS, Type.WATER, 1.2, 39.8, Abilities.WATER_ABSORB, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), new PokemonForm("Hearthflame Mask", "hearthflame-mask", Type.GRASS, Type.FIRE, 1.2, 39.8, Abilities.MOLD_BREAKER, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), new PokemonForm("Cornerstone Mask", "cornerstone-mask", Type.GRASS, Type.ROCK, 1.2, 39.8, Abilities.STURDY, Abilities.NONE, Abilities.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), @@ -2583,9 +2602,9 @@ export function initSpecies() { new PokemonSpecies(Species.HISUI_AVALUGG, 8, false, false, false, "Iceberg Pokémon", Type.ICE, Type.ROCK, 1.4, 262.4, Abilities.STRONG_JAW, Abilities.ICE_BODY, Abilities.STURDY, 514, 95, 127, 184, 34, 36, 38, 55, 50, 180, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.HISUI_DECIDUEYE, 8, false, false, false, "Arrow Quill Pokémon", Type.GRASS, Type.FIGHTING, 1.6, 37, Abilities.OVERGROW, Abilities.NONE, Abilities.SCRAPPY, 530, 88, 112, 80, 95, 95, 60, 45, 50, 239, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.PALDEA_TAUROS, 9, false, false, false, "Wild Bull Pokémon", Type.FIGHTING, null, 1.4, 115, Abilities.INTIMIDATE, Abilities.ANGER_POINT, Abilities.CUD_CHEW, 490, 75, 110, 105, 30, 70, 100, 45, 50, 172, GrowthRate.SLOW, 100, false, false, - new PokemonForm("Combat Breed", "combat", Type.FIGHTING, null, 1.4, 115, Abilities.INTIMIDATE, Abilities.ANGER_POINT, Abilities.CUD_CHEW, 490, 75, 110, 105, 30, 70, 100, 45, 50, 172, false, ""), - new PokemonForm("Blaze Breed", "blaze", Type.FIGHTING, Type.FIRE, 1.4, 85, Abilities.INTIMIDATE, Abilities.ANGER_POINT, Abilities.CUD_CHEW, 490, 75, 110, 105, 30, 70, 100, 45, 50, 172), - new PokemonForm("Aqua Breed", "aqua", Type.FIGHTING, Type.WATER, 1.4, 110, Abilities.INTIMIDATE, Abilities.ANGER_POINT, Abilities.CUD_CHEW, 490, 75, 110, 105, 30, 70, 100, 45, 50, 172), + new PokemonForm("Combat Breed", "combat", Type.FIGHTING, null, 1.4, 115, Abilities.INTIMIDATE, Abilities.ANGER_POINT, Abilities.CUD_CHEW, 490, 75, 110, 105, 30, 70, 100, 45, 50, 172, false, "", true), + new PokemonForm("Blaze Breed", "blaze", Type.FIGHTING, Type.FIRE, 1.4, 85, Abilities.INTIMIDATE, Abilities.ANGER_POINT, Abilities.CUD_CHEW, 490, 75, 110, 105, 30, 70, 100, 45, 50, 172, false, null, true), + new PokemonForm("Aqua Breed", "aqua", Type.FIGHTING, Type.WATER, 1.4, 110, Abilities.INTIMIDATE, Abilities.ANGER_POINT, Abilities.CUD_CHEW, 490, 75, 110, 105, 30, 70, 100, 45, 50, 172, false, null, true), ), new PokemonSpecies(Species.PALDEA_WOOPER, 9, false, false, false, "Water Fish Pokémon", Type.POISON, Type.GROUND, 0.4, 11, Abilities.POISON_POINT, Abilities.WATER_ABSORB, Abilities.UNAWARE, 210, 55, 45, 45, 25, 25, 15, 255, 50, 42, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.BLOODMOON_URSALUNA, 9, false, false, false, "Peat Pokémon", Type.GROUND, Type.NORMAL, 2.7, 333, Abilities.MINDS_EYE, Abilities.NONE, Abilities.NONE, 555, 113, 70, 120, 135, 65, 52, 75, 50, 275, GrowthRate.MEDIUM_FAST, 50, false), diff --git a/src/data/status-effect.ts b/src/data/status-effect.ts index 03c5f46e8ee..810bd4d9482 100644 --- a/src/data/status-effect.ts +++ b/src/data/status-effect.ts @@ -164,14 +164,38 @@ export function getRandomStatusEffect(statusEffectA: StatusEffect, statusEffectB * @param statusA The first Status * @param statusB The second Status */ -export function getRandomStatus(statusA: Status, statusB: Status): Status { +export function getRandomStatus(statusA: Status, statusB: Status): Status { if (statusA === undefined || statusA.effect === StatusEffect.NONE || statusA.effect === StatusEffect.FAINT) { return statusB; } if (statusB === undefined || statusB.effect === StatusEffect.NONE || statusB.effect === StatusEffect.FAINT) { return statusA; } - + return Utils.randIntRange(0, 2) ? statusA : statusB; } + +/** + * Gets all non volatile status effects + * @returns A list containing all non volatile status effects + */ +export function getNonVolatileStatusEffects():Array { + return [ + StatusEffect.POISON, + StatusEffect.TOXIC, + StatusEffect.PARALYSIS, + StatusEffect.SLEEP, + StatusEffect.FREEZE, + StatusEffect.BURN + ]; +} + +/** + * Returns whether a statuss effect is non volatile. + * Non-volatile status condition is a status that remains after being switched out. + * @param status The status to check + */ +export function isNonVolatileStatusEffect(status: StatusEffect): boolean { + return getNonVolatileStatusEffects().includes(status); +} diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index cbe40e50cca..2a35f09fbeb 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -6,11 +6,11 @@ import {TrainerType} from "./enums/trainer-type"; import {Moves} from "./enums/moves"; import {PokeballType} from "./pokeball"; import {pokemonEvolutions, pokemonPrevolutions} from "./pokemon-evolutions"; -import PokemonSpecies, {PokemonSpeciesFilter, getPokemonSpecies} from "./pokemon-species"; +import PokemonSpecies, {getPokemonSpecies, PokemonSpeciesFilter} from "./pokemon-species"; import {Species} from "./enums/species"; import {tmSpecies} from "./tms"; import {Type} from "./type"; -import {initTrainerTypeDialogue} from "./dialogue"; +import {doubleBattleDialogue} from "./dialogue"; import {PersistentModifier} from "../modifier/modifier"; import {TrainerVariant} from "../field/trainer"; import {PartyMemberStrength} from "./enums/party-member-strength"; @@ -173,10 +173,12 @@ export interface PartyMemberFuncs { export class TrainerConfig { public trainerType: TrainerType; + public trainerTypeDouble: TrainerType; public name: string; public nameFemale: string; public nameDouble: string; public title: string; + public titleDouble: string; public hasGenders: boolean = false; public hasDouble: boolean = false; public hasCharSprite: boolean = false; @@ -229,6 +231,10 @@ export class TrainerConfig { if (this.hasGenders) { ret += `_${female ? "f" : "m"}`; } + // If a special double trainer class was set, set it as the sprite key + if (this.trainerTypeDouble && female) { + ret = TrainerType[this.trainerTypeDouble].toString().toLowerCase(); + } return ret; } @@ -264,6 +270,8 @@ export class TrainerConfig { return this; } + + getDerivedType(): TrainerType { let trainerType = this.trainerType; switch (trainerType) { @@ -280,17 +288,32 @@ export class TrainerConfig { case TrainerType.LARRY_ELITE: trainerType = TrainerType.LARRY; break; + case TrainerType.MARNIE_ELITE: + trainerType = TrainerType.MARNIE; + break; + case TrainerType.NESSA_ELITE: + trainerType = TrainerType.NESSA; + break; + case TrainerType.BEA_ELITE: + trainerType = TrainerType.BEA; + break; + case TrainerType.ALLISTER_ELITE: + trainerType = TrainerType.ALLISTER; + break; + case TrainerType.RAIHAN_ELITE: + trainerType = TrainerType.RAIHAN; + break; } return trainerType; } /** - * Sets the configuration for trainers with genders, including the female name and encounter background music (BGM). - * @param {string} [nameFemale] - The name of the female trainer. If 'Ivy', a localized name will be assigned. - * @param {TrainerType | string} [femaleEncounterBgm] - The encounter BGM for the female trainer, which can be a TrainerType or a string. - * @returns {TrainerConfig} - The updated TrainerConfig instance. - **/ + * Sets the configuration for trainers with genders, including the female name and encounter background music (BGM). + * @param {string} [nameFemale] - The name of the female trainer. If 'Ivy', a localized name will be assigned. + * @param {TrainerType | string} [femaleEncounterBgm] - The encounter BGM for the female trainer, which can be a TrainerType or a string. + * @returns {TrainerConfig} - The updated TrainerConfig instance. + **/ setHasGenders(nameFemale?: string, femaleEncounterBgm?: TrainerType | string): TrainerConfig { // If the female name is 'Ivy' (the rival), assign a localized name. if (nameFemale === "Ivy") { @@ -322,6 +345,12 @@ export class TrainerConfig { return this; } + /** + * Sets the configuration for trainers with double battles, including the name of the double trainer and the encounter BGM. + * @param nameDouble - The name of the double trainer (e.g., "Ace Duo" for Trainer Class Doubles or "red_blue_double" for NAMED trainer doubles). + * @param doubleEncounterBgm - The encounter BGM for the double trainer, which can be a TrainerType or a string. + * @returns {TrainerConfig} - The updated TrainerConfig instance. + */ setHasDouble(nameDouble: string, doubleEncounterBgm?: TrainerType | string): TrainerConfig { this.hasDouble = true; this.nameDouble = nameDouble; @@ -331,6 +360,50 @@ export class TrainerConfig { return this; } + /** + * Sets the trainer type for double battles. + * @param trainerTypeDouble - The TrainerType of the partner in a double battle. + * @returns {TrainerConfig} - The updated TrainerConfig instance. + */ + setDoubleTrainerType(trainerTypeDouble: TrainerType): TrainerConfig { + this.trainerTypeDouble = trainerTypeDouble; + this.setDoubleMessages(this.nameDouble); + return this; + } + + /** + * Sets the encounter and victory messages for double trainers. + * @param nameDouble - The name of the pair (e.g. "red_blue_double"). + */ + setDoubleMessages(nameDouble: string) { + // Check if there is double battle dialogue for this trainer + if (doubleBattleDialogue[nameDouble]) { + // Set encounter and victory messages for double trainers + this.doubleEncounterMessages = doubleBattleDialogue[nameDouble].encounter; + this.doubleVictoryMessages = doubleBattleDialogue[nameDouble].victory; + } + } + + /** + * Sets the title for double trainers + * @param titleDouble - the key for the title in the i18n file. (e.g., "champion_double"). + * @returns {TrainerConfig} - The updated TrainerConfig instance. + */ + setDoubleTitle(titleDouble: string): TrainerConfig { + // First check if i18n is initialized + if (!getIsInitialized()) { + initI18n(); + } + + // Make the title lowercase and replace spaces with underscores + titleDouble = titleDouble.toLowerCase().replace(/\s/g, "_"); + + // Get the title from the i18n file + this.titleDouble = i18next.t(`titles:${titleDouble}`); + + return this; + } + setHasCharSprite(): TrainerConfig { this.hasCharSprite = true; return this; @@ -423,11 +496,11 @@ export class TrainerConfig { } /** - * Initializes the trainer configuration for a Gym Leader. - * @param {Species | Species[]} signatureSpecies - The signature species for the Gym Leader. - * @param {Type[]} specialtyTypes - The specialty types for the Gym Leader. - * @returns {TrainerConfig} - The updated TrainerConfig instance. - * **/ + * Initializes the trainer configuration for a Gym Leader. + * @param {Species | Species[]} signatureSpecies - The signature species for the Gym Leader. + * @param {Type[]} specialtyTypes - The specialty types for the Gym Leader. + * @returns {TrainerConfig} - The updated TrainerConfig instance. + * **/ initForGymLeader(signatureSpecies: (Species | Species[])[], ...specialtyTypes: Type[]): TrainerConfig { // Check if the internationalization (i18n) system is initialized. if (!getIsInitialized()) { @@ -475,11 +548,11 @@ export class TrainerConfig { } /** - * Initializes the trainer configuration for an Elite Four member. - * @param {Species | Species[]} signatureSpecies - The signature species for the Elite Four member. - * @param {Type[]} specialtyTypes - The specialty types for the Elite Four member. - * @returns {TrainerConfig} - The updated TrainerConfig instance. - **/ + * Initializes the trainer configuration for an Elite Four member. + * @param {Species | Species[]} signatureSpecies - The signature species for the Elite Four member. + * @param {Type[]} specialtyTypes - The specialty types for the Elite Four member. + * @returns {TrainerConfig} - The updated TrainerConfig instance. + **/ initForEliteFour(signatureSpecies: (Species | Species[])[], ...specialtyTypes: Type[]): TrainerConfig { // Check if the internationalization (i18n) system is initialized. if (!getIsInitialized()) { @@ -526,10 +599,10 @@ export class TrainerConfig { } /** - * Initializes the trainer configuration for a Champion. - * @param {Species | Species[]} signatureSpecies - The signature species for the Champion. - * @returns {TrainerConfig} - The updated TrainerConfig instance. - **/ + * Initializes the trainer configuration for a Champion. + * @param {Species | Species[]} signatureSpecies - The signature species for the Champion. + * @returns {TrainerConfig} - The updated TrainerConfig instance. + **/ initForChampion(signatureSpecies: (Species | Species[])[]): TrainerConfig { // Check if the internationalization (i18n) system is initialized. if (!getIsInitialized()) { @@ -559,6 +632,7 @@ export class TrainerConfig { // Set the title to "champion". (this is the key in the i18n file) this.setTitle("champion"); + // Configure various properties for the Champion. this.setMoneyMultiplier(10); this.setBoss(); @@ -571,11 +645,11 @@ export class TrainerConfig { } /** - * Retrieves the title for the trainer based on the provided trainer slot and variant. - * @param {TrainerSlot} trainerSlot - The slot to determine which title to use. Defaults to TrainerSlot.NONE. - * @param {TrainerVariant} variant - The variant of the trainer to determine the specific title. - * @returns {string} - The title of the trainer. - **/ + * Retrieves the title for the trainer based on the provided trainer slot and variant. + * @param {TrainerSlot} trainerSlot - The slot to determine which title to use. Defaults to TrainerSlot.NONE. + * @param {TrainerVariant} variant - The variant of the trainer to determine the specific title. + * @returns {string} - The title of the trainer. + **/ getTitle(trainerSlot: TrainerSlot = TrainerSlot.NONE, variant: TrainerVariant): string { const ret = this.name; @@ -631,13 +705,15 @@ export class TrainerConfig { ? scene.anims.generateFrameNames(partnerTrainerKey, {zeroPad: 4,suffix: ".png",start: 1,end: 128}) : null; console.warn = originalWarn; - scene.anims.create({ - key: trainerKey, - frames: frameNames, - frameRate: 24, - repeat: -1 - }); - if (isDouble) { + if (!(scene.anims.exists(trainerKey))) { + scene.anims.create({ + key: trainerKey, + frames: frameNames, + frameRate: 24, + repeat: -1 + }); + } + if (isDouble && !(scene.anims.exists(partnerTrainerKey))) { scene.anims.create({ key: partnerTrainerKey, frames: partnerFrameNames, @@ -698,20 +774,161 @@ function getRandomTeraModifiers(party: EnemyPokemon[], count: integer, types?: T return ret; } +type SignatureSpecies = { + [key in string]: (Species | Species[])[]; +}; + +/* + * The signature species for each Gym Leader, Elite Four member, and Champion. + * The key is the trainer type, and the value is an array of Species or Species arrays. + * This is in a separate const so it can be accessed from other places and not just the trainerConfigs + */ +export const signatureSpecies: SignatureSpecies = { + BROCK: [Species.GEODUDE, Species.ONIX], + MISTY: [Species.STARYU, Species.PSYDUCK], + LT_SURGE: [Species.VOLTORB, Species.PIKACHU, Species.ELECTABUZZ], + ERIKA: [Species.ODDISH, Species.BELLSPROUT, Species.TANGELA, Species.HOPPIP], + JANINE: [Species.VENONAT, Species.SPINARAK, Species.ZUBAT], + SABRINA: [Species.ABRA, Species.MR_MIME, Species.ESPEON], + BLAINE: [Species.GROWLITHE, Species.PONYTA, Species.MAGMAR], + GIOVANNI: [Species.SANDILE, Species.MURKROW, Species.NIDORAN_M, Species.NIDORAN_F], + FALKNER: [Species.PIDGEY, Species.HOOTHOOT, Species.DODUO], + BUGSY: [Species.SCYTHER, Species.HERACROSS, Species.SHUCKLE, Species.PINSIR], + WHITNEY: [Species.GIRAFARIG, Species.MILTANK], + MORTY: [Species.GASTLY, Species.MISDREAVUS, Species.SABLEYE], + CHUCK: [Species.POLIWRATH, Species.MANKEY], + JASMINE: [Species.MAGNEMITE, Species.STEELIX], + PRYCE: [Species.SEEL, Species.SWINUB], + CLAIR: [Species.DRATINI, Species.HORSEA, Species.GYARADOS], + ROXANNE: [Species.GEODUDE, Species.NOSEPASS], + BRAWLY: [Species.MACHOP, Species.MAKUHITA], + WATTSON: [Species.MAGNEMITE, Species.VOLTORB, Species.ELECTRIKE], + FLANNERY: [Species.SLUGMA, Species.TORKOAL, Species.NUMEL], + NORMAN: [Species.SLAKOTH, Species.SPINDA, Species.CHANSEY, Species.KANGASKHAN], + WINONA: [Species.SWABLU, Species.WINGULL, Species.TROPIUS, Species.SKARMORY], + TATE: [Species.SOLROCK, Species.NATU, Species.CHIMECHO, Species.GALLADE], + LIZA: [Species.LUNATONE, Species.SPOINK, Species.BALTOY, Species.GARDEVOIR], + JUAN: [Species.HORSEA, Species.BARBOACH, Species.SPHEAL, Species.RELICANTH], + ROARK: [Species.CRANIDOS, Species.LARVITAR, Species.GEODUDE], + GARDENIA: [Species.ROSELIA, Species.TANGELA, Species.TURTWIG], + MAYLENE: [Species.LUCARIO, Species.MEDITITE, Species.CHIMCHAR], + CRASHER_WAKE: [Species.BUIZEL, Species.MAGIKARP, Species.PIPLUP], + FANTINA: [Species.MISDREAVUS, Species.DRIFLOON, Species.SPIRITOMB], + BYRON: [Species.SHIELDON, Species.BRONZOR, Species.AGGRON], + CANDICE: [Species.SNEASEL, Species.SNOVER, Species.SNORUNT], + VOLKNER: [Species.SHINX, Species.CHINCHOU, Species.ROTOM], + CILAN: [Species.PANSAGE, Species.COTTONEE, Species.PETILIL], + CHILI: [Species.PANSEAR, Species.DARUMAKA, Species.HEATMOR], + CRESS: [Species.PANPOUR, Species.BASCULIN, Species.TYMPOLE], + CHEREN: [Species.LILLIPUP, Species.MINCCINO, Species.PATRAT], + LENORA: [Species.KANGASKHAN, Species.DEERLING, Species.AUDINO], + ROXIE: [Species.VENIPEDE, Species.TRUBBISH, Species.SKORUPI], + BURGH: [Species.SEWADDLE, Species.SHELMET, Species.KARRABLAST], + ELESA: [Species.EMOLGA, Species.BLITZLE, Species.JOLTIK], + CLAY: [Species.DRILBUR, Species.SANDILE, Species.GOLETT], + SKYLA: [Species.DUCKLETT, Species.WOOBAT, Species.RUFFLET], + BRYCEN: [Species.CRYOGONAL, Species.VANILLITE, Species.CUBCHOO], + DRAYDEN: [Species.DRUDDIGON, Species.AXEW, Species.DEINO], + MARLON: [Species.WAILMER, Species.FRILLISH, Species.TIRTOUGA], + VIOLA: [Species.SURSKIT, Species.SCATTERBUG], + GRANT: [Species.AMAURA, Species.TYRUNT], + KORRINA: [Species.HAWLUCHA, Species.LUCARIO, Species.MIENFOO], + RAMOS: [Species.SKIDDO, Species.HOPPIP, Species.BELLSPROUT], + CLEMONT: [Species.HELIOPTILE, Species.MAGNEMITE, Species.EMOLGA], + VALERIE: [Species.SYLVEON, Species.MAWILE, Species.MR_MIME], + OLYMPIA: [Species.ESPURR, Species.SIGILYPH, Species.SLOWKING], + WULFRIC: [Species.BERGMITE, Species.SNOVER, Species.CRYOGONAL], + MILO: [Species.GOSSIFLEUR, Species.APPLIN, Species.BOUNSWEET], + NESSA: [Species.CHEWTLE, Species.ARROKUDA, Species.WIMPOD], + KABU: [Species.SIZZLIPEDE, Species.VULPIX, Species.TORKOAL], + BEA: [Species.GALAR_FARFETCHD, Species.MACHOP, Species.CLOBBOPUS], + ALLISTER: [Species.GALAR_YAMASK, Species.GALAR_CORSOLA, Species.GASTLY], + OPAL: [Species.MILCERY, Species.TOGETIC, Species.GALAR_WEEZING], + BEDE: [Species.HATENNA, Species.GALAR_PONYTA, Species.GARDEVOIR], + GORDIE: [Species.ROLYCOLY, Species.STONJOURNER, Species.BINACLE], + MELONY: [Species.SNOM, Species.GALAR_DARUMAKA, Species.GALAR_MR_MIME], + PIERS: [Species.GALAR_ZIGZAGOON, Species.SCRAGGY, Species.INKAY], + MARNIE: [Species.IMPIDIMP, Species.PURRLOIN, Species.MORPEKO], + RAIHAN: [Species.DURALUDON, Species.TURTONATOR, Species.GOOMY], + KATY: [Species.NYMBLE, Species.TAROUNTULA, Species.HERACROSS], + BRASSIUS: [Species.SMOLIV, Species.SHROOMISH, Species.ODDISH], + IONO: [Species.TADBULB, Species.WATTREL, Species.VOLTORB], + KOFU: [Species.VELUZA, Species.WIGLETT, Species.WINGULL], + LARRY: [Species.STARLY, Species.DUNSPARCE, Species.KOMALA], + RYME: [Species.GREAVARD, Species.SHUPPET, Species.MIMIKYU], + TULIP: [Species.GIRAFARIG, Species.FLITTLE, Species.RALTS], + GRUSHA: [Species.CETODDLE, Species.ALOLA_VULPIX, Species.CUBCHOO], + LORELEI: [Species.SLOWBRO, Species.LAPRAS, Species.DEWGONG, Species.ALOLA_SANDSLASH], + BRUNO: [Species.ONIX, Species.HITMONCHAN, Species.HITMONLEE, Species.ALOLA_GOLEM], + AGATHA: [Species.GENGAR, Species.ARBOK, Species.CROBAT, Species.ALOLA_MAROWAK], + LANCE: [Species.DRAGONITE, Species.GYARADOS, Species.AERODACTYL, Species.ALOLA_EXEGGUTOR], + WILL: [Species.XATU, Species.JYNX, Species.SLOWBRO, Species.EXEGGUTOR], + KOGA: [Species.WEEZING, Species.VENOMOTH, Species.CROBAT, Species.TENTACRUEL], + KAREN: [Species.UMBREON, Species.HONCHKROW, Species.HOUNDOOM, Species.WEAVILE], + SIDNEY: [Species.SHIFTRY, Species.SHARPEDO, Species.ABSOL, Species.ZOROARK], + PHOEBE: [Species.SABLEYE, Species.DUSKNOIR, Species.BANETTE, Species.CHANDELURE], + GLACIA: [Species.GLALIE, Species.WALREIN, Species.FROSLASS, Species.ABOMASNOW], + DRAKE: [Species.ALTARIA, Species.SALAMENCE, Species.FLYGON, Species.KINGDRA], + AARON: [Species.SCIZOR, Species.HERACROSS, Species.VESPIQUEN, Species.DRAPION], + BERTHA: [Species.WHISCASH, Species.HIPPOWDON, Species.GLISCOR, Species.RHYPERIOR], + FLINT: [Species.FLAREON, Species.HOUNDOOM, Species.RAPIDASH, Species.INFERNAPE], + LUCIAN: [Species.MR_MIME, Species.GALLADE, Species.BRONZONG, Species.ALAKAZAM], + SHAUNTAL: [Species.COFAGRIGUS, Species.CHANDELURE, Species.GOLURK, Species.DRIFBLIM], + MARSHAL: [Species.TIMBURR, Species.MIENFOO, Species.THROH, Species.SAWK], + GRIMSLEY: [Species.LIEPARD, Species.KINGAMBIT, Species.SCRAFTY, Species.KROOKODILE], + CAITLIN: [Species.MUSHARNA, Species.GOTHITELLE, Species.SIGILYPH, Species.REUNICLUS], + MALVA: [Species.PYROAR, Species.TORKOAL, Species.CHANDELURE, Species.TALONFLAME], + SIEBOLD: [Species.CLAWITZER, Species.GYARADOS, Species.BARBARACLE, Species.STARMIE], + WIKSTROM: [Species.KLEFKI, Species.PROBOPASS, Species.SCIZOR, Species.AEGISLASH], + DRASNA: [Species.DRAGALGE, Species.DRUDDIGON, Species.ALTARIA, Species.NOIVERN], + HALA: [Species.HARIYAMA, Species.BEWEAR, Species.CRABOMINABLE, Species.POLIWRATH], + MOLAYNE: [Species.KLEFKI, Species.MAGNEZONE, Species.METAGROSS, Species.ALOLA_DUGTRIO], + OLIVIA: [Species.ARMALDO, Species.CRADILY, Species.ALOLA_GOLEM, Species.LYCANROC], + ACEROLA: [Species.BANETTE, Species.DRIFBLIM, Species.DHELMISE, Species.PALOSSAND], + KAHILI: [Species.BRAVIARY, Species.HAWLUCHA, Species.ORICORIO, Species.TOUCANNON], + MARNIE_ELITE: [ Species.MORPEKO, Species.LIEPARD, Species.TOXICROAK,Species.SCRAFTY, Species.GRIMMSNARL], + NESSA_ELITE: [ Species.GOLISOPOD,Species.PELIPPER,Species.QUAGSIRE,Species.TOXAPEX,Species.DREDNAW], + BEA_ELITE: [ Species.HAWLUCHA,Species.GRAPPLOCT,Species.SIRFETCHD,Species.FALINKS,Species.MACHAMP], + ALLISTER_ELITE:[ Species.DUSKNOIR,Species.CHANDELURE,Species.CURSOLA,Species.RUNERIGUS,Species.GENGAR], + RAIHAN_ELITE: [ Species.TORKOAL,Species.GOODRA,Species.TURTONATOR,Species.FLYGON,Species.DURALUDON], + RIKA: [Species.WHISCASH, Species.DONPHAN, Species.CAMERUPT, Species.CLODSIRE], + POPPY: [Species.COPPERAJAH, Species.BRONZONG, Species.CORVIKNIGHT, Species.TINKATON], + LARRY_ELITE: [Species.STARAPTOR, Species.FLAMIGO, Species.ALTARIA, Species.TROPIUS], + HASSEL: [Species.NOIVERN, Species.HAXORUS, Species.DRAGALGE, Species.BAXCALIBUR], + CRISPIN: [Species.TALONFLAME, Species.CAMERUPT, Species.MAGMORTAR, Species.BLAZIKEN], + AMARYS: [Species.SKARMORY, Species.EMPOLEON, Species.SCIZOR, Species.METAGROSS], + LACEY: [Species.EXCADRILL, Species.PRIMARINA, Species.ALCREMIE, Species.GALAR_SLOWBRO], + DRAYTON: [Species.DRAGONITE, Species.ARCHALUDON, Species.FLYGON, Species.SCEPTILE], + BLUE: [Species.GYARADOS, Species.MEWTWO, Species.ARCANINE, Species.ALAKAZAM, Species.PIDGEOT], + RED: [Species.CHARIZARD, [Species.LUGIA, Species.HO_OH], Species.SNORLAX, Species.RAICHU, Species.ESPEON], + LANCE_CHAMPION: [Species.DRAGONITE, Species.ZYGARDE, Species.AERODACTYL, Species.KINGDRA, Species.ALOLA_EXEGGUTOR], + STEVEN: [Species.METAGROSS, [Species.DIALGA, Species.PALKIA], Species.SKARMORY, Species.AGGRON, Species.CARBINK], + WALLACE: [Species.MILOTIC, Species.KYOGRE, Species.WHISCASH, Species.WALREIN, Species.LUDICOLO], + CYNTHIA: [Species.SPIRITOMB, Species.GIRATINA, Species.GARCHOMP, Species.MILOTIC, Species.LUCARIO, Species.TOGEKISS], + ALDER: [Species.VOLCARONA, Species.GROUDON, Species.BOUFFALANT, Species.ACCELGOR, Species.CONKELDURR], + IRIS: [Species.HAXORUS, Species.YVELTAL, Species.DRUDDIGON, Species.AGGRON, Species.LAPRAS], + DIANTHA: [Species.HAWLUCHA, Species.XERNEAS, Species.GOURGEIST, Species.GOODRA, Species.GARDEVOIR], + HAU: [Species.ALOLA_RAICHU, [Species.SOLGALEO, Species.LUNALA], Species.NOIVERN, [Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA], Species.CRABOMINABLE], + GEETA: [Species.GLIMMORA, Species.MIRAIDON, Species.ESPATHRA, Species.VELUZA, Species.KINGAMBIT], + NEMONA: [Species.LYCANROC, Species.KORAIDON, Species.KOMMO_O, Species.PAWMOT, Species.DUSKNOIR], + KIERAN: [Species.POLITOED, [Species.OGERPON, Species.TERAPAGOS], Species.HYDRAPPLE, Species.PORYGON_Z, Species.GRIMMSNARL], + LEON: [Species.DRAGAPULT, [Species.ZACIAN, Species.ZAMAZENTA], Species.SEISMITOAD, Species.AEGISLASH, Species.CHARIZARD], +}; + export const trainerConfigs: TrainerConfigs = { [TrainerType.UNKNOWN]: new TrainerConfig(0).setHasGenders(), [TrainerType.ACE_TRAINER]: new TrainerConfig(++t).setHasGenders("Ace Trainer Female").setHasDouble("Ace Duo").setMoneyMultiplier(2.25).setEncounterBgm(TrainerType.ACE_TRAINER) .setPartyTemplateFunc(scene => getWavePartyTemplate(scene, trainerPartyTemplates.THREE_WEAK_BALANCED, trainerPartyTemplates.FOUR_WEAK_BALANCED, trainerPartyTemplates.FIVE_WEAK_BALANCED, trainerPartyTemplates.SIX_WEAK_BALANCED)), [TrainerType.ARTIST]: new TrainerConfig(++t).setEncounterBgm(TrainerType.RICH).setPartyTemplates(trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.THREE_AVG) - .setSpeciesPools([ Species.SMEARGLE ]), + .setSpeciesPools([Species.SMEARGLE]), [TrainerType.BACKERS]: new TrainerConfig(++t).setHasGenders("Backers").setDoubleOnly().setEncounterBgm(TrainerType.CYCLIST), [TrainerType.BACKPACKER]: new TrainerConfig(++t).setHasGenders("Backpacker Female").setHasDouble("Backpackers").setSpeciesFilter(s => s.isOfType(Type.FLYING) || s.isOfType(Type.ROCK)).setEncounterBgm(TrainerType.BACKPACKER) .setPartyTemplates(trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.ONE_WEAK_ONE_STRONG, trainerPartyTemplates.ONE_AVG_ONE_STRONG) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.RHYHORN, Species.AIPOM, Species.MAKUHITA, Species.MAWILE, Species.NUMEL, Species.LILLIPUP, Species.SANDILE, Species.WOOLOO ], - [TrainerPoolTier.UNCOMMON]: [ Species.GIRAFARIG, Species.ZANGOOSE, Species.SEVIPER, Species.CUBCHOO, Species.PANCHAM, Species.SKIDDO, Species.MUDBRAY ], - [TrainerPoolTier.RARE]: [ Species.TAUROS, Species.STANTLER, Species.DARUMAKA, Species.BOUFFALANT, Species.DEERLING, Species.IMPIDIMP ], - [TrainerPoolTier.SUPER_RARE]: [ Species.GALAR_DARUMAKA, Species.TEDDIURSA ] + [TrainerPoolTier.COMMON]: [Species.RHYHORN, Species.AIPOM, Species.MAKUHITA, Species.MAWILE, Species.NUMEL, Species.LILLIPUP, Species.SANDILE, Species.WOOLOO], + [TrainerPoolTier.UNCOMMON]: [Species.GIRAFARIG, Species.ZANGOOSE, Species.SEVIPER, Species.CUBCHOO, Species.PANCHAM, Species.SKIDDO, Species.MUDBRAY], + [TrainerPoolTier.RARE]: [Species.TAUROS, Species.STANTLER, Species.DARUMAKA, Species.BOUFFALANT, Species.DEERLING, Species.IMPIDIMP], + [TrainerPoolTier.SUPER_RARE]: [Species.GALAR_DARUMAKA, Species.TEDDIURSA] }), [TrainerType.BAKER]: new TrainerConfig(++t).setEncounterBgm(TrainerType.CLERK).setMoneyMultiplier(1.35).setSpeciesFilter(s => s.isOfType(Type.GRASS) || s.isOfType(Type.FIRE)), [TrainerType.BEAUTY]: new TrainerConfig(++t).setMoneyMultiplier(1.55).setEncounterBgm(TrainerType.PARASOL_LADY), @@ -719,11 +936,11 @@ export const trainerConfigs: TrainerConfigs = { [TrainerType.BLACK_BELT]: new TrainerConfig(++t).setHasGenders("Battle Girl", TrainerType.PSYCHIC).setHasDouble("Crush Kin").setEncounterBgm(TrainerType.ROUGHNECK).setSpecialtyTypes(Type.FIGHTING) .setPartyTemplates(trainerPartyTemplates.TWO_WEAK_ONE_AVG, trainerPartyTemplates.TWO_WEAK_ONE_AVG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_ONE_STRONG, trainerPartyTemplates.THREE_AVG, trainerPartyTemplates.TWO_AVG_ONE_STRONG) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.NIDORAN_F, Species.NIDORAN_M, Species.MACHOP, Species.MAKUHITA, Species.MEDITITE, Species.CROAGUNK, Species.TIMBURR ], - [TrainerPoolTier.UNCOMMON]: [ Species.MANKEY, Species.POLIWRATH, Species.TYROGUE, Species.BRELOOM, Species.SCRAGGY, Species.MIENFOO, Species.PANCHAM, Species.STUFFUL, Species.CRABRAWLER ], - [TrainerPoolTier.RARE]: [ Species.HERACROSS, Species.RIOLU, Species.THROH, Species.SAWK, Species.PASSIMIAN, Species.CLOBBOPUS ], - [TrainerPoolTier.SUPER_RARE]: [ Species.HITMONTOP, Species.INFERNAPE, Species.GALLADE, Species.HAWLUCHA, Species.HAKAMO_O ], - [TrainerPoolTier.ULTRA_RARE]: [ Species.KUBFU ] + [TrainerPoolTier.COMMON]: [Species.NIDORAN_F, Species.NIDORAN_M, Species.MACHOP, Species.MAKUHITA, Species.MEDITITE, Species.CROAGUNK, Species.TIMBURR], + [TrainerPoolTier.UNCOMMON]: [Species.MANKEY, Species.POLIWRATH, Species.TYROGUE, Species.BRELOOM, Species.SCRAGGY, Species.MIENFOO, Species.PANCHAM, Species.STUFFUL, Species.CRABRAWLER], + [TrainerPoolTier.RARE]: [Species.HERACROSS, Species.RIOLU, Species.THROH, Species.SAWK, Species.PASSIMIAN, Species.CLOBBOPUS], + [TrainerPoolTier.SUPER_RARE]: [Species.HITMONTOP, Species.INFERNAPE, Species.GALLADE, Species.HAWLUCHA, Species.HAKAMO_O], + [TrainerPoolTier.ULTRA_RARE]: [Species.KUBFU] }), [TrainerType.BREEDER]: new TrainerConfig(++t).setMoneyMultiplier(1.325).setEncounterBgm(TrainerType.POKEFAN).setHasGenders("Breeder Female").setHasDouble("Breeders") .setPartyTemplateFunc(scene => getWavePartyTemplate(scene, trainerPartyTemplates.FOUR_WEAKER, trainerPartyTemplates.FIVE_WEAKER, trainerPartyTemplates.SIX_WEAKER)) @@ -731,25 +948,25 @@ export const trainerConfigs: TrainerConfigs = { [TrainerType.CLERK]: new TrainerConfig(++t).setHasGenders("Clerk Female").setHasDouble("Colleagues").setEncounterBgm(TrainerType.CLERK) .setPartyTemplates(trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.THREE_WEAK, trainerPartyTemplates.ONE_AVG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_ONE_AVG) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.MEOWTH, Species.PSYDUCK, Species.BUDEW, Species.PIDOVE, Species.CINCCINO, Species.LITLEO ], - [TrainerPoolTier.UNCOMMON]: [ Species.JIGGLYPUFF, Species.MAGNEMITE, Species.MARILL, Species.COTTONEE, Species.SKIDDO ], - [TrainerPoolTier.RARE]: [ Species.BUIZEL, Species.SNEASEL, Species.KLEFKI, Species.INDEEDEE ] + [TrainerPoolTier.COMMON]: [Species.MEOWTH, Species.PSYDUCK, Species.BUDEW, Species.PIDOVE, Species.CINCCINO, Species.LITLEO], + [TrainerPoolTier.UNCOMMON]: [Species.JIGGLYPUFF, Species.MAGNEMITE, Species.MARILL, Species.COTTONEE, Species.SKIDDO], + [TrainerPoolTier.RARE]: [Species.BUIZEL, Species.SNEASEL, Species.KLEFKI, Species.INDEEDEE] }), [TrainerType.CYCLIST]: new TrainerConfig(++t).setMoneyMultiplier(1.3).setHasGenders("Cyclist Female").setHasDouble("Cyclists").setEncounterBgm(TrainerType.CYCLIST) .setPartyTemplates(trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.ONE_AVG) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.PICHU, Species.STARLY, Species.TAILLOW, Species.BOLTUND ], - [TrainerPoolTier.UNCOMMON]: [ Species.DODUO, Species.ELECTRIKE, Species.BLITZLE, Species.WATTREL ], - [TrainerPoolTier.RARE]: [ Species.YANMA, Species.NINJASK, Species.WHIRLIPEDE, Species.EMOLGA ], - [TrainerPoolTier.SUPER_RARE]: [ Species.ACCELGOR, Species.DREEPY ] + [TrainerPoolTier.COMMON]: [Species.PICHU, Species.STARLY, Species.TAILLOW, Species.BOLTUND], + [TrainerPoolTier.UNCOMMON]: [Species.DODUO, Species.ELECTRIKE, Species.BLITZLE, Species.WATTREL], + [TrainerPoolTier.RARE]: [Species.YANMA, Species.NINJASK, Species.WHIRLIPEDE, Species.EMOLGA], + [TrainerPoolTier.SUPER_RARE]: [Species.ACCELGOR, Species.DREEPY] }), [TrainerType.DANCER]: new TrainerConfig(++t).setMoneyMultiplier(1.55).setEncounterBgm(TrainerType.CYCLIST) .setPartyTemplates(trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.ONE_AVG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_SAME_TWO_WEAK_SAME) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.RALTS, Species.SPOINK, Species.LOTAD, Species.BUDEW ], - [TrainerPoolTier.UNCOMMON]: [ Species.SPINDA, Species.SWABLU, Species.MARACTUS,], - [TrainerPoolTier.RARE]: [ Species.BELLOSSOM, Species.HITMONTOP, Species.MIME_JR, Species.ORICORIO ], - [TrainerPoolTier.SUPER_RARE]: [ Species.POPPLIO ] + [TrainerPoolTier.COMMON]: [Species.RALTS, Species.SPOINK, Species.LOTAD, Species.BUDEW], + [TrainerPoolTier.UNCOMMON]: [Species.SPINDA, Species.SWABLU, Species.MARACTUS,], + [TrainerPoolTier.RARE]: [Species.BELLOSSOM, Species.HITMONTOP, Species.MIME_JR, Species.ORICORIO], + [TrainerPoolTier.SUPER_RARE]: [Species.POPPLIO] }), [TrainerType.DEPOT_AGENT]: new TrainerConfig(++t).setMoneyMultiplier(1.45).setEncounterBgm(TrainerType.CLERK), [TrainerType.DOCTOR]: new TrainerConfig(++t).setHasGenders("Nurse", "lass").setHasDouble("Medical Team").setMoneyMultiplier(3).setEncounterBgm(TrainerType.CLERK) @@ -757,20 +974,20 @@ export const trainerConfigs: TrainerConfigs = { [TrainerType.FISHERMAN]: new TrainerConfig(++t).setMoneyMultiplier(1.25).setEncounterBgm(TrainerType.BACKPACKER).setSpecialtyTypes(Type.WATER) .setPartyTemplates(trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG, trainerPartyTemplates.ONE_AVG, trainerPartyTemplates.THREE_WEAK_SAME, trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.SIX_WEAKER) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.TENTACOOL, Species.MAGIKARP, Species.GOLDEEN, Species.STARYU, Species.REMORAID, Species.SKRELP, Species.CLAUNCHER, Species.ARROKUDA ], - [TrainerPoolTier.UNCOMMON]: [ Species.POLIWAG, Species.SHELLDER, Species.KRABBY, Species.HORSEA, Species.CARVANHA, Species.BARBOACH, Species.CORPHISH, Species.FINNEON, Species.TYMPOLE, Species.BASCULIN, Species.FRILLISH, Species.INKAY ], - [TrainerPoolTier.RARE]: [ Species.CHINCHOU, Species.CORSOLA, Species.WAILMER, Species.BARBOACH, Species.CLAMPERL, Species.LUVDISC, Species.MANTYKE, Species.ALOMOMOLA, Species.TATSUGIRI, Species.VELUZA ], - [TrainerPoolTier.SUPER_RARE]: [ Species.LAPRAS, Species.FEEBAS, Species.RELICANTH, Species.DONDOZO ] + [TrainerPoolTier.COMMON]: [Species.TENTACOOL, Species.MAGIKARP, Species.GOLDEEN, Species.STARYU, Species.REMORAID, Species.SKRELP, Species.CLAUNCHER, Species.ARROKUDA], + [TrainerPoolTier.UNCOMMON]: [Species.POLIWAG, Species.SHELLDER, Species.KRABBY, Species.HORSEA, Species.CARVANHA, Species.BARBOACH, Species.CORPHISH, Species.FINNEON, Species.TYMPOLE, Species.BASCULIN, Species.FRILLISH, Species.INKAY], + [TrainerPoolTier.RARE]: [Species.CHINCHOU, Species.CORSOLA, Species.WAILMER, Species.BARBOACH, Species.CLAMPERL, Species.LUVDISC, Species.MANTYKE, Species.ALOMOMOLA, Species.TATSUGIRI, Species.VELUZA], + [TrainerPoolTier.SUPER_RARE]: [Species.LAPRAS, Species.FEEBAS, Species.RELICANTH, Species.DONDOZO] }), [TrainerType.GUITARIST]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.ROUGHNECK).setSpecialtyTypes(Type.ELECTRIC).setSpeciesFilter(s => s.isOfType(Type.ELECTRIC)), [TrainerType.HARLEQUIN]: new TrainerConfig(++t).setEncounterBgm(TrainerType.PSYCHIC).setSpeciesFilter(s => tmSpecies[Moves.TRICK_ROOM].indexOf(s.speciesId) > -1), [TrainerType.HIKER]: new TrainerConfig(++t).setEncounterBgm(TrainerType.BACKPACKER) .setPartyTemplates(trainerPartyTemplates.TWO_AVG_SAME_ONE_AVG, trainerPartyTemplates.TWO_AVG_SAME_ONE_STRONG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.FOUR_WEAK, trainerPartyTemplates.ONE_STRONG) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.SANDSHREW, Species.DIGLETT, Species.GEODUDE, Species.MACHOP, Species.ARON, Species.ROGGENROLA, Species.DRILBUR, Species.NACLI ], - [TrainerPoolTier.UNCOMMON]: [ Species.ZUBAT, Species.RHYHORN, Species.ONIX, Species.CUBONE, Species.WOOBAT, Species.SWINUB, Species.NOSEPASS, Species.HIPPOPOTAS, Species.DWEBBLE, Species.KLAWF, Species.TOEDSCOOL ], - [TrainerPoolTier.RARE]: [ Species.TORKOAL, Species.TRAPINCH, Species.BARBOACH, Species.GOLETT, Species.ALOLA_DIGLETT, Species.ALOLA_GEODUDE, Species.GALAR_STUNFISK, Species.PALDEA_WOOPER ], - [TrainerPoolTier.SUPER_RARE]: [ Species.MAGBY, Species.LARVITAR ] + [TrainerPoolTier.COMMON]: [Species.SANDSHREW, Species.DIGLETT, Species.GEODUDE, Species.MACHOP, Species.ARON, Species.ROGGENROLA, Species.DRILBUR, Species.NACLI], + [TrainerPoolTier.UNCOMMON]: [Species.ZUBAT, Species.RHYHORN, Species.ONIX, Species.CUBONE, Species.WOOBAT, Species.SWINUB, Species.NOSEPASS, Species.HIPPOPOTAS, Species.DWEBBLE, Species.KLAWF, Species.TOEDSCOOL], + [TrainerPoolTier.RARE]: [Species.TORKOAL, Species.TRAPINCH, Species.BARBOACH, Species.GOLETT, Species.ALOLA_DIGLETT, Species.ALOLA_GEODUDE, Species.GALAR_STUNFISK, Species.PALDEA_WOOPER], + [TrainerPoolTier.SUPER_RARE]: [Species.MAGBY, Species.LARVITAR] }), [TrainerType.HOOLIGANS]: new TrainerConfig(++t).setDoubleOnly().setEncounterBgm(TrainerType.ROUGHNECK).setSpeciesFilter(s => s.isOfType(Type.POISON) || s.isOfType(Type.DARK)), [TrainerType.HOOPSTER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST), @@ -785,12 +1002,12 @@ export const trainerConfigs: TrainerConfigs = { [TrainerType.NURSERY_AIDE]: new TrainerConfig(++t).setMoneyMultiplier(1.3).setEncounterBgm("lass"), [TrainerType.OFFICER]: new TrainerConfig(++t).setMoneyMultiplier(1.55).setEncounterBgm(TrainerType.CLERK) .setPartyTemplates(trainerPartyTemplates.ONE_AVG, trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG) - .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.VULPIX, Species.GROWLITHE, Species.SNUBBULL, Species.POOCHYENA, Species.ELECTRIKE, Species.LILLIPUP, Species.YAMPER, Species.FIDOUGH ], - [TrainerPoolTier.UNCOMMON]: [ Species.HOUNDOUR, Species.ROCKRUFF, Species.MASCHIFF ], - [TrainerPoolTier.RARE]: [ Species.JOLTEON, Species.RIOLU ], + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [Species.VULPIX, Species.GROWLITHE, Species.SNUBBULL, Species.POOCHYENA, Species.ELECTRIKE, Species.LILLIPUP, Species.YAMPER, Species.FIDOUGH], + [TrainerPoolTier.UNCOMMON]: [Species.HOUNDOUR, Species.ROCKRUFF, Species.MASCHIFF], + [TrainerPoolTier.RARE]: [Species.JOLTEON, Species.RIOLU], [TrainerPoolTier.SUPER_RARE]: [], - [TrainerPoolTier.ULTRA_RARE]: [ Species.ENTEI, Species.SUICUNE, Species.RAIKOU ] + [TrainerPoolTier.ULTRA_RARE]: [Species.ENTEI, Species.SUICUNE, Species.RAIKOU] }), [TrainerType.PARASOL_LADY]: new TrainerConfig(++t).setMoneyMultiplier(1.55).setEncounterBgm(TrainerType.PARASOL_LADY).setSpeciesFilter(s => s.isOfType(Type.WATER)), [TrainerType.PILOT]: new TrainerConfig(++t).setEncounterBgm(TrainerType.CLERK).setSpeciesFilter(s => tmSpecies[Moves.FLY].indexOf(s.speciesId) > -1), @@ -799,222 +1016,227 @@ export const trainerConfigs: TrainerConfigs = { [TrainerType.PRESCHOOLER]: new TrainerConfig(++t).setMoneyMultiplier(0.2).setEncounterBgm(TrainerType.YOUNGSTER).setHasGenders("Preschooler Female", "lass").setHasDouble("Preschoolers") .setPartyTemplates(trainerPartyTemplates.THREE_WEAK, trainerPartyTemplates.FOUR_WEAKER, trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG, trainerPartyTemplates.FIVE_WEAKER) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.CATERPIE, Species.PICHU, Species.SANDSHREW, Species.LEDYBA, Species.BUDEW, Species.BURMY, Species.WOOLOO, Species.PAWMI, Species.SMOLIV ], - [TrainerPoolTier.UNCOMMON]: [ Species.EEVEE, Species.CLEFFA, Species.IGGLYBUFF, Species.SWINUB, Species.WOOPER, Species.DRIFLOON, Species.DEDENNE, Species.STUFFUL ], - [TrainerPoolTier.RARE]: [ Species.RALTS, Species.RIOLU, Species.JOLTIK, Species.TANDEMAUS ], - [TrainerPoolTier.SUPER_RARE]: [ Species.DARUMAKA, Species.TINKATINK ], + [TrainerPoolTier.COMMON]: [Species.CATERPIE, Species.PICHU, Species.SANDSHREW, Species.LEDYBA, Species.BUDEW, Species.BURMY, Species.WOOLOO, Species.PAWMI, Species.SMOLIV], + [TrainerPoolTier.UNCOMMON]: [Species.EEVEE, Species.CLEFFA, Species.IGGLYBUFF, Species.SWINUB, Species.WOOPER, Species.DRIFLOON, Species.DEDENNE, Species.STUFFUL], + [TrainerPoolTier.RARE]: [Species.RALTS, Species.RIOLU, Species.JOLTIK, Species.TANDEMAUS], + [TrainerPoolTier.SUPER_RARE]: [Species.DARUMAKA, Species.TINKATINK], }), [TrainerType.PSYCHIC]: new TrainerConfig(++t).setHasGenders("Psychic Female").setHasDouble("Psychics").setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.PSYCHIC) .setPartyTemplates(trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG, trainerPartyTemplates.TWO_WEAK_SAME_TWO_WEAK_SAME, trainerPartyTemplates.ONE_STRONGER) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.ABRA, Species.DROWZEE, Species.RALTS, Species.SPOINK, Species.GOTHITA, Species.SOLOSIS, Species.BLIPBUG, Species.ESPURR, Species.HATENNA ], - [TrainerPoolTier.UNCOMMON]: [ Species.MIME_JR, Species.EXEGGCUTE, Species.MEDITITE, Species.NATU, Species.EXEGGCUTE, Species.WOOBAT, Species.INKAY, Species.ORANGURU ], - [TrainerPoolTier.RARE]: [ Species.ELGYEM, Species.SIGILYPH, Species.BALTOY, Species.GIRAFARIG, Species.MEOWSTIC ], - [TrainerPoolTier.SUPER_RARE]: [ Species.BELDUM, Species.ESPEON, Species.STANTLER ], + [TrainerPoolTier.COMMON]: [Species.ABRA, Species.DROWZEE, Species.RALTS, Species.SPOINK, Species.GOTHITA, Species.SOLOSIS, Species.BLIPBUG, Species.ESPURR, Species.HATENNA], + [TrainerPoolTier.UNCOMMON]: [Species.MIME_JR, Species.EXEGGCUTE, Species.MEDITITE, Species.NATU, Species.EXEGGCUTE, Species.WOOBAT, Species.INKAY, Species.ORANGURU], + [TrainerPoolTier.RARE]: [Species.ELGYEM, Species.SIGILYPH, Species.BALTOY, Species.GIRAFARIG, Species.MEOWSTIC], + [TrainerPoolTier.SUPER_RARE]: [Species.BELDUM, Species.ESPEON, Species.STANTLER], }), [TrainerType.RANGER]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setName("Pokémon Ranger").setEncounterBgm(TrainerType.BACKPACKER).setHasGenders("Pokémon Ranger Female").setHasDouble("Pokémon Rangers") .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.PICHU, Species.GROWLITHE, Species.PONYTA, Species.ZIGZAGOON, Species.SEEDOT, Species.BIDOOF, Species.RIOLU, Species.SEWADDLE, Species.SKIDDO, Species.SALANDIT, Species.YAMPER ], - [TrainerPoolTier.UNCOMMON]: [ Species.AZURILL, Species.TAUROS, Species.MAREEP, Species.FARFETCHD, Species.TEDDIURSA, Species.SHROOMISH, Species.ELECTRIKE, Species.BUDEW, Species.BUIZEL, Species.MUDBRAY, Species.STUFFUL ], - [TrainerPoolTier.RARE]: [ Species.EEVEE, Species.SCYTHER, Species.KANGASKHAN, Species.RALTS, Species.MUNCHLAX, Species.ZORUA, Species.PALDEA_TAUROS, Species.TINKATINK, Species.CYCLIZAR, Species.FLAMIGO ], - [TrainerPoolTier.SUPER_RARE]: [ Species.LARVESTA ], + [TrainerPoolTier.COMMON]: [Species.PICHU, Species.GROWLITHE, Species.PONYTA, Species.ZIGZAGOON, Species.SEEDOT, Species.BIDOOF, Species.RIOLU, Species.SEWADDLE, Species.SKIDDO, Species.SALANDIT, Species.YAMPER], + [TrainerPoolTier.UNCOMMON]: [Species.AZURILL, Species.TAUROS, Species.MAREEP, Species.FARFETCHD, Species.TEDDIURSA, Species.SHROOMISH, Species.ELECTRIKE, Species.BUDEW, Species.BUIZEL, Species.MUDBRAY, Species.STUFFUL], + [TrainerPoolTier.RARE]: [Species.EEVEE, Species.SCYTHER, Species.KANGASKHAN, Species.RALTS, Species.MUNCHLAX, Species.ZORUA, Species.PALDEA_TAUROS, Species.TINKATINK, Species.CYCLIZAR, Species.FLAMIGO], + [TrainerPoolTier.SUPER_RARE]: [Species.LARVESTA], }), [TrainerType.RICH]: new TrainerConfig(++t).setMoneyMultiplier(5).setName("Gentleman").setHasGenders("Madame").setHasDouble("Rich Couple"), [TrainerType.RICH_KID]: new TrainerConfig(++t).setMoneyMultiplier(3.75).setName("Rich Boy").setHasGenders("Lady").setHasDouble("Rich Kids").setEncounterBgm(TrainerType.RICH), [TrainerType.ROUGHNECK]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.ROUGHNECK).setSpeciesFilter(s => s.isOfType(Type.DARK)), [TrainerType.SCIENTIST]: new TrainerConfig(++t).setHasGenders("Scientist Female").setHasDouble("Scientists").setMoneyMultiplier(1.7).setEncounterBgm(TrainerType.SCIENTIST) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.MAGNEMITE, Species.GRIMER, Species.DROWZEE, Species.VOLTORB, Species.KOFFING ], - [TrainerPoolTier.UNCOMMON]: [ Species.BALTOY, Species.BRONZOR, Species.FERROSEED, Species.KLINK, Species.CHARJABUG, Species.BLIPBUG, Species.HELIOPTILE ], - [TrainerPoolTier.RARE]: [ Species.ABRA, Species.DITTO, Species.PORYGON, Species.ELEKID, Species.SOLOSIS, Species.GALAR_WEEZING ], - [TrainerPoolTier.SUPER_RARE]: [ Species.OMANYTE, Species.KABUTO, Species.AERODACTYL, Species.LILEEP, Species.ANORITH, Species.CRANIDOS, Species.SHIELDON, Species.TIRTOUGA, Species.ARCHEN, Species.ARCTOVISH, Species.ARCTOZOLT, Species.DRACOVISH, Species.DRACOZOLT ], - [TrainerPoolTier.ULTRA_RARE]: [ Species.ROTOM, Species.MELTAN ] + [TrainerPoolTier.COMMON]: [Species.MAGNEMITE, Species.GRIMER, Species.DROWZEE, Species.VOLTORB, Species.KOFFING], + [TrainerPoolTier.UNCOMMON]: [Species.BALTOY, Species.BRONZOR, Species.FERROSEED, Species.KLINK, Species.CHARJABUG, Species.BLIPBUG, Species.HELIOPTILE], + [TrainerPoolTier.RARE]: [Species.ABRA, Species.DITTO, Species.PORYGON, Species.ELEKID, Species.SOLOSIS, Species.GALAR_WEEZING], + [TrainerPoolTier.SUPER_RARE]: [Species.OMANYTE, Species.KABUTO, Species.AERODACTYL, Species.LILEEP, Species.ANORITH, Species.CRANIDOS, Species.SHIELDON, Species.TIRTOUGA, Species.ARCHEN, Species.ARCTOVISH, Species.ARCTOZOLT, Species.DRACOVISH, Species.DRACOZOLT], + [TrainerPoolTier.ULTRA_RARE]: [Species.ROTOM, Species.MELTAN] }), [TrainerType.SMASHER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST), [TrainerType.SNOW_WORKER]: new TrainerConfig(++t).setName("Worker").setHasGenders("Worker Female").setHasDouble("Workers").setMoneyMultiplier(1.7).setEncounterBgm(TrainerType.CLERK).setSpeciesFilter(s => s.isOfType(Type.ICE) || s.isOfType(Type.STEEL)), [TrainerType.STRIKER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST), [TrainerType.SCHOOL_KID]: new TrainerConfig(++t).setMoneyMultiplier(0.75).setEncounterBgm(TrainerType.YOUNGSTER).setHasGenders("School Kid Female", "lass").setHasDouble("School Kids") .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.ODDISH, Species.EXEGGCUTE, Species.TEDDIURSA, Species.WURMPLE, Species.RALTS, Species.SHROOMISH, Species.FLETCHLING ], - [TrainerPoolTier.UNCOMMON]: [ Species.VOLTORB, Species.WHISMUR, Species.MEDITITE, Species.MIME_JR, Species.NYMBLE ], - [TrainerPoolTier.RARE]: [ Species.TANGELA, Species.EEVEE, Species.YANMA ], - [TrainerPoolTier.SUPER_RARE]: [ Species.TADBULB ] + [TrainerPoolTier.COMMON]: [Species.ODDISH, Species.EXEGGCUTE, Species.TEDDIURSA, Species.WURMPLE, Species.RALTS, Species.SHROOMISH, Species.FLETCHLING], + [TrainerPoolTier.UNCOMMON]: [Species.VOLTORB, Species.WHISMUR, Species.MEDITITE, Species.MIME_JR, Species.NYMBLE], + [TrainerPoolTier.RARE]: [Species.TANGELA, Species.EEVEE, Species.YANMA], + [TrainerPoolTier.SUPER_RARE]: [Species.TADBULB] }), [TrainerType.SWIMMER]: new TrainerConfig(++t).setMoneyMultiplier(1.3).setEncounterBgm(TrainerType.PARASOL_LADY).setHasGenders("Swimmer Female").setHasDouble("Swimmers").setSpecialtyTypes(Type.WATER).setSpeciesFilter(s => s.isOfType(Type.WATER)), [TrainerType.TWINS]: new TrainerConfig(++t).setDoubleOnly().setMoneyMultiplier(0.65).setUseSameSeedForAllMembers() .setPartyTemplateFunc(scene => getWavePartyTemplate(scene, trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_STRONG)) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.PLUSLE, Species.VOLBEAT, Species.PACHIRISU, Species.SILCOON, Species.METAPOD, Species.IGGLYBUFF, Species.PETILIL, Species.EEVEE ])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.MINUN, Species.ILLUMISE, Species.EMOLGA, Species.CASCOON, Species.KAKUNA, Species.CLEFFA, Species.COTTONEE, Species.EEVEE ], TrainerSlot.TRAINER_PARTNER)) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.PLUSLE, Species.VOLBEAT, Species.PACHIRISU, Species.SILCOON, Species.METAPOD, Species.IGGLYBUFF, Species.PETILIL, Species.EEVEE])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.MINUN, Species.ILLUMISE, Species.EMOLGA, Species.CASCOON, Species.KAKUNA, Species.CLEFFA, Species.COTTONEE, Species.EEVEE], TrainerSlot.TRAINER_PARTNER)) .setEncounterBgm(TrainerType.TWINS), [TrainerType.VETERAN]: new TrainerConfig(++t).setHasGenders("Veteran Female").setHasDouble("Veteran Duo").setMoneyMultiplier(2.5).setEncounterBgm(TrainerType.ACE_TRAINER).setSpeciesFilter(s => s.isOfType(Type.DRAGON)), [TrainerType.WAITER]: new TrainerConfig(++t).setHasGenders("Waitress").setHasDouble("Restaurant Staff").setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.CLERK) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.CLEFFA, Species.CHATOT, Species.PANSAGE, Species.PANSEAR, Species.PANPOUR, Species.MINCCINO ], - [TrainerPoolTier.UNCOMMON]: [ Species.TROPIUS, Species.PETILIL, Species.BOUNSWEET, Species.INDEEDEE ], - [TrainerPoolTier.RARE]: [ Species.APPLIN, Species.SINISTEA, Species.POLTCHAGEIST ] + [TrainerPoolTier.COMMON]: [Species.CLEFFA, Species.CHATOT, Species.PANSAGE, Species.PANSEAR, Species.PANPOUR, Species.MINCCINO], + [TrainerPoolTier.UNCOMMON]: [Species.TROPIUS, Species.PETILIL, Species.BOUNSWEET, Species.INDEEDEE], + [TrainerPoolTier.RARE]: [Species.APPLIN, Species.SINISTEA, Species.POLTCHAGEIST] }), [TrainerType.WORKER]: new TrainerConfig(++t).setHasGenders("Worker Female").setHasDouble("Workers").setEncounterBgm(TrainerType.CLERK).setMoneyMultiplier(1.7).setSpeciesFilter(s => s.isOfType(Type.ROCK) || s.isOfType(Type.STEEL)), [TrainerType.YOUNGSTER]: new TrainerConfig(++t).setMoneyMultiplier(0.5).setEncounterBgm(TrainerType.YOUNGSTER).setHasGenders("Lass", "lass").setHasDouble("Beginners").setPartyTemplates(trainerPartyTemplates.TWO_WEAKER) .setSpeciesPools( - [ Species.CATERPIE, Species.WEEDLE, Species.RATTATA, Species.SENTRET, Species.POOCHYENA, Species.ZIGZAGOON, Species.WURMPLE, Species.BIDOOF, Species.PATRAT, Species.LILLIPUP ] + [Species.CATERPIE, Species.WEEDLE, Species.RATTATA, Species.SENTRET, Species.POOCHYENA, Species.ZIGZAGOON, Species.WURMPLE, Species.BIDOOF, Species.PATRAT, Species.LILLIPUP] ), - [TrainerType.BROCK]: new TrainerConfig((t = TrainerType.BROCK)).initForGymLeader([ Species.GEODUDE, Species.ONIX ], Type.ROCK).setBattleBgm("battle_kanto_gym"), - [TrainerType.MISTY]: new TrainerConfig(++t).initForGymLeader([ Species.STARYU, Species.PSYDUCK ], Type.WATER).setBattleBgm("battle_kanto_gym"), - [TrainerType.LT_SURGE]: new TrainerConfig(++t).initForGymLeader([ Species.VOLTORB, Species.PIKACHU, Species.ELECTABUZZ ], Type.ELECTRIC).setBattleBgm("battle_kanto_gym"), - [TrainerType.ERIKA]: new TrainerConfig(++t).initForGymLeader([ Species.ODDISH, Species.BELLSPROUT, Species.TANGELA, Species.HOPPIP ], Type.GRASS).setBattleBgm("battle_kanto_gym"), - [TrainerType.JANINE]: new TrainerConfig(++t).initForGymLeader([ Species.VENONAT, Species.SPINARAK, Species.ZUBAT ], Type.POISON).setBattleBgm("battle_kanto_gym"), - [TrainerType.SABRINA]: new TrainerConfig(++t).initForGymLeader([ Species.ABRA, Species.MR_MIME, Species.ESPEON ], Type.PSYCHIC).setBattleBgm("battle_kanto_gym"), - [TrainerType.BLAINE]: new TrainerConfig(++t).initForGymLeader([ Species.GROWLITHE, Species.PONYTA, Species.MAGMAR ], Type.FIRE).setBattleBgm("battle_kanto_gym"), - [TrainerType.GIOVANNI]: new TrainerConfig(++t).initForGymLeader([ Species.SANDILE, Species.MURKROW, Species.NIDORAN_M, Species.NIDORAN_F ], Type.DARK).setBattleBgm("battle_kanto_gym"), - [TrainerType.FALKNER]: new TrainerConfig(++t).initForGymLeader([ Species.PIDGEY, Species.HOOTHOOT, Species.DODUO ], Type.FLYING).setBattleBgm("battle_johto_gym"), - [TrainerType.BUGSY]: new TrainerConfig(++t).initForGymLeader([ Species.SCYTHER, Species.HERACROSS, Species.SHUCKLE, Species.PINSIR ], Type.BUG).setBattleBgm("battle_johto_gym"), - [TrainerType.WHITNEY]: new TrainerConfig(++t).initForGymLeader([ Species.GIRAFARIG, Species.MILTANK ], Type.NORMAL).setBattleBgm("battle_johto_gym"), - [TrainerType.MORTY]: new TrainerConfig(++t).initForGymLeader([ Species.GASTLY, Species.MISDREAVUS, Species.SABLEYE ], Type.GHOST).setBattleBgm("battle_johto_gym"), - [TrainerType.CHUCK]: new TrainerConfig(++t).initForGymLeader([ Species.POLIWRATH, Species.MANKEY ], Type.FIGHTING).setBattleBgm("battle_johto_gym"), - [TrainerType.JASMINE]: new TrainerConfig(++t).initForGymLeader([ Species.MAGNEMITE, Species.STEELIX ], Type.STEEL).setBattleBgm("battle_johto_gym"), - [TrainerType.PRYCE]: new TrainerConfig(++t).initForGymLeader([ Species.SEEL, Species.SWINUB ], Type.ICE).setBattleBgm("battle_johto_gym"), - [TrainerType.CLAIR]: new TrainerConfig(++t).initForGymLeader([ Species.DRATINI, Species.HORSEA, Species.GYARADOS ], Type.DRAGON).setBattleBgm("battle_johto_gym"), - [TrainerType.ROXANNE]: new TrainerConfig(++t).initForGymLeader([ Species.GEODUDE, Species.NOSEPASS ], Type.ROCK).setBattleBgm("battle_hoenn_gym"), - [TrainerType.BRAWLY]: new TrainerConfig(++t).initForGymLeader([ Species.MACHOP, Species.MAKUHITA ], Type.FIGHTING).setBattleBgm("battle_hoenn_gym"), - [TrainerType.WATTSON]: new TrainerConfig(++t).initForGymLeader([ Species.MAGNEMITE, Species.VOLTORB, Species.ELECTRIKE ], Type.ELECTRIC).setBattleBgm("battle_hoenn_gym"), - [TrainerType.FLANNERY]: new TrainerConfig(++t).initForGymLeader([ Species.SLUGMA, Species.TORKOAL, Species.NUMEL ], Type.FIRE).setBattleBgm("battle_hoenn_gym"), - [TrainerType.NORMAN]: new TrainerConfig(++t).initForGymLeader([ Species.SLAKOTH, Species.SPINDA, Species.CHANSEY, Species.KANGASKHAN ], Type.NORMAL).setBattleBgm("battle_hoenn_gym"), - [TrainerType.WINONA]: new TrainerConfig(++t).initForGymLeader([ Species.SWABLU, Species.WINGULL, Species.TROPIUS, Species.SKARMORY ], Type.FLYING).setBattleBgm("battle_hoenn_gym"), - [TrainerType.TATE]: new TrainerConfig(++t).initForGymLeader([ Species.SOLROCK, Species.NATU, Species.CHIMECHO, Species.GALLADE ], Type.PSYCHIC).setBattleBgm("battle_hoenn_gym"), - [TrainerType.LIZA]: new TrainerConfig(++t).initForGymLeader([ Species.LUNATONE, Species.SPOINK, Species.BALTOY, Species.GARDEVOIR ], Type.PSYCHIC).setBattleBgm("battle_hoenn_gym"), - [TrainerType.JUAN]: new TrainerConfig(++t).initForGymLeader([ Species.HORSEA, Species.BARBOACH, Species.SPHEAL, Species.RELICANTH ], Type.WATER).setBattleBgm("battle_hoenn_gym"), - [TrainerType.ROARK]: new TrainerConfig(++t).initForGymLeader([ Species.CRANIDOS, Species.LARVITAR, Species.GEODUDE ], Type.ROCK).setBattleBgm("battle_sinnoh_gym"), - [TrainerType.GARDENIA]: new TrainerConfig(++t).initForGymLeader([ Species.ROSELIA, Species.TANGELA, Species.TURTWIG ], Type.GRASS).setBattleBgm("battle_sinnoh_gym"), - [TrainerType.MAYLENE]: new TrainerConfig(++t).initForGymLeader([ Species.LUCARIO, Species.MEDITITE, Species.CHIMCHAR ], Type.FIGHTING).setBattleBgm("battle_sinnoh_gym"), - [TrainerType.CRASHER_WAKE]: new TrainerConfig(++t).initForGymLeader([ Species.BUIZEL, Species.MAGIKARP, Species.PIPLUP ], Type.WATER).setBattleBgm("battle_sinnoh_gym"), - [TrainerType.FANTINA]: new TrainerConfig(++t).initForGymLeader([ Species.MISDREAVUS, Species.DRIFLOON, Species.SPIRITOMB ], Type.GHOST).setBattleBgm("battle_sinnoh_gym"), - [TrainerType.BYRON]: new TrainerConfig(++t).initForGymLeader([ Species.SHIELDON, Species.BRONZOR, Species.AGGRON ], Type.STEEL).setBattleBgm("battle_sinnoh_gym"), - [TrainerType.CANDICE]: new TrainerConfig(++t).initForGymLeader([ Species.SNEASEL, Species.SNOVER, Species.SNORUNT ], Type.ICE).setBattleBgm("battle_sinnoh_gym"), - [TrainerType.VOLKNER]: new TrainerConfig(++t).initForGymLeader([ Species.SHINX, Species.CHINCHOU, Species.ROTOM ], Type.ELECTRIC).setBattleBgm("battle_sinnoh_gym"), - [TrainerType.CILAN]: new TrainerConfig(++t).initForGymLeader([ Species.PANSAGE, Species.COTTONEE, Species.PETILIL ], Type.GRASS), - [TrainerType.CHILI]: new TrainerConfig(++t).initForGymLeader([ Species.PANSEAR, Species.DARUMAKA, Species.HEATMOR ], Type.FIRE), - [TrainerType.CRESS]: new TrainerConfig(++t).initForGymLeader([ Species.PANPOUR, Species.BASCULIN, Species.TYMPOLE ], Type.WATER), - [TrainerType.CHEREN]: new TrainerConfig(++t).initForGymLeader([ Species.LILLIPUP, Species.MINCCINO, Species.PATRAT ], Type.NORMAL), - [TrainerType.LENORA]: new TrainerConfig(++t).initForGymLeader([ Species.KANGASKHAN, Species.DEERLING, Species.AUDINO ], Type.NORMAL), - [TrainerType.ROXIE]: new TrainerConfig(++t).initForGymLeader([ Species.VENIPEDE, Species.TRUBBISH, Species.SKORUPI ], Type.POISON), - [TrainerType.BURGH]: new TrainerConfig(++t).initForGymLeader([ Species.SEWADDLE, Species.SHELMET, Species.KARRABLAST ], Type.BUG), - [TrainerType.ELESA]: new TrainerConfig(++t).initForGymLeader([ Species.EMOLGA, Species.BLITZLE, Species.JOLTIK ], Type.ELECTRIC), - [TrainerType.CLAY]: new TrainerConfig(++t).initForGymLeader([ Species.DRILBUR, Species.SANDILE, Species.GOLETT ], Type.GROUND), - [TrainerType.SKYLA]: new TrainerConfig(++t).initForGymLeader([ Species.DUCKLETT, Species.WOOBAT, Species.RUFFLET ], Type.FLYING), - [TrainerType.BRYCEN]: new TrainerConfig(++t).initForGymLeader([ Species.CRYOGONAL, Species.VANILLITE, Species.CUBCHOO ], Type.ICE), - [TrainerType.DRAYDEN]: new TrainerConfig(++t).initForGymLeader([ Species.DRUDDIGON, Species.AXEW, Species.DEINO ], Type.DRAGON), - [TrainerType.MARLON]: new TrainerConfig(++t).initForGymLeader([ Species.WAILMER, Species.FRILLISH, Species.TIRTOUGA ], Type.WATER), - [TrainerType.VIOLA]: new TrainerConfig(++t).initForGymLeader([ Species.SURSKIT, Species.SCATTERBUG ], Type.BUG), - [TrainerType.GRANT]: new TrainerConfig(++t).initForGymLeader([ Species.AMAURA, Species.TYRUNT ], Type.ROCK), - [TrainerType.KORRINA]: new TrainerConfig(++t).initForGymLeader([ Species.HAWLUCHA, Species.LUCARIO, Species.MIENFOO ], Type.FIGHTING), - [TrainerType.RAMOS]: new TrainerConfig(++t).initForGymLeader([ Species.SKIDDO, Species.HOPPIP, Species.BELLSPROUT ], Type.GRASS), - [TrainerType.CLEMONT]: new TrainerConfig(++t).initForGymLeader([ Species.HELIOPTILE, Species.MAGNEMITE, Species.EMOLGA ], Type.ELECTRIC), - [TrainerType.VALERIE]: new TrainerConfig(++t).initForGymLeader([ Species.SYLVEON, Species.MAWILE, Species.MR_MIME ], Type.FAIRY), - [TrainerType.OLYMPIA]: new TrainerConfig(++t).initForGymLeader([ Species.ESPURR, Species.SIGILYPH, Species.SLOWKING ], Type.PSYCHIC), - [TrainerType.WULFRIC]: new TrainerConfig(++t).initForGymLeader([ Species.BERGMITE, Species.SNOVER, Species.CRYOGONAL ], Type.ICE), - [TrainerType.MILO]: new TrainerConfig(++t).initForGymLeader([ Species.GOSSIFLEUR, Species.APPLIN, Species.BOUNSWEET ], Type.GRASS), - [TrainerType.NESSA]: new TrainerConfig(++t).initForGymLeader([ Species.CHEWTLE, Species.ARROKUDA, Species.WIMPOD ], Type.WATER), - [TrainerType.KABU]: new TrainerConfig(++t).initForGymLeader([ Species.SIZZLIPEDE, Species.VULPIX, Species.TORKOAL ], Type.FIRE), - [TrainerType.BEA]: new TrainerConfig(++t).initForGymLeader([ Species.GALAR_FARFETCHD, Species.MACHOP, Species.CLOBBOPUS ], Type.FIGHTING), - [TrainerType.ALLISTER]: new TrainerConfig(++t).initForGymLeader([ Species.GALAR_YAMASK, Species.GALAR_CORSOLA, Species.GASTLY ], Type.GHOST), - [TrainerType.OPAL]: new TrainerConfig(++t).initForGymLeader([ Species.MILCERY, Species.TOGETIC, Species.GALAR_WEEZING ], Type.FAIRY), - [TrainerType.BEDE]: new TrainerConfig(++t).initForGymLeader([ Species.HATENNA, Species.GALAR_PONYTA, Species.GARDEVOIR ], Type.FAIRY), - [TrainerType.GORDIE]: new TrainerConfig(++t).initForGymLeader([ Species.ROLYCOLY, Species.STONJOURNER, Species.BINACLE ], Type.ROCK), - [TrainerType.MELONY]: new TrainerConfig(++t).initForGymLeader([ Species.SNOM, Species.GALAR_DARUMAKA, Species.GALAR_MR_MIME ], Type.ICE), - [TrainerType.PIERS]: new TrainerConfig(++t).initForGymLeader([ Species.GALAR_ZIGZAGOON, Species.SCRAGGY, Species.INKAY ], Type.DARK), - [TrainerType.MARNIE]: new TrainerConfig(++t).initForGymLeader([ Species.IMPIDIMP, Species.PURRLOIN, Species.MORPEKO ], Type.DARK), - [TrainerType.RAIHAN]: new TrainerConfig(++t).initForGymLeader([ Species.DURALUDON, Species.TURTONATOR, Species.GOOMY ], Type.DRAGON), - [TrainerType.KATY]: new TrainerConfig(++t).initForGymLeader([ Species.NYMBLE, Species.TAROUNTULA, Species.HERACROSS ], Type.BUG), - [TrainerType.BRASSIUS]: new TrainerConfig(++t).initForGymLeader([ Species.SMOLIV, Species.SHROOMISH, Species.ODDISH ], Type.GRASS), - [TrainerType.IONO]: new TrainerConfig(++t).initForGymLeader([ Species.TADBULB, Species.WATTREL, Species.VOLTORB ], Type.ELECTRIC), - [TrainerType.KOFU]: new TrainerConfig(++t).initForGymLeader([ Species.VELUZA, Species.WIGLETT, Species.WINGULL ], Type.WATER), - [TrainerType.LARRY]: new TrainerConfig(++t).setName("Larry").initForGymLeader([ Species.STARLY, Species.DUNSPARCE, Species.KOMALA ], Type.NORMAL), - [TrainerType.RYME]: new TrainerConfig(++t).initForGymLeader([ Species.GREAVARD, Species.SHUPPET, Species.MIMIKYU ], Type.GHOST), - [TrainerType.TULIP]: new TrainerConfig(++t).initForGymLeader([ Species.GIRAFARIG, Species.FLITTLE, Species.RALTS ], Type.PSYCHIC), - [TrainerType.GRUSHA]: new TrainerConfig(++t).initForGymLeader([ Species.CETODDLE, Species.ALOLA_VULPIX, Species.CUBCHOO ], Type.ICE), - - [TrainerType.LORELEI]: new TrainerConfig((t = TrainerType.LORELEI)).initForEliteFour([ Species.SLOWBRO, Species.LAPRAS, Species.DEWGONG, Species.ALOLA_SANDSLASH ], Type.ICE), - [TrainerType.BRUNO]: new TrainerConfig(++t).initForEliteFour([ Species.ONIX, Species.HITMONCHAN, Species.HITMONLEE, Species.ALOLA_GOLEM ], Type.FIGHTING), - [TrainerType.AGATHA]: new TrainerConfig(++t).initForEliteFour([ Species.GENGAR, Species.ARBOK, Species.CROBAT, Species.ALOLA_MAROWAK ], Type.GHOST), - [TrainerType.LANCE]: new TrainerConfig(++t).setName("Lance").initForEliteFour([ Species.DRAGONITE, Species.GYARADOS, Species.AERODACTYL, Species.ALOLA_EXEGGUTOR ], Type.DRAGON), - [TrainerType.WILL]: new TrainerConfig(++t).initForEliteFour([ Species.XATU, Species.JYNX, Species.SLOWBRO, Species.EXEGGUTOR ], Type.PSYCHIC), - [TrainerType.KOGA]: new TrainerConfig(++t).initForEliteFour([ Species.WEEZING, Species.VENOMOTH, Species.CROBAT, Species.TENTACRUEL ], Type.POISON), - [TrainerType.KAREN]: new TrainerConfig(++t).initForEliteFour([ Species.UMBREON, Species.HONCHKROW, Species.HOUNDOOM, Species.WEAVILE ], Type.DARK), - [TrainerType.SIDNEY]: new TrainerConfig(++t).initForEliteFour([ Species.SHIFTRY, Species.SHARPEDO, Species.ABSOL, Species.ZOROARK ], Type.DARK), - [TrainerType.PHOEBE]: new TrainerConfig(++t).initForEliteFour([ Species.SABLEYE, Species.DUSKNOIR, Species.BANETTE, Species.CHANDELURE ], Type.GHOST), - [TrainerType.GLACIA]: new TrainerConfig(++t).initForEliteFour([ Species.GLALIE, Species.WALREIN, Species.FROSLASS, Species.ABOMASNOW ], Type.ICE), - [TrainerType.DRAKE]: new TrainerConfig(++t).initForEliteFour([ Species.ALTARIA, Species.SALAMENCE, Species.FLYGON, Species.KINGDRA ], Type.DRAGON), - [TrainerType.AARON]: new TrainerConfig(++t).initForEliteFour([ Species.SCIZOR, Species.HERACROSS, Species.VESPIQUEN, Species.DRAPION ], Type.BUG), - [TrainerType.BERTHA]: new TrainerConfig(++t).initForEliteFour([ Species.WHISCASH, Species.HIPPOWDON, Species.GLISCOR, Species.RHYPERIOR ], Type.GROUND), - [TrainerType.FLINT]: new TrainerConfig(++t).initForEliteFour([ Species.FLAREON, Species.HOUNDOOM, Species.RAPIDASH, Species.INFERNAPE ], Type.FIRE), - [TrainerType.LUCIAN]: new TrainerConfig(++t).initForEliteFour([ Species.MR_MIME, Species.GALLADE, Species.BRONZONG, Species.ALAKAZAM ], Type.PSYCHIC), - [TrainerType.SHAUNTAL]: new TrainerConfig(++t).initForEliteFour([ Species.COFAGRIGUS, Species.CHANDELURE, Species.GOLURK, Species.DRIFBLIM ], Type.GHOST), - [TrainerType.MARSHAL]: new TrainerConfig(++t).initForEliteFour([ Species.TIMBURR, Species.MIENFOO, Species.THROH, Species.SAWK ], Type.FIGHTING), - [TrainerType.GRIMSLEY]: new TrainerConfig(++t).initForEliteFour([ Species.LIEPARD, Species.KINGAMBIT, Species.SCRAFTY, Species.KROOKODILE ], Type.DARK), - [TrainerType.CAITLIN]: new TrainerConfig(++t).initForEliteFour([ Species.MUSHARNA, Species.GOTHITELLE, Species.SIGILYPH, Species.REUNICLUS ], Type.PSYCHIC), - [TrainerType.MALVA]: new TrainerConfig(++t).initForEliteFour([ Species.PYROAR, Species.TORKOAL, Species.CHANDELURE, Species.TALONFLAME ], Type.FIRE), - [TrainerType.SIEBOLD]: new TrainerConfig(++t).initForEliteFour([ Species.CLAWITZER, Species.GYARADOS, Species.BARBARACLE, Species.STARMIE ], Type.WATER), - [TrainerType.WIKSTROM]: new TrainerConfig(++t).initForEliteFour([ Species.KLEFKI, Species.PROBOPASS, Species.SCIZOR, Species.AEGISLASH ], Type.STEEL), - [TrainerType.DRASNA]: new TrainerConfig(++t).initForEliteFour([ Species.DRAGALGE, Species.DRUDDIGON, Species.ALTARIA, Species.NOIVERN ], Type.DRAGON), - [TrainerType.HALA]: new TrainerConfig(++t).initForEliteFour([ Species.HARIYAMA, Species.BEWEAR, Species.CRABOMINABLE, Species.POLIWRATH ], Type.FIGHTING), - [TrainerType.MOLAYNE]: new TrainerConfig(++t).initForEliteFour([ Species.KLEFKI, Species.MAGNEZONE, Species.METAGROSS, Species.ALOLA_DUGTRIO ], Type.STEEL), - [TrainerType.OLIVIA]: new TrainerConfig(++t).initForEliteFour([ Species.ARMALDO, Species.CRADILY, Species.ALOLA_GOLEM, Species.LYCANROC ], Type.ROCK), - [TrainerType.ACEROLA]: new TrainerConfig(++t).initForEliteFour([ Species.BANETTE, Species.DRIFBLIM, Species.DHELMISE, Species.PALOSSAND ], Type.GHOST), - [TrainerType.KAHILI]: new TrainerConfig(++t).initForEliteFour([ Species.BRAVIARY, Species.HAWLUCHA, Species.ORICORIO, Species.TOUCANNON ], Type.FLYING), - [TrainerType.RIKA]: new TrainerConfig(++t).initForEliteFour([ Species. WHISCASH, Species.DONPHAN, Species.CAMERUPT, Species.CLODSIRE ], Type.GROUND), - [TrainerType.POPPY]: new TrainerConfig(++t).initForEliteFour([ Species.COPPERAJAH, Species.BRONZONG, Species.CORVIKNIGHT, Species.TINKATON ], Type.STEEL), - [TrainerType.LARRY_ELITE]: new TrainerConfig(++t).setName("Larry").initForEliteFour([ Species.STARAPTOR, Species.FLAMIGO, Species.ALTARIA, Species.TROPIUS ], Type.NORMAL, Type.FLYING), - [TrainerType.HASSEL]: new TrainerConfig(++t).initForEliteFour([ Species.NOIVERN, Species.HAXORUS, Species.DRAGALGE, Species.BAXCALIBUR ], Type.DRAGON), - [TrainerType.CRISPIN]: new TrainerConfig(++t).initForEliteFour([ Species.TALONFLAME, Species.CAMERUPT, Species.MAGMORTAR, Species.BLAZIKEN ], Type.FIRE), - [TrainerType.AMARYS]: new TrainerConfig(++t).initForEliteFour([ Species.SKARMORY, Species.EMPOLEON, Species.SCIZOR, Species.METAGROSS ], Type.STEEL), - [TrainerType.LACEY]: new TrainerConfig(++t).initForEliteFour([ Species.EXCADRILL, Species.PRIMARINA, Species.ALCREMIE, Species.GALAR_SLOWBRO ], Type.FAIRY), - [TrainerType.DRAYTON]: new TrainerConfig(++t).initForEliteFour([ Species.DRAGONITE, Species.ARCHALUDON, Species.FLYGON, Species.SCEPTILE ], Type.DRAGON), + [TrainerType.BROCK]: new TrainerConfig((t = TrainerType.BROCK)).initForGymLeader(signatureSpecies["BROCK"], Type.ROCK).setBattleBgm("battle_kanto_gym"), + [TrainerType.MISTY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MISTY"], Type.WATER).setBattleBgm("battle_kanto_gym"), + [TrainerType.LT_SURGE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["LT_SURGE"], Type.ELECTRIC).setBattleBgm("battle_kanto_gym"), + [TrainerType.ERIKA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ERIKA"], Type.GRASS).setBattleBgm("battle_kanto_gym"), + [TrainerType.JANINE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["JANINE"], Type.POISON).setBattleBgm("battle_kanto_gym"), + [TrainerType.SABRINA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["SABRINA"], Type.PSYCHIC).setBattleBgm("battle_kanto_gym"), + [TrainerType.BLAINE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BLAINE"], Type.FIRE).setBattleBgm("battle_kanto_gym"), + [TrainerType.GIOVANNI]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GIOVANNI"], Type.DARK).setBattleBgm("battle_kanto_gym"), + [TrainerType.FALKNER]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["FALKNER"], Type.FLYING).setBattleBgm("battle_johto_gym"), + [TrainerType.BUGSY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BUGSY"], Type.BUG).setBattleBgm("battle_johto_gym"), + [TrainerType.WHITNEY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["WHITNEY"], Type.NORMAL).setBattleBgm("battle_johto_gym"), + [TrainerType.MORTY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MORTY"], Type.GHOST).setBattleBgm("battle_johto_gym"), + [TrainerType.CHUCK]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CHUCK"], Type.FIGHTING).setBattleBgm("battle_johto_gym"), + [TrainerType.JASMINE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["JASMINE"], Type.STEEL).setBattleBgm("battle_johto_gym"), + [TrainerType.PRYCE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["PRYCE"], Type.ICE).setBattleBgm("battle_johto_gym"), + [TrainerType.CLAIR]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CLAIR"], Type.DRAGON).setBattleBgm("battle_johto_gym"), + [TrainerType.ROXANNE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ROXANNE"], Type.ROCK).setBattleBgm("battle_hoenn_gym"), + [TrainerType.BRAWLY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BRAWLY"], Type.FIGHTING).setBattleBgm("battle_hoenn_gym"), + [TrainerType.WATTSON]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["WATTSON"], Type.ELECTRIC).setBattleBgm("battle_hoenn_gym"), + [TrainerType.FLANNERY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["FLANNERY"], Type.FIRE).setBattleBgm("battle_hoenn_gym"), + [TrainerType.NORMAN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["NORMAN"], Type.NORMAL).setBattleBgm("battle_hoenn_gym"), + [TrainerType.WINONA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["WINONA"], Type.FLYING).setBattleBgm("battle_hoenn_gym"), + [TrainerType.TATE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["TATE"], Type.PSYCHIC).setBattleBgm("battle_hoenn_gym").setHasDouble("tate_liza_double").setDoubleTrainerType(TrainerType.LIZA).setDoubleTitle("gym_leader_double"), + [TrainerType.LIZA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["LIZA"], Type.PSYCHIC).setBattleBgm("battle_hoenn_gym").setHasDouble("liza_tate_double").setDoubleTrainerType(TrainerType.TATE).setDoubleTitle("gym_leader_double"), + [TrainerType.JUAN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["JUAN"], Type.WATER).setBattleBgm("battle_hoenn_gym"), + [TrainerType.ROARK]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ROARK"], Type.ROCK).setBattleBgm("battle_sinnoh_gym"), + [TrainerType.GARDENIA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GARDENIA"], Type.GRASS).setBattleBgm("battle_sinnoh_gym"), + [TrainerType.MAYLENE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MAYLENE"], Type.FIGHTING).setBattleBgm("battle_sinnoh_gym"), + [TrainerType.CRASHER_WAKE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CRASHER_WAKE"], Type.WATER).setBattleBgm("battle_sinnoh_gym"), + [TrainerType.FANTINA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["FANTINA"], Type.GHOST).setBattleBgm("battle_sinnoh_gym"), + [TrainerType.BYRON]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BYRON"], Type.STEEL).setBattleBgm("battle_sinnoh_gym"), + [TrainerType.CANDICE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CANDICE"], Type.ICE).setBattleBgm("battle_sinnoh_gym"), + [TrainerType.VOLKNER]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["VOLKNER"], Type.ELECTRIC).setBattleBgm("battle_sinnoh_gym"), + [TrainerType.CILAN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CILAN"], Type.GRASS), + [TrainerType.CHILI]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CHILI"], Type.FIRE), + [TrainerType.CRESS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CRESS"], Type.WATER), + [TrainerType.CHEREN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CHEREN"], Type.NORMAL), + [TrainerType.LENORA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["LENORA"], Type.NORMAL), + [TrainerType.ROXIE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ROXIE"], Type.POISON), + [TrainerType.BURGH]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BURGH"], Type.BUG), + [TrainerType.ELESA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ELESA"], Type.ELECTRIC), + [TrainerType.CLAY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CLAY"], Type.GROUND), + [TrainerType.SKYLA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["SKYLA"], Type.FLYING), + [TrainerType.BRYCEN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BRYCEN"], Type.ICE), + [TrainerType.DRAYDEN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["DRAYDEN"], Type.DRAGON), + [TrainerType.MARLON]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MARLON"], Type.WATER), + [TrainerType.VIOLA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["VIOLA"], Type.BUG), + [TrainerType.GRANT]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GRANT"], Type.ROCK), + [TrainerType.KORRINA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KORRINA"], Type.FIGHTING), + [TrainerType.RAMOS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["RAMOS"], Type.GRASS), + [TrainerType.CLEMONT]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CLEMONT"], Type.ELECTRIC), + [TrainerType.VALERIE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["VALERIE"], Type.FAIRY), + [TrainerType.OLYMPIA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["OLYMPIA"], Type.PSYCHIC), + [TrainerType.WULFRIC]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["WULFRIC"], Type.ICE), + [TrainerType.MILO]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MILO"], Type.GRASS), + [TrainerType.NESSA]: new TrainerConfig(++t).setName("Nessa").initForGymLeader(signatureSpecies["NESSA"], Type.WATER), + [TrainerType.KABU]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KABU"], Type.FIRE), + [TrainerType.BEA]: new TrainerConfig(++t).setName("Bea").initForGymLeader(signatureSpecies["BEA"], Type.FIGHTING), + [TrainerType.ALLISTER]: new TrainerConfig(++t).setName("Allister").initForGymLeader(signatureSpecies["ALLISTER"], Type.GHOST), + [TrainerType.OPAL]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["OPAL"], Type.FAIRY), + [TrainerType.BEDE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BEDE"], Type.FAIRY), + [TrainerType.GORDIE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GORDIE"], Type.ROCK), + [TrainerType.MELONY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MELONY"], Type.ICE), + [TrainerType.PIERS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["PIERS"], Type.DARK).setHasDouble("piers_marnie_double").setDoubleTrainerType(TrainerType.MARNIE).setDoubleTitle("gym_leader_double"), + [TrainerType.MARNIE]: new TrainerConfig(++t).setName("Marnie").initForGymLeader(signatureSpecies["MARNIE"], Type.DARK).setHasDouble("marnie_piers_double").setDoubleTrainerType(TrainerType.PIERS).setDoubleTitle("gym_leader_double"), + [TrainerType.RAIHAN]: new TrainerConfig(++t).setName("Raihan").initForGymLeader(signatureSpecies["RAIHAN"], Type.DRAGON), + [TrainerType.KATY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KATY"], Type.BUG), + [TrainerType.BRASSIUS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BRASSIUS"], Type.GRASS), + [TrainerType.IONO]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["IONO"], Type.ELECTRIC), + [TrainerType.KOFU]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KOFU"], Type.WATER), + [TrainerType.LARRY]: new TrainerConfig(++t).setName("Larry").initForGymLeader(signatureSpecies["LARRY"], Type.NORMAL), + [TrainerType.RYME]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["RYME"], Type.GHOST), + [TrainerType.TULIP]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["TULIP"], Type.PSYCHIC), + [TrainerType.GRUSHA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GRUSHA"], Type.ICE), - [TrainerType.BLUE]: new TrainerConfig((t = TrainerType.BLUE)).initForChampion([ Species.GYARADOS, Species.MEWTWO, Species.ARCANINE, Species.ALAKAZAM, Species.PIDGEOT ]).setBattleBgm("battle_kanto_champion"), - [TrainerType.RED]: new TrainerConfig(++t).initForChampion([ Species.CHARIZARD, [ Species.LUGIA, Species.HO_OH ], Species.SNORLAX, Species.RAICHU, Species.ESPEON ]).setBattleBgm("battle_johto_champion"), - [TrainerType.LANCE_CHAMPION]: new TrainerConfig(++t).setName("Lance").initForChampion([ Species.DRAGONITE, Species.ZYGARDE, Species.AERODACTYL, Species.KINGDRA, Species.ALOLA_EXEGGUTOR ]).setBattleBgm("battle_johto_champion"), - [TrainerType.STEVEN]: new TrainerConfig(++t).initForChampion([ Species.METAGROSS, [ Species.DIALGA, Species.PALKIA ], Species.SKARMORY, Species.AGGRON, Species.CARBINK ]).setBattleBgm("battle_hoenn_champion"), - [TrainerType.WALLACE]: new TrainerConfig(++t).initForChampion([ Species.MILOTIC, Species.KYOGRE, Species.WHISCASH, Species.WALREIN, Species.LUDICOLO ]).setBattleBgm("battle_hoenn_champion"), - [TrainerType.CYNTHIA]: new TrainerConfig(++t).initForChampion([ Species.SPIRITOMB, Species.GIRATINA, Species.GARCHOMP, Species.MILOTIC, Species.LUCARIO, Species.TOGEKISS ]).setBattleBgm("battle_sinnoh_champion"), - [TrainerType.ALDER]: new TrainerConfig(++t).initForChampion([ Species.VOLCARONA, Species.GROUDON, Species.BOUFFALANT, Species.ACCELGOR, Species.CONKELDURR ]), - [TrainerType.IRIS]: new TrainerConfig(++t).initForChampion([ Species.HAXORUS, Species.YVELTAL, Species.DRUDDIGON, Species.ARON, Species.LAPRAS ]).setBattleBgm("battle_champion_iris"), - [TrainerType.DIANTHA]: new TrainerConfig(++t).initForChampion([ Species.HAWLUCHA, Species.XERNEAS, Species.GOURGEIST, Species.GOODRA, Species.GARDEVOIR ]), - [TrainerType.HAU]: new TrainerConfig(++t).initForChampion([ Species.ALOLA_RAICHU, [ Species.SOLGALEO, Species.LUNALA ], Species.NOIVERN, [ Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA ], Species.CRABOMINABLE ]), - [TrainerType.GEETA]: new TrainerConfig(++t).initForChampion([ Species.GLIMMORA, Species.MIRAIDON, Species.ESPATHRA, Species.VELUZA, Species.KINGAMBIT ]), - [TrainerType.NEMONA]: new TrainerConfig(++t).initForChampion([ Species.LYCANROC, Species.KORAIDON, Species.KOMMO_O, Species.PAWMOT, Species.DUSKNOIR ]), - [TrainerType.KIERAN]: new TrainerConfig(++t).initForChampion([ Species.POLITOED, [ Species.OGERPON, Species.TERAPAGOS ], Species.HYDRAPPLE, Species.PORYGON_Z, Species.GRIMMSNARL ]), - [TrainerType.LEON]: new TrainerConfig(++t).initForChampion([ Species.DRAGAPULT, [ Species.ZACIAN, Species.ZAMAZENTA ], Species.SEISMITOAD, Species.AEGISLASH, Species.CHARIZARD ]), + [TrainerType.LORELEI]: new TrainerConfig((t = TrainerType.LORELEI)).initForEliteFour(signatureSpecies["LORELEI"], Type.ICE), + [TrainerType.BRUNO]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["BRUNO"], Type.FIGHTING), + [TrainerType.AGATHA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["AGATHA"], Type.GHOST), + [TrainerType.LANCE]: new TrainerConfig(++t).setName("Lance").initForEliteFour(signatureSpecies["LANCE"], Type.DRAGON), + [TrainerType.WILL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["WILL"], Type.PSYCHIC), + [TrainerType.KOGA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["KOGA"], Type.POISON), + [TrainerType.KAREN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["KAREN"], Type.DARK), + [TrainerType.SIDNEY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["SIDNEY"], Type.DARK), + [TrainerType.PHOEBE]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["PHOEBE"], Type.GHOST), + [TrainerType.GLACIA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["GLACIA"], Type.ICE), + [TrainerType.DRAKE]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["DRAKE"], Type.DRAGON), + [TrainerType.AARON]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["AARON"], Type.BUG), + [TrainerType.BERTHA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["BERTHA"], Type.GROUND), + [TrainerType.FLINT]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["FLINT"], Type.FIRE), + [TrainerType.LUCIAN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["LUCIAN"], Type.PSYCHIC), + [TrainerType.SHAUNTAL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["SHAUNTAL"], Type.GHOST), + [TrainerType.MARSHAL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["MARSHAL"], Type.FIGHTING), + [TrainerType.GRIMSLEY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["GRIMSLEY"], Type.DARK), + [TrainerType.CAITLIN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["CAITLIN"], Type.PSYCHIC), + [TrainerType.MALVA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["MALVA"], Type.FIRE), + [TrainerType.SIEBOLD]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["SIEBOLD"], Type.WATER), + [TrainerType.WIKSTROM]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["WIKSTROM"], Type.STEEL), + [TrainerType.DRASNA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["DRASNA"], Type.DRAGON), + [TrainerType.HALA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["HALA"], Type.FIGHTING), + [TrainerType.MOLAYNE]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["MOLAYNE"], Type.STEEL), + [TrainerType.OLIVIA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["OLIVIA"], Type.ROCK), + [TrainerType.ACEROLA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["ACEROLA"], Type.GHOST), + [TrainerType.KAHILI]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["KAHILI"], Type.FLYING), + [TrainerType.MARNIE_ELITE]: new TrainerConfig(++t).setName("Marnie").initForEliteFour(signatureSpecies["MARNIE_ELITE"], Type.DARK), + [TrainerType.NESSA_ELITE]: new TrainerConfig(++t).setName("Nessa").initForEliteFour(signatureSpecies["NESSA_ELITE"], Type.WATER), + [TrainerType.BEA_ELITE]: new TrainerConfig(++t).setName("Bea").initForEliteFour(signatureSpecies["BEA_ELITE"], Type.FIGHTING), + [TrainerType.ALLISTER_ELITE]: new TrainerConfig(++t).setName("Allister").initForEliteFour(signatureSpecies["ALLISTER_ELITE"], Type.GHOST), + [TrainerType.RAIHAN_ELITE]: new TrainerConfig(++t).setName("Raihan").initForEliteFour(signatureSpecies["RAIHAN_ELITE"], Type.DRAGON), + [TrainerType.RIKA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["RIKA"], Type.GROUND), + [TrainerType.POPPY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["POPPY"], Type.STEEL), + [TrainerType.LARRY_ELITE]: new TrainerConfig(++t).setName("Larry").initForEliteFour(signatureSpecies["LARRY_ELITE"], Type.NORMAL, Type.FLYING), + [TrainerType.HASSEL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["HASSEL"], Type.DRAGON), + [TrainerType.CRISPIN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["CRISPIN"], Type.FIRE), + [TrainerType.AMARYS]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["AMARYS"], Type.STEEL), + [TrainerType.LACEY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["LACEY"], Type.FAIRY), + [TrainerType.DRAYTON]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["DRAYTON"], Type.DRAGON), + + [TrainerType.BLUE]: new TrainerConfig((t = TrainerType.BLUE)).initForChampion(signatureSpecies["BLUE"]).setBattleBgm("battle_kanto_champion").setHasDouble("blue_red_double").setDoubleTrainerType(TrainerType.RED).setDoubleTitle("champion_double"), + [TrainerType.RED]: new TrainerConfig(++t).initForChampion(signatureSpecies["RED"]).setBattleBgm("battle_johto_champion").setHasDouble("red_blue_double").setDoubleTrainerType(TrainerType.BLUE).setDoubleTitle("champion_double"), + [TrainerType.LANCE_CHAMPION]: new TrainerConfig(++t).setName("Lance").initForChampion(signatureSpecies["LANCE_CHAMPION"]).setBattleBgm("battle_johto_champion"), + [TrainerType.STEVEN]: new TrainerConfig(++t).initForChampion(signatureSpecies["STEVEN"]).setBattleBgm("battle_hoenn_champion").setHasDouble("steven_wallace_double").setDoubleTrainerType(TrainerType.WALLACE).setDoubleTitle("champion_double"), + [TrainerType.WALLACE]: new TrainerConfig(++t).initForChampion(signatureSpecies["WALLACE"]).setBattleBgm("battle_hoenn_champion").setHasDouble("wallace_steven_double").setDoubleTrainerType(TrainerType.STEVEN).setDoubleTitle("champion_double"), + [TrainerType.CYNTHIA]: new TrainerConfig(++t).initForChampion(signatureSpecies["CYNTHIA"]).setBattleBgm("battle_sinnoh_champion"), + [TrainerType.ALDER]: new TrainerConfig(++t).initForChampion(signatureSpecies["ALDER"]).setHasDouble("alder_iris_double").setDoubleTrainerType(TrainerType.IRIS).setDoubleTitle("champion_double").setBattleBgm("battle_champion_alder"), + [TrainerType.IRIS]: new TrainerConfig(++t).initForChampion(signatureSpecies["IRIS"]).setBattleBgm("battle_champion_iris").setHasDouble("iris_alder_double").setDoubleTrainerType(TrainerType.ALDER).setDoubleTitle("champion_double"), + [TrainerType.DIANTHA]: new TrainerConfig(++t).initForChampion(signatureSpecies["DIANTHA"]), + [TrainerType.HAU]: new TrainerConfig(++t).initForChampion(signatureSpecies["HAU"]), + [TrainerType.GEETA]: new TrainerConfig(++t).initForChampion(signatureSpecies["GEETA"]), + [TrainerType.NEMONA]: new TrainerConfig(++t).initForChampion(signatureSpecies["NEMONA"]), + [TrainerType.KIERAN]: new TrainerConfig(++t).initForChampion(signatureSpecies["KIERAN"]), + [TrainerType.LEON]: new TrainerConfig(++t).initForChampion(signatureSpecies["LEON"]), [TrainerType.RIVAL]: new TrainerConfig((t = TrainerType.RIVAL)).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL) .setModifierRewardFuncs(() => modifierTypes.SUPER_EXP_CHARM, () => modifierTypes.EXP_SHARE) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, Species.CHIKORITA, Species.CYNDAQUIL, Species.TOTODILE, Species.TREECKO, Species.TORCHIC, Species.MUDKIP, Species.TURTWIG, Species.CHIMCHAR, Species.PIPLUP, Species.SNIVY, Species.TEPIG, Species.OSHAWOTT, Species.CHESPIN, Species.FENNEKIN, Species.FROAKIE, Species.ROWLET, Species.LITTEN, Species.POPPLIO, Species.GROOKEY, Species.SCORBUNNY, Species.SOBBLE, Species.SPRIGATITO, Species.FUECOCO, Species.QUAXLY ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEY, Species.HOOTHOOT, Species.TAILLOW, Species.STARLY, Species.PIDOVE, Species.FLETCHLING, Species.PIKIPEK, Species.ROOKIDEE, Species.WATTREL ], TrainerSlot.TRAINER, true)), + .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, Species.CHIKORITA, Species.CYNDAQUIL, Species.TOTODILE, Species.TREECKO, Species.TORCHIC, Species.MUDKIP, Species.TURTWIG, Species.CHIMCHAR, Species.PIPLUP, Species.SNIVY, Species.TEPIG, Species.OSHAWOTT, Species.CHESPIN, Species.FENNEKIN, Species.FROAKIE, Species.ROWLET, Species.LITTEN, Species.POPPLIO, Species.GROOKEY, Species.SCORBUNNY, Species.SOBBLE, Species.SPRIGATITO, Species.FUECOCO, Species.QUAXLY], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEY, Species.HOOTHOOT, Species.TAILLOW, Species.STARLY, Species.PIDOVE, Species.FLETCHLING, Species.PIKIPEK, Species.ROOKIDEE, Species.WATTREL], TrainerSlot.TRAINER, true)), [TrainerType.RIVAL_2]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setMoneyMultiplier(1.25).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL_2) .setModifierRewardFuncs(() => modifierTypes.EXP_SHARE) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.IVYSAUR, Species.CHARMELEON, Species.WARTORTLE, Species.BAYLEEF, Species.QUILAVA, Species.CROCONAW, Species.GROVYLE, Species.COMBUSKEN, Species.MARSHTOMP, Species.GROTLE, Species.MONFERNO, Species.PRINPLUP, Species.SERVINE, Species.PIGNITE, Species.DEWOTT, Species.QUILLADIN, Species.BRAIXEN, Species.FROGADIER, Species.DARTRIX, Species.TORRACAT, Species.BRIONNE, Species.THWACKEY, Species.RABOOT, Species.DRIZZILE, Species.FLORAGATO, Species.CROCALOR, Species.QUAXWELL ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOTTO, Species.HOOTHOOT, Species.TAILLOW, Species.STARAVIA, Species.TRANQUILL, Species.FLETCHINDER, Species.TRUMBEAK, Species.CORVISQUIRE, Species.WATTREL ], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.IVYSAUR, Species.CHARMELEON, Species.WARTORTLE, Species.BAYLEEF, Species.QUILAVA, Species.CROCONAW, Species.GROVYLE, Species.COMBUSKEN, Species.MARSHTOMP, Species.GROTLE, Species.MONFERNO, Species.PRINPLUP, Species.SERVINE, Species.PIGNITE, Species.DEWOTT, Species.QUILLADIN, Species.BRAIXEN, Species.FROGADIER, Species.DARTRIX, Species.TORRACAT, Species.BRIONNE, Species.THWACKEY, Species.RABOOT, Species.DRIZZILE, Species.FLORAGATO, Species.CROCALOR, Species.QUAXWELL], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEOTTO, Species.HOOTHOOT, Species.TAILLOW, Species.STARAVIA, Species.TRANQUILL, Species.FLETCHINDER, Species.TRUMBEAK, Species.CORVISQUIRE, Species.WATTREL], TrainerSlot.TRAINER, true)) .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)), [TrainerType.RIVAL_3]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL_3) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL ], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL], TrainerSlot.TRAINER, true)) .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)) .setSpeciesFilter(species => species.baseTotal >= 540), [TrainerType.RIVAL_4]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setBoss().setStaticParty().setMoneyMultiplier(1.75).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival_2").setPartyTemplates(trainerPartyTemplates.RIVAL_4) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true)) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL ], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL], TrainerSlot.TRAINER, true)) .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)) .setSpeciesFilter(species => species.baseTotal >= 540) .setGenModifiersFunc(party => { const starter = party[0]; - return [ modifierTypes.TERA_SHARD().generateType(null, [ starter.species.type1 ]).withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier ]; + return [modifierTypes.TERA_SHARD().generateType(null, [starter.species.type1]).withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier]; }), [TrainerType.RIVAL_5]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setBoss().setStaticParty().setMoneyMultiplier(2.25).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival_3").setPartyTemplates(trainerPartyTemplates.RIVAL_5) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true, + .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL], TrainerSlot.TRAINER, true, p => p.setBoss(true, 2))) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL ], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL], TrainerSlot.TRAINER, true)) .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)) .setSpeciesFilter(species => species.baseTotal >= 540) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.RAYQUAZA ], TrainerSlot.TRAINER, true, p => { + .setPartyMemberFunc(5, getRandomPartyMemberFunc([Species.RAYQUAZA], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 3); p.pokeball = PokeballType.MASTER_BALL; p.shiny = true; @@ -1022,22 +1244,22 @@ export const trainerConfigs: TrainerConfigs = { })) .setGenModifiersFunc(party => { const starter = party[0]; - return [ modifierTypes.TERA_SHARD().generateType(null, [ starter.species.type1 ]).withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier ]; + return [modifierTypes.TERA_SHARD().generateType(null, [starter.species.type1]).withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier]; }), [TrainerType.RIVAL_6]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setBoss().setStaticParty().setMoneyMultiplier(3).setEncounterBgm("final").setBattleBgm("battle_rival_3").setPartyTemplates(trainerPartyTemplates.RIVAL_6) - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true, + .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 3); p.generateAndPopulateMoveset(); })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL ], TrainerSlot.TRAINER, true, + .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); })) .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)) .setSpeciesFilter(species => species.baseTotal >= 540) - .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.RAYQUAZA ], TrainerSlot.TRAINER, true, p => { + .setPartyMemberFunc(5, getRandomPartyMemberFunc([Species.RAYQUAZA], TrainerSlot.TRAINER, true, p => { p.setBoss(); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.MASTER_BALL; @@ -1047,10 +1269,6 @@ export const trainerConfigs: TrainerConfigs = { })) .setGenModifiersFunc(party => { const starter = party[0]; - return [ modifierTypes.TERA_SHARD().generateType(null, [ starter.species.type1 ]).withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier ]; + return [modifierTypes.TERA_SHARD().generateType(null, [starter.species.type1]).withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier]; }), }; - -(function () { - initTrainerTypeDialogue(); -})(); diff --git a/src/data/trainer-names.ts b/src/data/trainer-names.ts index 7583d1605c6..e85ee93d96f 100644 --- a/src/data/trainer-names.ts +++ b/src/data/trainer-names.ts @@ -174,7 +174,7 @@ function fetchAndPopulateTrainerNames(url: string, parser: DOMParser, trainerNam populateTrainerNamePromises.push(new Promise(resolve => { const trainerType = t; trainerTypeNames[trainerType] = []; - + const config = trainerNameConfigs[t] as TrainerNameConfig; const trainerNames = new Set(); const femaleTrainerNames = new Set(); diff --git a/src/data/type.ts b/src/data/type.ts index f4a7839e327..b2bf8117249 100644 --- a/src/data/type.ts +++ b/src/data/type.ts @@ -498,47 +498,47 @@ export function getTypeDamageMultiplier(attackType: integer, defType: integer): } case Type.STELLAR: return 1; - } + } } export function getTypeRgb(type: Type): [ integer, integer, integer ] { switch (type) { case Type.NORMAL: - return [ 168, 168, 120 ]; + return [ 168, 168, 120 ]; case Type.FIGHTING: - return [ 192, 48, 40 ]; + return [ 192, 48, 40 ]; case Type.FLYING: - return [ 168, 144, 240 ]; + return [ 168, 144, 240 ]; case Type.POISON: - return [ 160, 64, 160 ]; + return [ 160, 64, 160 ]; case Type.GROUND: - return [ 224, 192, 104 ]; + return [ 224, 192, 104 ]; case Type.ROCK: - return [ 184, 160, 56 ]; + return [ 184, 160, 56 ]; case Type.BUG: return [ 168, 184, 32 ]; case Type.GHOST: - return [ 112, 88, 152 ]; + return [ 112, 88, 152 ]; case Type.STEEL: - return [ 184, 184, 208 ]; + return [ 184, 184, 208 ]; case Type.FIRE: - return [ 240, 128, 48 ]; + return [ 240, 128, 48 ]; case Type.WATER: return [ 104, 144, 240 ]; case Type.GRASS: - return [ 120, 200, 80 ]; + return [ 120, 200, 80 ]; case Type.ELECTRIC: - return [ 248, 208, 48 ]; + return [ 248, 208, 48 ]; case Type.PSYCHIC: - return [ 248, 88, 136 ]; + return [ 248, 88, 136 ]; case Type.ICE: - return [ 152, 216, 216 ]; + return [ 152, 216, 216 ]; case Type.DRAGON: return [ 112, 56, 248 ]; case Type.DARK: return [ 112, 88, 72 ]; case Type.FAIRY: - return [ 232, 136, 200 ]; + return [ 232, 136, 200 ]; case Type.STELLAR: return [ 255, 255, 255 ]; default: diff --git a/src/egg-hatch-phase.ts b/src/egg-hatch-phase.ts index edb0f658905..cf67e5a7566 100644 --- a/src/egg-hatch-phase.ts +++ b/src/egg-hatch-phase.ts @@ -291,7 +291,7 @@ export class EggHatchPhase extends Phase { this.infoContainer.show(this.pokemon, false, this.skipped ? 2 : 1); this.scene.playSoundWithoutBgm("evolution_fanfare"); - + this.scene.ui.showText(`${this.pokemon.name} hatched from the egg!`, null, () => { this.scene.gameData.updateSpeciesDexIvs(this.pokemon.species.speciesId, this.pokemon.ivs); this.scene.gameData.setPokemonCaught(this.pokemon, true, true).then(() => { @@ -374,7 +374,7 @@ export class EggHatchPhase extends Phase { if (this.egg.isManaphyEgg()) { const rand = Utils.randSeedInt(8); - + speciesOverride = rand ? Species.PHIONE : Species.MANAPHY; } else if (this.egg.tier === EggTier.MASTER && this.egg.gachaType === GachaType.LEGENDARY) { @@ -451,14 +451,14 @@ export class EggHatchPhase extends Phase { for (let s = 0; s < ret.ivs.length; s++) { ret.ivs[s] = Math.max(ret.ivs[s], secondaryIvs[s]); } - + const baseChance = this.egg.gachaType === GachaType.MOVE ? 3 : 6; this.eggMoveIndex = Utils.randSeedInt(baseChance * Math.pow(2, 3 - this.egg.tier)) ? Utils.randSeedInt(3) : 3; }, this.egg.id, EGG_SEED.toString()); - + return ret; } } diff --git a/src/evolution-phase.ts b/src/evolution-phase.ts index 57b16ec5664..29382807ccb 100644 --- a/src/evolution-phase.ts +++ b/src/evolution-phase.ts @@ -14,7 +14,7 @@ import i18next from "i18next"; export class EvolutionPhase extends Phase { protected pokemon: PlayerPokemon; protected lastLevel: integer; - + private evolution: SpeciesFormEvolution; protected evolutionContainer: Phaser.GameObjects.Container; @@ -117,7 +117,7 @@ export class EvolutionPhase extends Phase { doEvolution(): void { const evolutionHandler = this.scene.ui.getHandler() as EvolutionSceneHandler; const preName = this.pokemon.name; - + this.scene.ui.showText(i18next.t("menu:evolving", { pokemonName: preName }), null, () => { this.pokemon.cry(); @@ -211,7 +211,7 @@ export class EvolutionPhase extends Phase { }, null, true); return; } - + this.scene.playSound("sparkle"); this.pokemonEvoSprite.setVisible(true); this.doCircleInward(); @@ -222,7 +222,7 @@ export class EvolutionPhase extends Phase { const levelMoves = this.pokemon.getLevelMoves(this.lastLevel + 1, true); for (const lm of levelMoves) { this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.scene.getParty().indexOf(this.pokemon), lm[1])); - } + } this.scene.unshiftPhase(new EndEvolutionPhase(this.scene)); this.scene.playSound("shine"); @@ -252,7 +252,7 @@ export class EvolutionPhase extends Phase { this.pokemon.cry(); this.scene.time.delayedCall(1250, () => { this.scene.playSoundWithoutBgm("evolution_fanfare"); - + evolvedPokemon.destroy(); this.scene.ui.showText(i18next.t("menu:evolutionDone", { pokemonName: preName, evolvedPokemonName: this.pokemon.name }), null, () => this.end(), null, true, Utils.fixedInt(4000)); this.scene.time.delayedCall(Utils.fixedInt(4250), () => this.scene.playBgm()); @@ -280,7 +280,7 @@ export class EvolutionPhase extends Phase { doSpiralUpward() { let f = 0; - + this.scene.tweens.addCounter({ repeat: 64, duration: Utils.getFrameMs(1), @@ -299,7 +299,7 @@ export class EvolutionPhase extends Phase { doArcDownward() { let f = 0; - + this.scene.tweens.addCounter({ repeat: 96, duration: Utils.getFrameMs(1), @@ -350,7 +350,7 @@ export class EvolutionPhase extends Phase { doCircleInward() { let f = 0; - + this.scene.tweens.addCounter({ repeat: 48, duration: Utils.getFrameMs(1), @@ -371,7 +371,7 @@ export class EvolutionPhase extends Phase { doSpray() { let f = 0; - + this.scene.tweens.addCounter({ repeat: 48, duration: Utils.getFrameMs(1), diff --git a/src/field/anims.ts b/src/field/anims.ts index 0e6bef565f5..52a15aa4f20 100644 --- a/src/field/anims.ts +++ b/src/field/anims.ts @@ -24,12 +24,14 @@ export function addPokeballOpenParticles(scene: BattleScene, x: number, y: numbe function doDefaultPbOpenParticles(scene: BattleScene, x: number, y: number, radius: number) { const pbOpenParticlesFrameNames = scene.anims.generateFrameNames("pb_particles", { start: 0, end: 3, suffix: ".png" }); - scene.anims.create({ - key: "pb_open_particle", - frames: pbOpenParticlesFrameNames, - frameRate: 16, - repeat: -1 - }); + if (!(scene.anims.exists("pb_open_particle"))) { + scene.anims.create({ + key: "pb_open_particle", + frames: pbOpenParticlesFrameNames, + frameRate: 16, + repeat: -1 + }); + } const addParticle = (index: integer) => { const particle = scene.add.sprite(x, y, "pb_open_particle"); @@ -108,11 +110,11 @@ function doMbOpenParticles(scene: BattleScene, x: number, y: number) { } function doFanOutParticle(scene: BattleScene, trigIndex: integer, x: integer, y: integer, xSpeed: integer, ySpeed: integer, angle: integer, frameIndex: integer): Phaser.GameObjects.Image { - let f = 0; + let f = 0; const particle = scene.add.image(x, y, "pb_particles", `${frameIndex}.png`); scene.field.add(particle); - + const updateParticle = () => { if (!particle.scene) { return particleTimer.remove(); diff --git a/src/field/arena.ts b/src/field/arena.ts index 179fdf8d5d9..b00b8054ee2 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -106,7 +106,7 @@ export class Arena { } } } - + ret = getPokemonSpecies(species); if (ret.subLegendary || ret.legendary || ret.mythical) { @@ -292,7 +292,7 @@ export class Arena { if (Overrides.WEATHER_OVERRIDE) { return this.trySetWeatherOverride(Overrides.WEATHER_OVERRIDE); } - + if (this.weather?.weatherType === (weather || undefined)) { return false; } @@ -300,7 +300,7 @@ export class Arena { const oldWeatherType = this.weather?.weatherType || WeatherType.NONE; this.weather = weather ? new Weather(weather, hasPokemonSource ? 5 : 0) : null; - + if (this.weather) { this.scene.tryReplacePhase(phase => phase instanceof WeatherEffectPhase && phase.weather.weatherType === oldWeatherType, new WeatherEffectPhase(this.scene, this.weather)); this.scene.unshiftPhase(new CommonAnimPhase(this.scene, undefined, undefined, CommonAnim.SUNNY + (weather - 1))); @@ -314,7 +314,7 @@ export class Arena { pokemon.findAndRemoveTags(t => "weatherTypes" in t && !(t.weatherTypes as WeatherType[]).find(t => t === weather)); applyPostWeatherChangeAbAttrs(PostWeatherChangeAbAttr, pokemon, weather); }); - + return true; } @@ -326,7 +326,7 @@ export class Arena { const oldTerrainType = this.terrain?.terrainType || TerrainType.NONE; this.terrain = terrain ? new Terrain(terrain, hasPokemonSource ? 5 : 0) : null; - + if (this.terrain) { if (!ignoreAnim) { this.scene.unshiftPhase(new CommonAnimPhase(this.scene, undefined, undefined, CommonAnim.MISTY_TERRAIN + (terrain - 1))); @@ -340,7 +340,7 @@ export class Arena { pokemon.findAndRemoveTags(t => "terrainTypes" in t && !(t.terrainTypes as TerrainType[]).find(t => t === terrain)); applyPostTerrainChangeAbAttrs(PostTerrainChangeAbAttr, pokemon, terrain); }); - + return true; } @@ -506,7 +506,7 @@ export class Arena { } tags.forEach(t => t.apply(this, args)); } - + applyTags(tagType: ArenaTagType | { new(...args: any[]): ArenaTag }, ...args: any[]): void { this.applyTagsForSide(tagType, ArenaTagSide.BOTH, ...args); } @@ -568,8 +568,8 @@ export class Arena { } return !!tag; } - - + + removeAllTags(): void { while (this.tags.length) { this.tags[0].onRemove(this); @@ -720,18 +720,20 @@ export class ArenaBase extends Phaser.GameObjects.Container { const hasProps = getBiomeHasProps(biome); const biomeKey = getBiomeKey(biome); const baseKey = `${biomeKey}_${this.player ? "a" : "b"}`; - + if (biome !== this.biome) { this.base.setTexture(baseKey); if (this.base.texture.frameTotal > 1) { const baseFrameNames = this.scene.anims.generateFrameNames(baseKey, { zeroPad: 4, suffix: ".png", start: 1, end: this.base.texture.frameTotal - 1 }); - this.scene.anims.create({ - key: baseKey, - frames: baseFrameNames, - frameRate: 12, - repeat: -1 - }); + if (!(this.scene.anims.exists(baseKey))) { + this.scene.anims.create({ + key: baseKey, + frames: baseFrameNames, + frameRate: 12, + repeat: -1 + }); + } this.base.play(baseKey); } else { this.base.stop(); @@ -751,12 +753,14 @@ export class ArenaBase extends Phaser.GameObjects.Container { if (hasProps && prop.texture.frameTotal > 1) { const propFrameNames = this.scene.anims.generateFrameNames(propKey, { zeroPad: 4, suffix: ".png", start: 1, end: prop.texture.frameTotal - 1 }); - this.scene.anims.create({ - key: propKey, - frames: propFrameNames, - frameRate: 12, - repeat: -1 - }); + if (!(this.scene.anims.exists(propKey))) { + this.scene.anims.create({ + key: propKey, + frames: propFrameNames, + frameRate: 12, + repeat: -1 + }); + } prop.play(propKey); } else { prop.stop(); diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index b565c3b8ae2..4282d7cda13 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -4,7 +4,7 @@ import { Variant, VariantSet, variantColorCache } from "#app/data/variant"; import { variantData } from "#app/data/variant"; import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from "../ui/battle-info"; import { Moves } from "../data/enums/moves"; -import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, VariablePowerAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, MultiHitAttr, StatusMoveTypeImmunityAttr, MoveTarget, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatChangesAttr, SacrificialAttr, VariableMoveTypeAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit } from "../data/move"; +import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, VariablePowerAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, MultiHitAttr, StatusMoveTypeImmunityAttr, MoveTarget, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatChangesAttr, SacrificialAttr, VariableMoveTypeAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit, MoveFlags } from "../data/move"; import { default as PokemonSpecies, PokemonSpeciesForm, SpeciesFormKey, getFusedSpeciesName, getPokemonSpecies, getPokemonSpeciesForm, getStarterValueFriendshipCap, speciesStarters, starterPassiveAbilities } from "../data/pokemon-species"; import * as Utils from "../utils"; import { Type, TypeDamageMultiplier, getTypeDamageMultiplier, getTypeRgb } from "../data/type"; @@ -61,7 +61,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { public species: PokemonSpecies; public formIndex: integer; public abilityIndex: integer; - public passive: boolean; + public passive: boolean; public shiny: boolean; public variant: Variant; public pokeball: PokeballType; @@ -170,7 +170,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } else { this.id = Utils.randSeedInt(4294967296); this.ivs = ivs || Utils.getIvsFromId(this.id); - + if (this.gender === undefined) { this.generateGender(); } @@ -239,7 +239,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { }; this.setScale(this.getSpriteScale()); - + const sprite = getSprite(true); const tintSprite = getSprite(); @@ -322,12 +322,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { console.warn = () => {}; const battleFrameNames = this.scene.anims.generateFrameNames(this.getBattleSpriteKey(), { zeroPad: 4, suffix: ".png", start: 1, end: 400 }); console.warn = originalWarn; - this.scene.anims.create({ - key: this.getBattleSpriteKey(), - frames: battleFrameNames, - frameRate: 12, - repeat: -1 - }); + if (!(this.scene.anims.exists(this.getBattleSpriteKey()))) { + this.scene.anims.create({ + key: this.getBattleSpriteKey(), + frames: battleFrameNames, + frameRate: 12, + repeat: -1 + }); + } } this.playAnim(); const updateFusionPaletteAndResolve = () => { @@ -524,13 +526,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { shinySparkle.setVisible(false); shinySparkle.setOrigin(0.5, 1); const frameNames = this.scene.anims.generateFrameNames(key, { suffix: ".png", end: 34 }); - this.scene.anims.create({ - key: `sparkle${keySuffix}`, - frames: frameNames, - frameRate: 32, - showOnStart: true, - hideOnComplete: true, - }); + if (!(this.scene.anims.exists(`sparkle${keySuffix}`))) { + this.scene.anims.create({ + key: `sparkle${keySuffix}`, + frames: frameNames, + frameRate: 32, + showOnStart: true, + hideOnComplete: true, + }); + } this.add(shinySparkle); this.shinySparkle = shinySparkle; @@ -549,15 +553,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { try { sprite.play(key); tintSprite.play(key); - } catch(error: unknown) { + } catch (error: unknown) { console.error(`Couldn't play animation for '${key}'!\nIs the image for this Pokemon missing?\n`, error); return false; } - return true; + return true; } - + playAnim(): void { this.tryPlaySprite(this.getSprite(), this.getTintSprite(), this.getBattleSpriteKey()); } @@ -662,7 +666,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { break; case Stat.SPD: // Check both the player and enemy to see if Tailwind should be multiplying the speed of the Pokemon - if ((this.isPlayer() && this.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)) + if ((this.isPlayer() && this.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)) || (!this.isPlayer() && this.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.ENEMY))) { ret *= 2; } @@ -842,7 +846,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.summonData.types.forEach(t => types.push(t)); } else { const speciesForm = this.getSpeciesForm(); - + types.push(speciesForm.type1); const fusionSpeciesForm = this.getFusionSpeciesForm(); @@ -933,10 +937,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { starterSpeciesId = pokemonPrevolutions[starterSpeciesId]; } return allAbilities[starterPassiveAbilities[starterSpeciesId]]; - } + } /** - * Checks if a pokemon has a passive either from: + * Checks if a pokemon has a passive either from: * - bought with starter candy * - set by override * - is a boss pokemon @@ -1009,7 +1013,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } /** - * Checks whether a pokemon has an ability with the specified attribute and it's in effect. + * Checks whether a pokemon has an ability with the specified attribute and it's in effect. * Accounts for all the various effects which can affect whether an ability will be present or * in effect, and both passive and non-passive. This is one of the two primary ways to check * whether a pokemon has a particular ability. @@ -1209,7 +1213,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return ret; } - + setMove(moveIndex: integer, moveId: Moves): void { const move = moveId ? new PokemonMove(moveId) : null; this.moveset[moveIndex] = move; @@ -1279,12 +1283,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { && !species.isTrainerForbidden() && species.speciesId !== this.species.speciesId; }; - + this.fusionSpecies = this.scene.randomSpecies(this.scene.currentBattle?.waveIndex || 0, this.level, false, filter, true); this.fusionAbilityIndex = (this.fusionSpecies.abilityHidden && hasHiddenAbility ? this.fusionSpecies.ability2 ? 2 : 1 : this.fusionSpecies.ability2 ? randAbilityIndex : 0); this.fusionShiny = this.shiny; this.fusionVariant = this.variant; - + if (this.fusionSpecies.malePercent === null) { this.fusionGender = Gender.GENDERLESS; } else { @@ -1330,10 +1334,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { break; } let weight = levelMove[0]; - if (weight === 0){ // Evo Moves + if (weight === 0) { // Evo Moves weight = 50; } - if (weight === 1 && allMoves[levelMove[1]].power >= 80){ // Assume level 1 moves with 80+ BP are "move reminder" moves and bump their weight + if (weight === 1 && allMoves[levelMove[1]].power >= 80) { // Assume level 1 moves with 80+ BP are "move reminder" moves and bump their weight weight = 40; } if (allMoves[levelMove[1]].name.endsWith(" (N)")) { @@ -1379,7 +1383,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } const moveId = speciesEggMoves[this.species.getRootSpeciesId()][3]; - if (this.level >= 170 && !movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(" (N)") && !this.isBoss()){ // No rare egg moves before e4 + if (this.level >= 170 && !movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(" (N)") && !this.isBoss()) { // No rare egg moves before e4 movePool.push([moveId, 30]); } if (this.fusionSpecies) { @@ -1390,14 +1394,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } const moveId = speciesEggMoves[this.fusionSpecies.getRootSpeciesId()][3]; - if (this.level >= 170 && !movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(" (N)") && !this.isBoss()){// No rare egg moves before e4 + if (this.level >= 170 && !movePool.some(m => m[0] === moveId) && !allMoves[moveId].name.endsWith(" (N)") && !this.isBoss()) {// No rare egg moves before e4 movePool.push([moveId, 30]); } } } } - if (this.isBoss()){ // Bosses never get self ko moves + if (this.isBoss()) { // Bosses never get self ko moves movePool = movePool.filter(m => !allMoves[m[0]].getAttrs(SacrificialAttr).length); } movePool = movePool.filter(m => !allMoves[m[0]].getAttrs(SacrificialAttrOnHit).length); @@ -1582,7 +1586,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const move = battlerMove.getMove(); const damage = new Utils.NumberHolder(0); const defendingSidePlayField = this.isPlayer() ? this.scene.getPlayerField() : this.scene.getEnemyField(); - + const variableCategory = new Utils.IntegerHolder(move.category); applyMoveAttrs(VariableMoveCategoryAttr, source, this, move, variableCategory); const moveCategory = variableCategory.value as MoveCategory; @@ -1609,6 +1613,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { typeMultiplier.value = 0; } + // Apply arena tags for conditional protection + if (!move.hasFlag(MoveFlags.IGNORE_PROTECT) && !move.isAllyTarget()) { + const defendingSide = this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; + this.scene.arena.applyTagsForSide(ArenaTagType.QUICK_GUARD, defendingSide, cancelled, this, move.priority); + this.scene.arena.applyTagsForSide(ArenaTagType.WIDE_GUARD, defendingSide, cancelled, this, move.moveTarget); + this.scene.arena.applyTagsForSide(ArenaTagType.MAT_BLOCK, defendingSide, cancelled, this, move.category); + this.scene.arena.applyTagsForSide(ArenaTagType.CRAFTY_SHIELD, defendingSide, cancelled, this, move.category, move.moveTarget); + } + switch (moveCategory) { case MoveCategory.PHYSICAL: case MoveCategory.SPECIAL: @@ -1694,7 +1707,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const screenMultiplier = new Utils.NumberHolder(1); if (!isCritical) { this.scene.arena.applyTagsForSide(WeakenMoveScreenTag, this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY, move.category, this.scene.currentBattle.double, screenMultiplier); - } + } const isTypeImmune = (typeMultiplier.value * arenaAttackTypeMultiplier.value) === 0; const sourceTypes = source.getTypes(); const matchesSourceType = sourceTypes[0] === type || (sourceTypes.length > 1 && sourceTypes[1] === type); @@ -1717,7 +1730,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { 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 * ((this.scene.randBattleSeedInt(15) + 85) / 100) * criticalMultiplier.value); if (isPhysical && source.status && source.status.effect === StatusEffect.BURN) { - if(!move.getAttrs(BypassBurnDamageReductionAttr).length) { + if (!move.getAttrs(BypassBurnDamageReductionAttr).length) { const burnDamageReductionCancelled = new Utils.BooleanHolder(false); applyAbAttrs(BypassBurnDamageReductionAbAttr, source, burnDamageReductionCancelled); if (!burnDamageReductionCancelled.value) { @@ -1728,11 +1741,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { applyPreAttackAbAttrs(DamageBoostAbAttr, source, this, battlerMove, damage); - /** + /** * For each {@link HitsTagAttr} the move has, doubles the damage of the move if: * The target has a {@link BattlerTagType} that this move interacts with * AND - * The move doubles damage when used against that tag + * The move doubles damage when used against that tag * */ move.getAttrs(HitsTagAttr).map(hta => hta as HitsTagAttr).filter(hta => hta.doubleDamage).forEach(hta => { if (this.getTag(hta.tagType)) { @@ -1752,7 +1765,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { isCritical = false; result = HitResult.EFFECTIVE; } - + if (!result) { if (!typeMultiplier.value) { result = move.id === Moves.SHEER_COLD ? HitResult.IMMUNE : HitResult.NO_EFFECT; @@ -1790,6 +1803,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { console.log("damage", damage.value, move.name, power.value, 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) { @@ -1850,6 +1866,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (damage) { this.scene.clearPhaseQueueSplice(); + + const attacker = this.scene.getPokemonById(source.id); + destinyTag?.lapse(attacker, BattlerTagLapseType.CUSTOM); } } break; @@ -1878,7 +1897,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const surviveDamage = new Utils.BooleanHolder(false); if (!preventEndure && this.hp - damage <= 0) { - if(this.hp >= 1 && this.getTag(BattlerTagType.ENDURING)) { + if (this.hp >= 1 && this.getTag(BattlerTagType.ENDURING)) { surviveDamage.value = this.lapseTag(BattlerTagType.ENDURING); } else if (this.hp > 1 && this.getTag(BattlerTagType.STURDY)) { surviveDamage.value = this.lapseTag(BattlerTagType.STURDY); @@ -2072,7 +2091,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.formIndex = Math.max(this.species.forms.findIndex(f => f.formKey === formChange.formKey), 0); this.generateName(); const abilityCount = this.getSpeciesForm().getAbilityCount(); - if (this.abilityIndex >= abilityCount){// Shouldn't happen + if (this.abilityIndex >= abilityCount) {// Shouldn't happen this.abilityIndex = abilityCount - 1; } this.scene.gameData.setPokemonSeen(this, false); @@ -2123,7 +2142,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { let frameProgress = 0; let frameThreshold: number; - + sprite.anims.pause(); tintSprite.anims.pause(); @@ -2336,7 +2355,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return true; } - trySetStatus(effect: StatusEffect, asPhase: boolean = false, sourcePokemon: Pokemon = null, cureTurn: integer = 0, sourceText: string = null): boolean { + trySetStatus(effect: StatusEffect, asPhase: boolean = false, sourcePokemon: Pokemon = null, cureTurn: integer = 0, sourceText: string = null): boolean { if (!this.canSetStatus(effect, asPhase, false, sourcePokemon)) { return false; } @@ -2626,13 +2645,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { fusionPixelColors.push(argbFromRgba({ r, g, b, a })); } } - + let paletteColors: Map; let fusionPaletteColors: Map; const originalRandom = Math.random; Math.random = () => Phaser.Math.RND.realInRange(0, 1); - + this.scene.executeWithSeedOffset(() => { paletteColors = QuantizerCelebi.quantize(pixelColors, 4); fusionPaletteColors = QuantizerCelebi.quantize(fusionPixelColors, 4); @@ -2645,14 +2664,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { let keys = Array.from(paletteColors.keys()).sort((a: integer, b: integer) => paletteColors.get(a) < paletteColors.get(b) ? 1 : -1); let rgbaColors: Map; let hsvColors: Map; - + const mappedColors = new Map(); do { mappedColors.clear(); rgbaColors = keys.reduce((map: Map, k: number) => { - map.set(k, Object.values(rgbaFromArgb(k))); return map; + map.set(k, Object.values(rgbaFromArgb(k))); return map; }, new Map()); hsvColors = Array.from(rgbaColors.keys()).reduce((map: Map, k: number) => { const rgb = rgbaColors.get(k).slice(0, 3); @@ -2765,6 +2784,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.battleInfo?.destroy(); super.destroy(); } + + getBattleInfo(): BattleInfo { + return this.battleInfo; + } } export default interface Pokemon { @@ -2776,7 +2799,7 @@ export class PlayerPokemon extends Pokemon { constructor(scene: BattleScene, species: PokemonSpecies, level: integer, abilityIndex: integer, formIndex: integer, gender: Gender, shiny: boolean, variant: Variant, ivs: integer[], nature: Nature, dataSource: Pokemon | PokemonData) { super(scene, 106, 148, species, level, abilityIndex, formIndex, gender, shiny, variant, ivs, nature, dataSource); - + if (Overrides.SHINY_OVERRIDE) { this.shiny = true; this.initShinySparkle(); @@ -2861,7 +2884,7 @@ export class PlayerPokemon extends Pokemon { } this.hideInfo(); this.setVisible(false); - + 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)); @@ -2888,7 +2911,7 @@ export class PlayerPokemon extends Pokemon { if (amount.value > 0) { this.scene.applyModifier(PokemonFriendshipBoosterModifier, true, this, amount); this.scene.applyModifier(PokemonFriendshipBoosterModifier, true, this, starterAmount); - + this.friendship = Math.min(this.friendship + amount.value, 255); if (this.friendship === 255) { this.scene.validateAchv(achvs.MAX_FRIENDSHIP); @@ -2916,9 +2939,9 @@ export class PlayerPokemon extends Pokemon { revivalBlessing(): Promise { return new Promise(resolve => { this.scene.ui.setMode(Mode.PARTY, PartyUiMode.REVIVAL_BLESSING, this.getFieldIndex(), (slotIndex:integer, option: PartyOption) => { - if(slotIndex >= 0 && slotIndex<6) { + if (slotIndex >= 0 && slotIndex<6) { const pokemon = this.scene.getParty()[slotIndex]; - if(!pokemon || !pokemon.isFainted()) { + if (!pokemon || !pokemon.isFainted()) { resolve(); } @@ -2927,13 +2950,13 @@ export class PlayerPokemon extends Pokemon { pokemon.heal(Math.min(Math.max(Math.ceil(Math.floor(0.5 * pokemon.getMaxHp())), 1), pokemon.getMaxHp())); this.scene.queueMessage(`${pokemon.name} was revived!`,0,true); - if(this.scene.currentBattle.double && this.scene.getParty().length > 1) { + if (this.scene.currentBattle.double && this.scene.getParty().length > 1) { const allyPokemon = this.getAlly(); - if(slotIndex<=1) { + if (slotIndex<=1) { // Revived ally pokemon this.scene.unshiftPhase(new SwitchSummonPhase(this.scene, pokemon.getFieldIndex(), slotIndex, false, false, true)); this.scene.unshiftPhase(new ToggleDoublePositionPhase(this.scene, true)); - } else if(allyPokemon.isFainted()) { + } else if (allyPokemon.isFainted()) { // Revived party pokemon, and ally pokemon is fainted this.scene.unshiftPhase(new SwitchSummonPhase(this.scene, allyPokemon.getFieldIndex(), slotIndex, false, false, true)); this.scene.unshiftPhase(new ToggleDoublePositionPhase(this.scene, true)); @@ -2945,7 +2968,7 @@ export class PlayerPokemon extends Pokemon { }, PartyUiHandler.FilterFainted); }); } - + getPossibleEvolution(evolution: SpeciesFormEvolution): Promise { return new Promise(resolve => { const evolutionSpecies = getPokemonSpecies(evolution.speciesId); @@ -2988,12 +3011,12 @@ export class PlayerPokemon extends Pokemon { this.generateName(); if (!isFusion) { const abilityCount = this.getSpeciesForm().getAbilityCount(); - if (this.abilityIndex >= abilityCount){ // Shouldn't happen + if (this.abilityIndex >= abilityCount) { // Shouldn't happen this.abilityIndex = abilityCount - 1; } } else { const abilityCount = this.getFusionSpeciesForm().getAbilityCount(); - if (this.fusionAbilityIndex >= abilityCount){// Shouldn't happen + if (this.fusionAbilityIndex >= abilityCount) {// Shouldn't happen this.fusionAbilityIndex = abilityCount - 1; } } @@ -3017,11 +3040,11 @@ export class PlayerPokemon extends Pokemon { private handleSpecialEvolutions(evolution: SpeciesFormEvolution) { const isFusion = evolution instanceof FusionSpeciesFormEvolution; - + const evoSpecies = (!isFusion ? this.species : this.fusionSpecies); if (evoSpecies.speciesId === Species.NINCADA && evolution.speciesId === Species.NINJASK) { - const newEvolution = pokemonEvolutions[evoSpecies.speciesId][1]; - + const newEvolution = pokemonEvolutions[evoSpecies.speciesId][1]; + if (newEvolution.condition.predicate(this)) { const newPokemon = this.scene.addPlayerPokemon(this.species, this.level, this.abilityIndex, this.formIndex, undefined, this.shiny, this.variant, this.ivs, this.nature); newPokemon.natureOverride = this.natureOverride; @@ -3112,7 +3135,7 @@ export class PlayerPokemon extends Pokemon { this.generateName(); this.calculateStats(); - + // Set this Pokemon's HP to the average % of both fusion components this.hp = Math.round(this.stats[Stat.HP] * newHpPercent); if (!this.isFainted()) { @@ -3164,7 +3187,7 @@ export class PlayerPokemon extends Pokemon { /** Returns a deep copy of this Pokemon's moveset array */ copyMoveset(): PokemonMove[] { const newMoveset = []; - this.moveset.forEach(move => + this.moveset.forEach(move => newMoveset.push(new PokemonMove(move.moveId, 0, move.ppUp, move.virtual))); return newMoveset; @@ -3226,7 +3249,7 @@ export class EnemyPokemon extends Pokemon { this.battleInfo.updateBossSegments(this); } } - + setBoss(boss: boolean = true, bossSegments: integer = 0): void { if (boss) { this.bossSegments = bossSegments || this.scene.getEncounterBossSegments(this.scene.currentBattle.waveIndex, this.level, this.species, true); @@ -3400,7 +3423,7 @@ export class EnemyPokemon extends Pokemon { if (!!move.findAttr(attr => attr instanceof CounterDamageAttr)) { return [BattlerIndex.ATTACKER]; } - + return []; } @@ -3472,7 +3495,7 @@ export class EnemyPokemon extends Pokemon { return 0; } - let clearedBossSegmentIndex = this.isBoss() + let clearedBossSegmentIndex = this.isBoss() ? this.bossSegmentIndex + 1 : 0; diff --git a/src/field/trainer.ts b/src/field/trainer.ts index 177aee2f3d0..081bf6d8d18 100644 --- a/src/field/trainer.ts +++ b/src/field/trainer.ts @@ -1,21 +1,30 @@ import BattleScene from "../battle-scene"; -import { pokemonPrevolutions } from "../data/pokemon-evolutions"; -import PokemonSpecies, { getPokemonSpecies } from "../data/pokemon-species"; -import { TrainerConfig, TrainerPartyCompoundTemplate, TrainerPartyTemplate, TrainerPoolTier, TrainerSlot, trainerConfigs, trainerPartyTemplates } from "../data/trainer-config"; -import { PartyMemberStrength } from "../data/enums/party-member-strength"; -import { TrainerType } from "../data/enums/trainer-type"; -import { EnemyPokemon } from "./pokemon"; +import {pokemonPrevolutions} from "../data/pokemon-evolutions"; +import PokemonSpecies, {getPokemonSpecies} from "../data/pokemon-species"; +import { + TrainerConfig, + TrainerPartyCompoundTemplate, + TrainerPartyTemplate, + TrainerPoolTier, + TrainerSlot, + trainerConfigs, + trainerPartyTemplates, + signatureSpecies +} from "../data/trainer-config"; +import {PartyMemberStrength} from "../data/enums/party-member-strength"; +import {TrainerType} from "../data/enums/trainer-type"; +import {EnemyPokemon} from "./pokemon"; import * as Utils from "../utils"; -import { PersistentModifier } from "../modifier/modifier"; -import { trainerNamePools } from "../data/trainer-names"; -import { ArenaTagSide, ArenaTrapTag } from "#app/data/arena-tag"; +import {PersistentModifier} from "../modifier/modifier"; +import {trainerNamePools} from "../data/trainer-names"; +import {ArenaTagSide, ArenaTrapTag} from "#app/data/arena-tag"; import {getIsInitialized, initI18n} from "#app/plugins/i18n"; import i18next from "i18next"; export enum TrainerVariant { - DEFAULT, - FEMALE, - DOUBLE + DEFAULT, + FEMALE, + DOUBLE } export default class Trainer extends Phaser.GameObjects.Container { @@ -31,7 +40,7 @@ export default class Trainer extends Phaser.GameObjects.Container { ? trainerConfigs[trainerType] : trainerConfigs[TrainerType.ACE_TRAINER]; this.variant = variant; - this.partyTemplateIndex = Math.min(partyTemplateIndex !== undefined ? partyTemplateIndex : Utils.randSeedWeightedItem(this.config.partyTemplates.map((_, i) => i)), + this.partyTemplateIndex = Math.min(partyTemplateIndex !== undefined ? partyTemplateIndex : Utils.randSeedWeightedItem(this.config.partyTemplates.map((_, i) => i)), this.config.partyTemplates.length - 1); if (trainerNamePools.hasOwnProperty(trainerType)) { const namePool = trainerNamePools[trainerType]; @@ -41,7 +50,7 @@ export default class Trainer extends Phaser.GameObjects.Container { if (partnerName) { this.partnerName = partnerName; } else { - [ this.name, this.partnerName ] = this.name.split(" & "); + [this.name, this.partnerName] = this.name.split(" & "); } } else { this.partnerName = partnerName || Utils.randSeedItem(Array.isArray(namePool[0]) ? namePool[1] : namePool); @@ -67,10 +76,10 @@ export default class Trainer extends Phaser.GameObjects.Container { const getSprite = (hasShadow?: boolean, forceFemale?: boolean) => { const ret = this.scene.addFieldSprite(0, 0, this.config.getSpriteKey(variant === TrainerVariant.FEMALE || forceFemale)); ret.setOrigin(0.5, 1); - ret.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: !!hasShadow }); + ret.setPipeline(this.scene.spritePipeline, {tone: [0.0, 0.0, 0.0, 0.0], hasShadow: !!hasShadow}); return ret; }; - + const sprite = getSprite(true); const tintSprite = getSprite(); @@ -142,6 +151,11 @@ export default class Trainer extends Phaser.GameObjects.Container { } } + if (this.config.titleDouble && this.variant === TrainerVariant.DOUBLE && !this.config.doubleOnly) { + title = this.config.titleDouble; + name = i18next.t(`trainerNames:${this.config.nameDouble.toLowerCase().replace(/\s/g, "_")}`); + } + // Return the formatted name, including the title if it is set. return title ? `${title} ${name}` : name; } @@ -181,7 +195,7 @@ export default class Trainer extends Phaser.GameObjects.Container { getPartyLevels(waveIndex: integer): integer[] { const ret = []; const partyTemplate = this.getPartyTemplate(); - + const difficultyWaveIndex = this.scene.gameMode.getWaveForDifficulty(waveIndex); const baseLevel = 1 + difficultyWaveIndex / 2 + Math.pow(difficultyWaveIndex / 25, 2); @@ -191,9 +205,9 @@ export default class Trainer extends Phaser.GameObjects.Container { for (let i = 0; i < partyTemplate.size; i++) { let multiplier = 1; - + const strength = partyTemplate.getStrength(i); - + switch (strength) { case PartyMemberStrength.WEAKER: multiplier = 0.95; @@ -229,22 +243,26 @@ export default class Trainer extends Phaser.GameObjects.Container { genPartyMember(index: integer): EnemyPokemon { const battle = this.scene.currentBattle; const level = battle.enemyLevels[index]; - + let ret: EnemyPokemon; this.scene.executeWithSeedOffset(() => { const template = this.getPartyTemplate(); const strength: PartyMemberStrength = template.getStrength(index); - if (this.config.partyMemberFuncs.hasOwnProperty(index)) { - ret = this.config.partyMemberFuncs[index](this.scene, level, strength); - return; - } - if (this.config.partyMemberFuncs.hasOwnProperty(index - template.size)) { - ret = this.config.partyMemberFuncs[index - template.size](this.scene, level, template.getStrength(index)); - return; - } + // If the battle is not one of the named trainer doubles + if (!(this.config.trainerTypeDouble && this.isDouble() && !this.config.doubleOnly)) { + + if (this.config.partyMemberFuncs.hasOwnProperty(index)) { + ret = this.config.partyMemberFuncs[index](this.scene, level, strength); + return; + } + if (this.config.partyMemberFuncs.hasOwnProperty(index - template.size)) { + ret = this.config.partyMemberFuncs[index - template.size](this.scene, level, template.getStrength(index)); + return; + } + } let offset = 0; if (template instanceof TrainerPartyCompoundTemplate) { @@ -256,16 +274,73 @@ export default class Trainer extends Phaser.GameObjects.Container { } } - const species = template.isSameSpecies(index) && index > offset - ? getPokemonSpecies(battle.enemyParty[offset].species.getTrainerSpeciesForLevel(level, false, template.getStrength(offset))) - : this.genNewPartyMemberSpecies(level, strength); - + // Create an empty species pool (which will be set to one of the species pools based on the index) + let newSpeciesPool = []; + let useNewSpeciesPool = false; + + // If we are in a double battle of named trainers, we need to use alternate species pools (generate half the party from each trainer) + if (this.config.trainerTypeDouble && this.isDouble() && !this.config.doubleOnly) { + + // Use the new species pool for this party generation + useNewSpeciesPool = true; + + + // Get the species pool for the partner trainer and the current trainer + const speciesPoolPartner = signatureSpecies[TrainerType[this.config.trainerTypeDouble]]; + const speciesPool = signatureSpecies[TrainerType[this.config.trainerType]]; + + + // Get the species that are already in the enemy party so we dont generate the same species twice + const AlreadyUsedSpecies = battle.enemyParty.map(p => p.species.speciesId); + + // Filter out the species that are already in the enemy party from the main trainer species pool + const speciesPoolFiltered = speciesPool.filter(species => { + // Since some species pools have arrays in them (use either of those species), we need to check if one of the species is already in the party and filter the whole array if it is + if (Array.isArray(species)) { + return !species.some(s => AlreadyUsedSpecies.includes(s)); + } + return !AlreadyUsedSpecies.includes(species); + }); + + // Filter out the species that are already in the enemy party from the partner trainer species pool + const speciesPoolPartnerFiltered = speciesPoolPartner.filter(species => { + // Since some species pools have arrays in them (use either of those species), we need to check if one of the species is already in the party and filter the whole array if it is + if (Array.isArray(species)) { + return !species.some(s => AlreadyUsedSpecies.includes(s)); + } + return !AlreadyUsedSpecies.includes(species); + }); + + + // If the index is even, use the species pool for the main trainer (that way he only uses his own pokemon in battle) + if (!(index % 2)) { + newSpeciesPool = speciesPoolFiltered; + } else { + // If the index is odd, use the species pool for the partner trainer (that way he only uses his own pokemon in battle) + newSpeciesPool = speciesPoolPartnerFiltered; + } + + // Fallback for when the species pool is empty + if (newSpeciesPool.length === 0) { + // If all pokemon from this pool are already in the party, generate a random species + useNewSpeciesPool = false; + } + } + + // If useNewSpeciesPool is true, we need to generate a new species from the new species pool, otherwise we generate a random species + const species = useNewSpeciesPool + ? getPokemonSpecies(newSpeciesPool[Math.floor(Math.random() * newSpeciesPool.length)]) + : template.isSameSpecies(index) && index > offset + ? getPokemonSpecies(battle.enemyParty[offset].species.getTrainerSpeciesForLevel(level, false, template.getStrength(offset))) + : this.genNewPartyMemberSpecies(level, strength); + ret = this.scene.addEnemyPokemon(species, level, !this.isDouble() || !(index % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER); }, this.config.hasStaticParty ? this.config.getDerivedType() + ((index + 1) << 8) : this.scene.currentBattle.waveIndex + (this.config.getDerivedType() << 10) + (((!this.config.useSameSeedForAllMembers ? index : 0) + 1) << 8)); return ret; } + genNewPartyMemberSpecies(level: integer, strength: PartyMemberStrength, attempt?: integer): PokemonSpecies { const battle = this.scene.currentBattle; const template = this.getPartyTemplate(); @@ -324,7 +399,7 @@ export default class Trainer extends Phaser.GameObjects.Container { if (trainerSlot && !this.isDouble()) { trainerSlot = TrainerSlot.NONE; } - + const party = this.scene.getEnemyParty(); const nonFaintedPartyMembers = party.slice(this.scene.currentBattle.getBattlerCount()).filter(p => !p.isFainted()).filter(p => !trainerSlot || p.trainerSlot === trainerSlot); const partyMemberScores = nonFaintedPartyMembers.map(p => { @@ -340,7 +415,7 @@ export default class Trainer extends Phaser.GameObjects.Container { if (forSwitch && !p.isOnField()) { this.scene.arena.findTagsOnSide(t => t instanceof ArenaTrapTag, ArenaTagSide.ENEMY).map(t => score *= (t as ArenaTrapTag).getMatchupScoreMultiplier(p)); } - return [ party.indexOf(p), score ]; + return [party.indexOf(p), score]; }); return partyMemberScores; @@ -374,7 +449,7 @@ export default class Trainer extends Phaser.GameObjects.Container { return maxScorePartyMemberIndexes[0]; } - + getPartyMemberModifierChanceMultiplier(index: integer): number { switch (this.getPartyTemplate().getStrength(index)) { case PartyMemberStrength.WEAKER: @@ -431,7 +506,7 @@ export default class Trainer extends Phaser.GameObjects.Container { sprite.play(animConfig); tintSprite.play(animConfig); - return true; + return true; } playAnim(): void { @@ -521,5 +596,5 @@ export default class Trainer extends Phaser.GameObjects.Container { } export default interface Trainer { - scene: BattleScene + scene: BattleScene } diff --git a/src/form-change-phase.ts b/src/form-change-phase.ts index c42932d931c..a8957bfc8b6 100644 --- a/src/form-change-phase.ts +++ b/src/form-change-phase.ts @@ -35,7 +35,7 @@ export class FormChangePhase extends EvolutionPhase { doEvolution(): void { const preName = this.pokemon.name; - + this.pokemon.getPossibleForm(this.formChange).then(transformedPokemon => { [ this.pokemonEvoSprite, this.pokemonEvoTintSprite ].map(sprite => { @@ -132,7 +132,7 @@ export class FormChangePhase extends EvolutionPhase { const delay = playEvolutionFanfare ? 4000 : 1750; this.scene.playSoundWithoutBgm(playEvolutionFanfare ? "evolution_fanfare" : "minor_fanfare"); - + transformedPokemon.destroy(); this.scene.ui.showText(getSpeciesFormChangeMessage(this.pokemon, this.formChange, preName), null, () => this.end(), null, true, Utils.fixedInt(delay)); this.scene.time.delayedCall(Utils.fixedInt(delay + 250), () => this.scene.playBgm()); @@ -287,7 +287,7 @@ export class QuietFormChangePhase extends BattlePhase { this.pokemon.bossSegmentIndex = 4; this.pokemon.initBattleInfo(); this.pokemon.cry(); - + const movePhase = this.scene.findPhase(p => p instanceof MovePhase && p.pokemon === this.pokemon) as MovePhase; if (movePhase) { movePhase.cancel(); diff --git a/src/game-mode.ts b/src/game-mode.ts index 69bc5ea109a..4d46971dcb5 100644 --- a/src/game-mode.ts +++ b/src/game-mode.ts @@ -46,7 +46,7 @@ export class GameMode implements GameModeConfig { } /** - * @returns either: + * @returns either: * - override from overrides.ts * - 20 for Daily Runs * - 5 for all other modes @@ -132,7 +132,7 @@ export class GameMode implements GameModeConfig { } return false; } - + isTrainerBoss(waveIndex: integer, biomeType: Biome, offsetGym: boolean): boolean { switch (this.modeId) { case GameModes.DAILY: @@ -154,7 +154,7 @@ export class GameMode implements GameModeConfig { /** * Checks if wave provided is the final for current or specified game mode - * @param waveIndex + * @param waveIndex * @param modeId game mode * @returns if the current wave is final for classic or daily OR a minor boss in endless */ @@ -194,7 +194,7 @@ export class GameMode implements GameModeConfig { * @returns true if waveIndex is a multiple of 250 in Endless */ isEndlessMinorBoss(waveIndex: integer): boolean { - return waveIndex % 250 === 0 && + return waveIndex % 250 === 0 && (this.modeId === GameModes.ENDLESS || this.modeId === GameModes.SPLICED_ENDLESS); } @@ -204,7 +204,7 @@ export class GameMode implements GameModeConfig { * @returns true if waveIndex is a multiple of 1000 in Endless */ isEndlessMajorBoss(waveIndex: integer): boolean { - return waveIndex % 1000 === 0 && + return waveIndex % 1000 === 0 && (this.modeId === GameModes.ENDLESS || this.modeId === GameModes.SPLICED_ENDLESS); } diff --git a/src/loading-scene.ts b/src/loading-scene.ts index 3bbae27ffc1..df788643c8e 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -9,6 +9,15 @@ import { WindowVariant, getWindowVariantSuffix } from "./ui/ui-theme"; import { isMobile } from "./touch-controls"; import * as Utils from "./utils"; import { initI18n } from "./plugins/i18n"; +import {initStatsKeys} from "#app/ui/game-stats-ui-handler"; +import {initPokemonPrevolutions} from "#app/data/pokemon-evolutions"; +import {initBiomes} from "#app/data/biomes"; +import {initEggMoves} from "#app/data/egg-moves"; +import {initPokemonForms} from "#app/data/pokemon-forms"; +import {initSpecies} from "#app/data/pokemon-species"; +import {initMoves} from "#app/data/move"; +import {initAbilities} from "#app/data/ability"; +import {initTrainerTypeDialogue} from "#app/data/dialogue"; export class LoadingScene extends SceneBase { constructor() { @@ -198,7 +207,7 @@ export class LoadingScene extends SceneBase { this.loadAtlas("types", ""); this.loadAtlas("statuses", ""); this.loadAtlas("categories", ""); - + this.loadAtlas("egg", "egg"); this.loadAtlas("egg_crack", "egg"); this.loadAtlas("egg_icons", "egg"); @@ -284,6 +293,16 @@ export class LoadingScene extends SceneBase { this.load.plugin("rextexteditplugin", "https://raw.githubusercontent.com/rexrainbow/phaser3-rex-notes/master/dist/rextexteditplugin.min.js", true); this.loadLoadingScreen(); + + initStatsKeys(); + initPokemonPrevolutions(); + initBiomes(); + initEggMoves(); + initPokemonForms(); + initTrainerTypeDialogue(); + initSpecies(); + initMoves(); + initAbilities(); } loadLoadingScreen() { @@ -350,7 +369,7 @@ export class LoadingScene extends SceneBase { this.load.on("fileprogress", file => { assetText.setText(`Loading asset: ${file.key}`); }); - + loadingGraphics.push(bg, graphics, progressBar, progressBox, logo, percentText, assetText); if (!mobile) { diff --git a/src/locales/de/ability.ts b/src/locales/de/ability.ts index 17472339717..3d8ca7f61f5 100644 --- a/src/locales/de/ability.ts +++ b/src/locales/de/ability.ts @@ -471,7 +471,7 @@ export const ability: AbilityTranslationEntries = { }, honeyGather: { name: "Honigmaul", - description: "Das Pokémon sammelt nach Kämpfen eventuell Honig auf.", + description: "Sammelt nach dem Kampf Honig. Dieser wird dann für Geld verkauft.", }, frisk: { name: "Schnüffler", diff --git a/src/locales/de/battle.ts b/src/locales/de/battle.ts index 4a09bfc5f8f..e60833cb27a 100644 --- a/src/locales/de/battle.ts +++ b/src/locales/de/battle.ts @@ -4,6 +4,7 @@ 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!", "singleWildAppeared": "Ein wildes {{pokemonName}} erscheint!", "multiWildAppeared": "Ein wildes {{pokemonName1}}\nund {{pokemonName2}} erscheinen!", "playerComeBack": "Komm zurück, {{pokemonName}}!", @@ -12,7 +13,9 @@ export const battle: SimpleTranslationEntries = { "trainerGo": "{{trainerName}} sendet {{pokemonName}} raus!", "switchQuestion": "Möchtest du\n{{pokemonName}} auswechseln?", "trainerDefeated": "{{trainerName}}\nwurde besiegt!", + "moneyWon": "Du gewinnst\n{{moneyAmount}} ₽!", "pokemonCaught": "{{pokemonName}} wurde gefangen!", + "partyFull": "Dein Team ist voll.\nMöchtest du ein Pokémon durch {{pokemonName}} ersetzen?", "pokemon": "Pokémon", "sendOutPokemon": "Los, {{pokemonName}}!", "hitResultCriticalHit": "Ein Volltreffer!", diff --git a/src/locales/de/berry.ts b/src/locales/de/berry.ts index 37e4dd47573..330b36fffc8 100644 --- a/src/locales/de/berry.ts +++ b/src/locales/de/berry.ts @@ -39,7 +39,7 @@ export const berry: BerryTranslationEntries = { }, "STARF": { name: "Krambobeere", - effect: "Erhöht eine Statuswert stark, wenn die KP unter 25% sind" + effect: "Erhöht einen zufälligen Statuswert stark, wenn die KP unter 25% sind" }, "LEPPA": { name: "Jonagobeere", diff --git a/src/locales/de/biome.ts b/src/locales/de/biome.ts new file mode 100644 index 00000000000..6fdbb3c6820 --- /dev/null +++ b/src/locales/de/biome.ts @@ -0,0 +1,40 @@ +import { SimpleTranslationEntries } from "#app/plugins/i18n"; + +export const biome: SimpleTranslationEntries = { + "unknownLocation": "An einem unbekannten Ort", + "TOWN": "Stadt", + "PLAINS": "Ebene", + "GRASS": "Grasfeld", + "TALL_GRASS": "Hohes Gras", + "METROPOLIS": "Metropole", + "FOREST": "Wald", + "SEA": "Meer", + "SWAMP": "Sumpf", + "BEACH": "Strand", + "LAKE": "See", + "SEABED": "Meeresboden", + "MOUNTAIN": "Berg", + "BADLANDS": "Kargland", + "CAVE": "Höhle", + "DESERT": "Wüste", + "ICE_CAVE": "Eishöhle", + "MEADOW": "Weide", + "POWER_PLANT": "Kraftwerk", + "VOLCANO": "Vulkan", + "GRAVEYARD": "Friedhof", + "DOJO": "Dojo", + "FACTORY": "Fabrik", + "RUINS": "Alte Ruinen", + "WASTELAND": "Ödland", + "ABYSS": "Der Abgrund", + "SPACE": "Stratosphäre", + "CONSTRUCTION_SITE": "Baustelle", + "JUNGLE": "Dschungel", + "FAIRY_CAVE": "Feenhöhle", + "TEMPLE": "Tempel", + "SLUM": "Elendsviertel", + "SNOWY_FOREST": "Verschneiter Wald", + "ISLAND": "Insel", + "LABORATORY": "Labor", + "END": "???", +} as const; diff --git a/src/locales/de/config.ts b/src/locales/de/config.ts index 450383e2fdb..c9b81680632 100644 --- a/src/locales/de/config.ts +++ b/src/locales/de/config.ts @@ -21,6 +21,7 @@ import { weather } from "./weather"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; import { voucher } from "./voucher"; +import { biome } from "./biome"; export const deConfig = { ability: ability, @@ -48,4 +49,5 @@ export const deConfig = { battleMessageUiHandler: battleMessageUiHandler, berry: berry, voucher: voucher, + biome: biome, }; diff --git a/src/locales/de/menu.ts b/src/locales/de/menu.ts index baa345eee8d..5545ec0dae8 100644 --- a/src/locales/de/menu.ts +++ b/src/locales/de/menu.ts @@ -29,7 +29,7 @@ export const menu: SimpleTranslationEntries = { "confirmPassword": "Bestätige Passwort", "registrationAgeWarning": "Mit der Registrierung bestätigen Sie, dass Sie 13 Jahre oder älter sind.", "backToLogin": "Zurück zur Anmeldung", - "failedToLoadSaveData": "Speicherdaten konnten nicht geladen werden. Bitte laden Sie die Seite neu.\nWenn dies weiterhin der Fall ist, wenden Sie sich bitte an den Administrator.", + "failedToLoadSaveData": "Speicherdaten konnten nicht geladen werden. Bitte laden Sie die Seite neu.\nÜberprüfe den #announcements-Kanal im Discord bei anhaltenden Problemen", "sessionSuccess": "Sitzung erfolgreich geladen.", "failedToLoadSession": "Ihre Sitzungsdaten konnten nicht geladen werden.\nSie könnten beschädigt sein.", "boyOrGirl": "Bist du ein Junge oder ein Mädchen?", diff --git a/src/locales/de/move.ts b/src/locales/de/move.ts index a616ffa4276..4e787d2ccf7 100644 --- a/src/locales/de/move.ts +++ b/src/locales/de/move.ts @@ -2915,7 +2915,7 @@ export const move: MoveTranslationEntries = { }, "zippyZap": { name: "Britzelturbo", - effect: "The user attacks the target with bursts of electricity at high speed. This move always goes first and raises the user's evasiveness." + effect: "Ein stürmischer Blitz-Angriff mit hoher Erstschlag- und Volltrefferquote." }, "splishySplash": { name: "Plätschersurfer", diff --git a/src/locales/de/starter-select-ui-handler.ts b/src/locales/de/starter-select-ui-handler.ts index c1d3633e7bf..12061e7ca3f 100644 --- a/src/locales/de/starter-select-ui-handler.ts +++ b/src/locales/de/starter-select-ui-handler.ts @@ -22,7 +22,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "nature": "Wesen:", "eggMoves": "Ei-Attacken", "start": "Start", - "addToParty": "Zum Team hinzufügen", + "addToParty": "Zum Team hinzufügen", "toggleIVs": "DVs anzeigen/verbergen", "manageMoves": "Attacken ändern", "useCandies": "Bonbons verwenden", diff --git a/src/locales/de/trainers.ts b/src/locales/de/trainers.ts index b221330fcf0..e28c0c6e5e9 100644 --- a/src/locales/de/trainers.ts +++ b/src/locales/de/trainers.ts @@ -5,7 +5,9 @@ export const titles: SimpleTranslationEntries = { "elite_four": "Top Vier", "gym_leader": "Arenaleiter", "gym_leader_female": "Arenaleiterin", + "gym_leader_double": "Arenaleiter-Duo", "champion": "Champion", + "champion_double": "Champion-Duo", "rival": "Rivale", "professor": "Professor", "frontier_brain": "Kampfkoryphäen", @@ -241,4 +243,16 @@ export const trainerNames: SimpleTranslationEntries = { "leon": "Delion", "rival": "Finn", "rival_female": "Ivy", + + // Double Names + "blue_red_double": "Blau & Rot", + "red_blue_double": "Rot & Blau", + "tate_liza_double": "Ben & Svenja", + "liza_tate_double": "Svenja & Ben", + "steven_wallace_double": "Troy & Wassili", + "wallace_steven_double": "Wassili & Troy", + "alder_iris_double": "Lauro & Lilia", + "iris_alder_double": "Lilia & Lauro", + "piers_marnie_double": "Nezz & Mary", + "marnie_piers_double": "Mary & Nezz", } as const; diff --git a/src/locales/de/tutorial.ts b/src/locales/de/tutorial.ts index 7d45314717d..25b1d69b602 100644 --- a/src/locales/de/tutorial.ts +++ b/src/locales/de/tutorial.ts @@ -7,9 +7,9 @@ export const tutorial: SimpleTranslationEntries = { $Das Spiel befindet sich noch in der Entwicklung, ist aber voll spielbar. $Für Fehlerberichte nutze bitte den PokéRogue Discord-Server. $Sollte das Spiel langsam laufen, überprüfe, ob in deinem Browser "Hardwarebeschleunigung" aktiviert ist.`, - + "accessMenu": "Nutze M oder Esc, um das Menü zu öffnen. Dort hast du Zugriff auf die Einstellungen und andere Funktionen.", - + "menu": `In diesem Menü hast du Zugriff auf die Einstellungen. $Dort kannst du u. A. die Spielgeschwin-\ndigkeit und das Fensterdesign ändern. $Das Menü verbirgt noch andere Funktionen - probier' sie gerne aus!`, diff --git a/src/locales/de/weather.ts b/src/locales/de/weather.ts index 56c6584fdcb..f6a6864bec7 100644 --- a/src/locales/de/weather.ts +++ b/src/locales/de/weather.ts @@ -33,7 +33,7 @@ export const weather: SimpleTranslationEntries = { "heavyRainStartMessage": "Es fängt an, in Strömen zu regnen!", "heavyRainLapseMessage": "Der strömende Regen hält an.", "heavyRainClearMessage": "Der strömende Regen lässt nach.", - + "harshSunStartMessage": "Das Sonnenlicht wird sehr viel stärker!", "harshSunLapseMessage": "Das Sonnenlicht ist sehr stark.", "harshSunClearMessage": "Das Sonnenlicht verliert an Intensität.", diff --git a/src/locales/en/ability.ts b/src/locales/en/ability.ts index 2ba837f8c69..aff5d95405e 100644 --- a/src/locales/en/ability.ts +++ b/src/locales/en/ability.ts @@ -471,7 +471,7 @@ export const ability: AbilityTranslationEntries = { }, honeyGather: { name: "Honey Gather", - description: "The Pokémon may gather Honey after a battle.", + description: "The Pokémon gathers Honey after a battle. The Honey is then sold for money.", }, frisk: { name: "Frisk", diff --git a/src/locales/en/battle.ts b/src/locales/en/battle.ts index 5ba0a588e19..a2eb9e4a9c9 100644 --- a/src/locales/en/battle.ts +++ b/src/locales/en/battle.ts @@ -4,6 +4,7 @@ export const battle: SimpleTranslationEntries = { "bossAppeared": "{{bossName}} appeared.", "trainerAppeared": "{{trainerName}}\nwould like to battle!", "trainerAppearedDouble": "{{trainerName}}\nwould like to battle!", + "trainerSendOut": "{{trainerName}} sent out\n{{pokemonName}}!", "singleWildAppeared": "A wild {{pokemonName}} appeared!", "multiWildAppeared": "A wild {{pokemonName1}}\nand {{pokemonName2}} appeared!", "playerComeBack": "Come back, {{pokemonName}}!", @@ -12,7 +13,9 @@ export const battle: SimpleTranslationEntries = { "trainerGo": "{{trainerName}} sent out {{pokemonName}}!", "switchQuestion": "Will you switch\n{{pokemonName}}?", "trainerDefeated": "You defeated\n{{trainerName}}!", + "moneyWon": "You got\n₽{{moneyAmount}} for winning!", "pokemonCaught": "{{pokemonName}} was caught!", + "partyFull": "Your party is full.\nRelease a Pokémon to make room for {{pokemonName}}?", "pokemon": "Pokémon", "sendOutPokemon": "Go! {{pokemonName}}!", "hitResultCriticalHit": "A critical hit!", diff --git a/src/locales/en/biome.ts b/src/locales/en/biome.ts new file mode 100644 index 00000000000..5631b91b836 --- /dev/null +++ b/src/locales/en/biome.ts @@ -0,0 +1,40 @@ +import { SimpleTranslationEntries } from "#app/plugins/i18n"; + +export const biome: SimpleTranslationEntries = { + "unknownLocation": "Somewhere you can\'t remember", + "TOWN": "Town", + "PLAINS": "Plains", + "GRASS": "Grassy Field", + "TALL_GRASS": "Tall Grass", + "METROPOLIS": "Metropolis", + "FOREST": "Forest", + "SEA": "Sea", + "SWAMP": "Swamp", + "BEACH": "Beach", + "LAKE": "Lake", + "SEABED": "Seabed", + "MOUNTAIN": "Mountain", + "BADLANDS": "Badlands", + "CAVE": "Cave", + "DESERT": "Desert", + "ICE_CAVE": "Ice Cave", + "MEADOW": "Meadow", + "POWER_PLANT": "Power Plant", + "VOLCANO": "Volcano", + "GRAVEYARD": "Graveyard", + "DOJO": "Dojo", + "FACTORY": "Factory", + "RUINS": "Ancient Ruins", + "WASTELAND": "Wasteland", + "ABYSS": "Abyss", + "SPACE": "Space", + "CONSTRUCTION_SITE": "Construction Site", + "JUNGLE": "Jungle", + "FAIRY_CAVE": "Fairy Cave", + "TEMPLE": "Temple", + "SLUM": "Slum", + "SNOWY_FOREST": "Snowy Forest", + "ISLAND": "Island", + "LABORATORY": "Laboratory", + "END": "???", +} as const; diff --git a/src/locales/en/config.ts b/src/locales/en/config.ts index aae53e61b42..08989184a2e 100644 --- a/src/locales/en/config.ts +++ b/src/locales/en/config.ts @@ -21,8 +21,9 @@ import { weather } from "./weather"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; import { voucher } from "./voucher"; +import { biome } from "./biome"; -export const enConfig = { +export const enConfig = { ability: ability, abilityTriggers: abilityTriggers, battle: battle, @@ -48,4 +49,5 @@ export const enConfig = { battleMessageUiHandler: battleMessageUiHandler, berry: berry, voucher: voucher, + biome: biome, }; diff --git a/src/locales/en/menu.ts b/src/locales/en/menu.ts index 9e4cfdf3f09..fb6bfff554b 100644 --- a/src/locales/en/menu.ts +++ b/src/locales/en/menu.ts @@ -29,7 +29,7 @@ export const menu: SimpleTranslationEntries = { "confirmPassword": "Confirm Password", "registrationAgeWarning": "By registering, you confirm you are of 13 years of age or older.", "backToLogin": "Back to Login", - "failedToLoadSaveData": "Failed to load save data. Please reload the page.\nIf this continues, please contact the administrator.", + "failedToLoadSaveData": "Failed to load save data. Please reload the page.\nIf this persists, please check #announcements in Discord.", "sessionSuccess": "Session loaded successfully.", "failedToLoadSession": "Your session data could not be loaded.\nIt may be corrupted.", "boyOrGirl": "Are you a boy or a girl?", diff --git a/src/locales/en/modifier-type.ts b/src/locales/en/modifier-type.ts index a7daa12edc9..897b337998d 100644 --- a/src/locales/en/modifier-type.ts +++ b/src/locales/en/modifier-type.ts @@ -139,10 +139,10 @@ export const modifierType: ModifierTypeTranslationEntries = { "HYPER_POTION": { name: "Hyper Potion" }, "MAX_POTION": { name: "Max Potion" }, "FULL_RESTORE": { name: "Full Restore" }, - + "REVIVE": { name: "Revive" }, "MAX_REVIVE": { name: "Max Revive" }, - + "FULL_HEAL": { name: "Full Heal" }, "SACRED_ASH": { name: "Sacred Ash" }, @@ -187,12 +187,12 @@ export const modifierType: ModifierTypeTranslationEntries = { "AMULET_COIN": { name: "Amulet Coin", description: "Increases money rewards by 20%" }, "GOLDEN_PUNCH": { name: "Golden Punch", description: "Grants 50% of direct damage inflicted as money" }, "COIN_CASE": { name: "Coin Case", description: "After every 10th battle, receive 10% of your money in interest" }, - + "LOCK_CAPSULE": { name: "Lock Capsule", description: "Allows you to lock item rarities when rerolling items" }, "GRIP_CLAW": { name: "Grip Claw" }, "WIDE_LENS": { name: "Wide Lens" }, - + "MULTI_LENS": { name: "Multi Lens" }, "HEALING_CHARM": { name: "Healing Charm", description: "Increases the effectiveness of HP restoring moves and items by 10% (excludes Revives)" }, @@ -290,7 +290,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "TART_APPLE": "Tart Apple", "STRAWBERRY_SWEET": "Strawberry Sweet", "UNREMARKABLE_TEACUP": "Unremarkable Teacup", - + "CHIPPED_POT": "Chipped Pot", "BLACK_AUGURITE": "Black Augurite", "GALARICA_CUFF": "Galarica Cuff", diff --git a/src/locales/en/move.ts b/src/locales/en/move.ts index fceab24b6a8..7f99517cfda 100644 --- a/src/locales/en/move.ts +++ b/src/locales/en/move.ts @@ -2047,7 +2047,7 @@ export const move: MoveTranslationEntries = { }, "acrobatics": { name: "Acrobatics", - effect: "The user nimbly strikes the target. If the user is not holding an item, this attack inflicts massive damage." + effect: "The user nimbly strikes the target. The fewer held items, the higher the damage it inflicts." }, "reflectType": { name: "Reflect Type", diff --git a/src/locales/en/pokemon-info.ts b/src/locales/en/pokemon-info.ts index 3f96ba152ef..b9a24d7e449 100644 --- a/src/locales/en/pokemon-info.ts +++ b/src/locales/en/pokemon-info.ts @@ -15,7 +15,7 @@ export const pokemonInfo: PokemonInfoTranslationEntries = { "SPD": "Speed", "SPDshortened": "Spd" }, - + Type: { "UNKNOWN": "Unknown", "NORMAL": "Normal", diff --git a/src/locales/en/starter-select-ui-handler.ts b/src/locales/en/starter-select-ui-handler.ts index 287059bae72..857ba4d805c 100644 --- a/src/locales/en/starter-select-ui-handler.ts +++ b/src/locales/en/starter-select-ui-handler.ts @@ -22,7 +22,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "nature": "Nature:", "eggMoves": "Egg Moves", "start": "Start", - "addToParty": "Add to Party", + "addToParty": "Add to Party", "toggleIVs": "Toggle IVs", "manageMoves": "Manage Moves", "useCandies": "Use Candies", diff --git a/src/locales/en/trainers.ts b/src/locales/en/trainers.ts index 68b31f2d301..334a0223c72 100644 --- a/src/locales/en/trainers.ts +++ b/src/locales/en/trainers.ts @@ -5,7 +5,9 @@ export const titles: SimpleTranslationEntries = { "elite_four": "Elite Four", "gym_leader": "Gym Leader", "gym_leader_female": "Gym Leader", + "gym_leader_double": "Gym Leader Duo", "champion": "Champion", + "champion_double": "Champion Duo", "rival": "Rival", "professor": "Professor", "frontier_brain": "Frontier Brain", @@ -82,8 +84,8 @@ export const trainerClasses: SimpleTranslationEntries = { "pokémon_rangers": "Pokémon Ranger", "ranger": "Ranger", "restaurant_staff": "Restaurant Staff", - "rich": "Rich", - "rich_female": "Rich", + "rich": "Rich", + "rich_female": "Rich", "rich_boy": "Rich Boy", "rich_couple": "Rich Couple", "rich_kid": "Rich Kid", @@ -241,4 +243,16 @@ export const trainerNames: SimpleTranslationEntries = { "leon": "Leon", "rival": "Finn", "rival_female": "Ivy", + + // Double Names + "blue_red_double": "Blue & Red", + "red_blue_double": "Red & Blue", + "tate_liza_double": "Tate & Liza", + "liza_tate_double": "Liza & Tate", + "steven_wallace_double": "Steven & Wallace", + "wallace_steven_double": "Wallace & Steven", + "alder_iris_double": "Alder & Iris", + "iris_alder_double": "Iris & Alder", + "marnie_piers_double": "Marnie & Piers", + "piers_marnie_double": "Piers & Marnie", } as const; diff --git a/src/locales/en/tutorial.ts b/src/locales/en/tutorial.ts index fbf10474902..0219edd61bf 100644 --- a/src/locales/en/tutorial.ts +++ b/src/locales/en/tutorial.ts @@ -5,9 +5,9 @@ export const tutorial: SimpleTranslationEntries = { $This game is not monetized and we claim no ownership of Pokémon nor of the copyrighted assets used. $The game is a work in progress, but fully playable.\nFor bug reports, please use the Discord community. $If the game runs slowly, please ensure 'Hardware Acceleration' is turned on in your browser settings.`, - + "accessMenu": "To access the menu, press M or Escape while awaiting input.\nThe menu contains settings and various features.", - + "menu": `From this menu you can access the settings. $From the settings you can change game speed, window style, and other options. $There are also various other features here, so be sure to check them all!`, diff --git a/src/locales/en/weather.ts b/src/locales/en/weather.ts index 85ec1ff78d6..1e4602f362c 100644 --- a/src/locales/en/weather.ts +++ b/src/locales/en/weather.ts @@ -33,7 +33,7 @@ export const weather: SimpleTranslationEntries = { "heavyRainStartMessage": "A heavy downpour started!", "heavyRainLapseMessage": "The heavy downpour continues.", "heavyRainClearMessage": "The heavy rain stopped.", - + "harshSunStartMessage": "The sunlight got hot!", "harshSunLapseMessage": "The sun is scorching hot.", "harshSunClearMessage": "The harsh sunlight faded.", diff --git a/src/locales/es/ability.ts b/src/locales/es/ability.ts index cb6e4836ed5..56f3afe6b02 100644 --- a/src/locales/es/ability.ts +++ b/src/locales/es/ability.ts @@ -471,7 +471,7 @@ export const ability: AbilityTranslationEntries = { }, "honeyGather": { name: "Recogemiel", - description: "Puede que encuentre Miel una vez concluido el combate." + description: "The Pokémon gathers Honey after a battle. The Honey is then sold for money." }, "frisk": { name: "Cacheo", diff --git a/src/locales/es/battle.ts b/src/locales/es/battle.ts index fcf8354990a..36e6d5b4167 100644 --- a/src/locales/es/battle.ts +++ b/src/locales/es/battle.ts @@ -4,6 +4,7 @@ export const battle: SimpleTranslationEntries = { "bossAppeared": "¡{{bossName}} te corta el paso!", "trainerAppeared": "¡{{trainerName}}\nte desafía!", "trainerAppearedDouble": "{{trainerName}}\nwould like to battle!", + "trainerSendOut": "{{trainerName}} sent out\n{{pokemonName}}!", "singleWildAppeared": "¡Un {{pokemonName}} salvaje te corta el paso!", "multiWildAppeared": "¡Un {{pokemonName1}} y un {{pokemonName2}} salvajes\nte cortan el paso!", "playerComeBack": "¡{{pokemonName}}, ven aquí!", @@ -12,7 +13,9 @@ export const battle: SimpleTranslationEntries = { "trainerGo": "¡{{trainerName}} saca a {{pokemonName}}!", "switchQuestion": "¿Quieres cambiar a\n{{pokemonName}}?", "trainerDefeated": "¡Has derrotado a\n{{trainerName}}!", + "moneyWon": "You got\n₽{{moneyAmount}} for winning!", "pokemonCaught": "¡{{pokemonName}} atrapado!", + "partyFull": "Your party is full.\nRelease a Pokémon to make room for {{pokemonName}}?", "pokemon": "Pokémon", "sendOutPokemon": "¡Adelante, {{pokemonName}}!", "hitResultCriticalHit": "!Un golpe crítico!", diff --git a/src/locales/es/biome.ts b/src/locales/es/biome.ts new file mode 100644 index 00000000000..5631b91b836 --- /dev/null +++ b/src/locales/es/biome.ts @@ -0,0 +1,40 @@ +import { SimpleTranslationEntries } from "#app/plugins/i18n"; + +export const biome: SimpleTranslationEntries = { + "unknownLocation": "Somewhere you can\'t remember", + "TOWN": "Town", + "PLAINS": "Plains", + "GRASS": "Grassy Field", + "TALL_GRASS": "Tall Grass", + "METROPOLIS": "Metropolis", + "FOREST": "Forest", + "SEA": "Sea", + "SWAMP": "Swamp", + "BEACH": "Beach", + "LAKE": "Lake", + "SEABED": "Seabed", + "MOUNTAIN": "Mountain", + "BADLANDS": "Badlands", + "CAVE": "Cave", + "DESERT": "Desert", + "ICE_CAVE": "Ice Cave", + "MEADOW": "Meadow", + "POWER_PLANT": "Power Plant", + "VOLCANO": "Volcano", + "GRAVEYARD": "Graveyard", + "DOJO": "Dojo", + "FACTORY": "Factory", + "RUINS": "Ancient Ruins", + "WASTELAND": "Wasteland", + "ABYSS": "Abyss", + "SPACE": "Space", + "CONSTRUCTION_SITE": "Construction Site", + "JUNGLE": "Jungle", + "FAIRY_CAVE": "Fairy Cave", + "TEMPLE": "Temple", + "SLUM": "Slum", + "SNOWY_FOREST": "Snowy Forest", + "ISLAND": "Island", + "LABORATORY": "Laboratory", + "END": "???", +} as const; diff --git a/src/locales/es/config.ts b/src/locales/es/config.ts index 0fcbd59ffee..03ad165148c 100644 --- a/src/locales/es/config.ts +++ b/src/locales/es/config.ts @@ -21,6 +21,7 @@ import { weather } from "./weather"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; import { voucher } from "./voucher"; +import { biome } from "./biome"; export const esConfig = { ability: ability, @@ -48,4 +49,5 @@ export const esConfig = { battleMessageUiHandler: battleMessageUiHandler, berry: berry, voucher: voucher, + biome: biome, }; diff --git a/src/locales/es/modifier-type.ts b/src/locales/es/modifier-type.ts index 007934e8b2d..afe81bfe300 100644 --- a/src/locales/es/modifier-type.ts +++ b/src/locales/es/modifier-type.ts @@ -139,10 +139,10 @@ export const modifierType: ModifierTypeTranslationEntries = { "HYPER_POTION": { name: "Hyper Potion" }, "MAX_POTION": { name: "Max Potion" }, "FULL_RESTORE": { name: "Full Restore" }, - + "REVIVE": { name: "Revive" }, "MAX_REVIVE": { name: "Max Revive" }, - + "FULL_HEAL": { name: "Full Heal" }, "SACRED_ASH": { name: "Sacred Ash" }, @@ -187,12 +187,12 @@ export const modifierType: ModifierTypeTranslationEntries = { "AMULET_COIN": { name: "Amulet Coin", description: "Increases money rewards by 20%" }, "GOLDEN_PUNCH": { name: "Golden Punch", description: "Grants 50% of damage inflicted as money" }, "COIN_CASE": { name: "Coin Case", description: "After every 10th battle, receive 10% of your money in interest" }, - + "LOCK_CAPSULE": { name: "Lock Capsule", description: "Allows you to lock item rarities when rerolling items" }, "GRIP_CLAW": { name: "Grip Claw" }, "WIDE_LENS": { name: "Wide Lens" }, - + "MULTI_LENS": { name: "Multi Lens" }, "HEALING_CHARM": { name: "Healing Charm", description: "Increases the effectiveness of HP restoring moves and items by 10% (excludes Revives)" }, @@ -290,7 +290,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "TART_APPLE": "Tart Apple", "STRAWBERRY_SWEET": "Strawberry Sweet", "UNREMARKABLE_TEACUP": "Unremarkable Teacup", - + "CHIPPED_POT": "Chipped Pot", "BLACK_AUGURITE": "Black Augurite", "GALARICA_CUFF": "Galarica Cuff", diff --git a/src/locales/es/pokemon-info.ts b/src/locales/es/pokemon-info.ts index 887a0853070..4861ac1f82f 100644 --- a/src/locales/es/pokemon-info.ts +++ b/src/locales/es/pokemon-info.ts @@ -37,5 +37,5 @@ export const pokemonInfo: PokemonInfoTranslationEntries = { "DARK": "Siniestro", "FAIRY": "Hada", "STELLAR": "Astral", - }, + }, } as const; diff --git a/src/locales/es/trainers.ts b/src/locales/es/trainers.ts index cf858568665..a240009eab9 100644 --- a/src/locales/es/trainers.ts +++ b/src/locales/es/trainers.ts @@ -5,7 +5,9 @@ export const titles: SimpleTranslationEntries = { "elite_four": "Elite Four", "gym_leader": "Gym Leader", "gym_leader_female": "Gym Leader", + "gym_leader_double": "Gym Leader Duo", "champion": "Champion", + "champion_double": "Champion Duo", "rival": "Rival", "professor": "Professor", "frontier_brain": "Frontier Brain", @@ -240,4 +242,16 @@ export const trainerNames: SimpleTranslationEntries = { "leon": "Leon", "rival": "Finn", "rival_female": "Ivy", + + // Double Names + "blue_red_double": "Blue & Red", + "red_blue_double": "Red & Blue", + "tate_liza_double": "Tate & Liza", + "liza_tate_double": "Liza & Tate", + "steven_wallace_double": "Steven & Wallace", + "wallace_steven_double": "Wallace & Steven", + "alder_iris_double": "Alder & Iris", + "iris_alder_double": "Iris & Alder", + "marnie_piers_double": "Marnie & Piers", + "piers_marnie_double": "Piers & Marnie", } as const; diff --git a/src/locales/es/tutorial.ts b/src/locales/es/tutorial.ts index bca488c3058..2582ad5e24f 100644 --- a/src/locales/es/tutorial.ts +++ b/src/locales/es/tutorial.ts @@ -8,10 +8,10 @@ export const tutorial: SimpleTranslationEntries = { $comunidad de Discord. $Si el juego va lento, por favor, asegúrate de que tengas activada la opción 'Aceleración de gráficos' en los $ajustes de tu navegador.`, - + "accessMenu": `Para acceder al menú, pulsa M o Escape cuando\ntengas el control. $El menú contiene los ajustes y otras funciones.`, - + "menu": `Desde este menú podrás acceder a los ajustes. $Podrás cambiar la velocidad del juego, el estilo de la ventana y demás. $Hay más opciones, ¡así que pruébalas todas!`, diff --git a/src/locales/es/weather.ts b/src/locales/es/weather.ts index 85ec1ff78d6..1e4602f362c 100644 --- a/src/locales/es/weather.ts +++ b/src/locales/es/weather.ts @@ -33,7 +33,7 @@ export const weather: SimpleTranslationEntries = { "heavyRainStartMessage": "A heavy downpour started!", "heavyRainLapseMessage": "The heavy downpour continues.", "heavyRainClearMessage": "The heavy rain stopped.", - + "harshSunStartMessage": "The sunlight got hot!", "harshSunLapseMessage": "The sun is scorching hot.", "harshSunClearMessage": "The harsh sunlight faded.", diff --git a/src/locales/fr/ability.ts b/src/locales/fr/ability.ts index 49bfeb53acf..83bb46c7408 100644 --- a/src/locales/fr/ability.ts +++ b/src/locales/fr/ability.ts @@ -471,7 +471,7 @@ export const ability: AbilityTranslationEntries = { }, honeyGather: { name: "Cherche Miel", - description: "Le Pokémon peut parfois trouver du Miel après un combat.", + description: "The Pokémon gathers Honey after a battle. The Honey is then sold for money.", }, frisk: { name: "Fouille", diff --git a/src/locales/fr/battle.ts b/src/locales/fr/battle.ts index a2ddc87993b..b1ae6f48f35 100644 --- a/src/locales/fr/battle.ts +++ b/src/locales/fr/battle.ts @@ -4,6 +4,7 @@ export const battle: SimpleTranslationEntries = { "bossAppeared": "Un {{bossName}} apparait.", "trainerAppeared": "Un combat est lancé\npar {{trainerName}} !", "trainerAppearedDouble": "Un combat est lancé\npar {{trainerName}} !", + "trainerSendOut": "{{pokemonName}} est envoyé par\n{{trainerName}} !", "singleWildAppeared": "Un {{pokemonName}} sauvage apparait !", "multiWildAppeared": "Un {{pokemonName1}} et un {{pokemonName2}}\nsauvages apparaissent !", "playerComeBack": "{{pokemonName}} !\nReviens !", @@ -12,7 +13,9 @@ export const battle: SimpleTranslationEntries = { "trainerGo": "{{pokemonName}} est envoyé par\n{{trainerName}} !", "switchQuestion": "Voulez-vous changer\nvotre {{pokemonName}} ?", "trainerDefeated": "Vous avez battu\n{{trainerName}} !", + "moneyWon": "Vous remportez\n{{moneyAmount}} ₽ !", "pokemonCaught": "Vous avez attrapé {{pokemonName}} !", + "partyFull": "Votre équipe est pleine.\nRelâcher un Pokémon pour {{pokemonName}} ?", "pokemon": "Pokémon", "sendOutPokemon": "{{pokemonName}} ! Go !", "hitResultCriticalHit": "Coup critique !", diff --git a/src/locales/fr/biome.ts b/src/locales/fr/biome.ts new file mode 100644 index 00000000000..42b15396339 --- /dev/null +++ b/src/locales/fr/biome.ts @@ -0,0 +1,40 @@ +import { SimpleTranslationEntries } from "#app/plugins/i18n"; + +export const biome: SimpleTranslationEntries = { + "unknownLocation": "Dans un endroit inconnu", + "TOWN": "Ville", + "PLAINS": "Plaines", + "GRASS": "Herbes", + "TALL_GRASS": "Hautes Herbes", + "METROPOLIS": "Métropole", + "FOREST": "Forêt", + "SEA": "Mer", + "SWAMP": "Marécage", + "BEACH": "Plage", + "LAKE": "Lac", + "SEABED": "Fonds Marins", + "MOUNTAIN": "Montagne", + "BADLANDS": "Terres Sauvages", + "CAVE": "Grotte", + "DESERT": "Desert", + "ICE_CAVE": "Caverne Glaciale", + "MEADOW": "Prairie", + "POWER_PLANT": "Centrale Électrique", + "VOLCANO": "Volcan", + "GRAVEYARD": "Cimetière", + "DOJO": "Dojo", + "FACTORY": "Usine", + "RUINS": "Ruines", + "WASTELAND": "Terres Désolées", + "ABYSS": "Gouffre", + "SPACE": "Espace", + "CONSTRUCTION_SITE": "Chantier", + "JUNGLE": "Jungle", + "FAIRY_CAVE": "Grotte Féérique", + "TEMPLE": "Temple", + "SLUM": "Bidonville", + "SNOWY_FOREST": "Forêt Enneigée", + "ISLAND": "Île", + "LABORATORY": "Laboratoire", + "END": "???", +} as const; diff --git a/src/locales/fr/config.ts b/src/locales/fr/config.ts index 1afc206e090..2504b399905 100644 --- a/src/locales/fr/config.ts +++ b/src/locales/fr/config.ts @@ -21,6 +21,8 @@ import { weather } from "./weather"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; import { voucher } from "./voucher"; +import { biome } from "./biome"; + export const frConfig = { ability: ability, @@ -48,4 +50,5 @@ export const frConfig = { battleMessageUiHandler: battleMessageUiHandler, berry: berry, voucher: voucher, + biome: biome, }; diff --git a/src/locales/fr/modifier-type.ts b/src/locales/fr/modifier-type.ts index b9d47ca80e2..0faf5cc9b6c 100644 --- a/src/locales/fr/modifier-type.ts +++ b/src/locales/fr/modifier-type.ts @@ -139,10 +139,10 @@ export const modifierType: ModifierTypeTranslationEntries = { "HYPER_POTION": { name: "Hyper Potion" }, "MAX_POTION": { name: "Potion Max" }, "FULL_RESTORE": { name: "Guérison" }, - + "REVIVE": { name: "Rappel" }, "MAX_REVIVE": { name: "Rappel Max" }, - + "FULL_HEAL": { name: "Total Soin" }, "SACRED_ASH": { name: "Cendres Sacrées" }, @@ -187,12 +187,12 @@ export const modifierType: ModifierTypeTranslationEntries = { "AMULET_COIN": { name: "Pièce Rune", description: "Augmente de 20% les gains d’argent" }, "GOLDEN_PUNCH": { name: "Poing Doré", description: "50% des dégâts infligés sont convertis en argent" }, "COIN_CASE": { name: "Boite Jetons", description: "Tous les 10 combats, recevez 10% de votre argent en intérêts" }, - + "LOCK_CAPSULE": { name: "Poké Écrin", description: "Permet de verrouiller des objets rares si vous relancez les objets proposés" }, "GRIP_CLAW": { name: "Accro Griffe" }, "WIDE_LENS": { name: "Loupe" }, - + "MULTI_LENS": { name: "Multi Loupe" }, "HEALING_CHARM": { name: "Charme Soin", description: "Augmente de 10% l’efficacité des capacités et objets de soin de PV (hors Rappels)" }, @@ -290,7 +290,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "TART_APPLE": "Pomme Acidulée", "STRAWBERRY_SWEET": "Fraise en Sucre", "UNREMARKABLE_TEACUP": "Bol Médiocre", - + "CHIPPED_POT": "Théière Ébréchée", "BLACK_AUGURITE": "Obsidienne", "GALARICA_CUFF": "Bracelet Galanoa", @@ -381,8 +381,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "CORNERSTONE_MASK": "Masque de la Pierre", "SHOCK_DRIVE": "Module Choc", "BURN_DRIVE": "Module Pyro", - "CHILL_DRIVE": "Module Aqua", - "DOUSE_DRIVE": "Module Choc", + "CHILL_DRIVE": "Module Cryo", + "DOUSE_DRIVE": "Module Aqua", "FIST_PLATE": "Fist Plate", "SKY_PLATE": "Sky Plate", diff --git a/src/locales/fr/trainers.ts b/src/locales/fr/trainers.ts index 9fb7a38f675..dba69041c79 100644 --- a/src/locales/fr/trainers.ts +++ b/src/locales/fr/trainers.ts @@ -5,7 +5,9 @@ export const titles: SimpleTranslationEntries = { "elite_four": "Conseil 4", "gym_leader": "Champion d’Arène", "gym_leader_female": "Championne d’Arène", + "gym_leader_double": "Gym Leader Duo", "champion": "Maitre·esse", //Written in gender-inclusive language in wait of a potential split of the entry + "champion_double": "Champion Duo", "rival": "Rival·e", //Written in gender-inclusive language in wait of a potential split of the entry "professor": "Professeur·e", //Written in gender-inclusive language in wait of a potential split of the entry "frontier_brain": "Meneur·euse de Zone", //Written in gender-inclusive language in wait of a potential split of the entry @@ -61,7 +63,7 @@ export const trainerClasses: SimpleTranslationEntries = { "maid": "Gouvernante", "madame": "Mondaine", "medical_team": "Médecins", - "musician": "Musicien", + "musician": "Musicien", "hex_maniac": "Mystimaniac", "nurse": "Infirmière", "nursery_aide": "Institutrice", @@ -241,4 +243,17 @@ export const trainerNames: SimpleTranslationEntries = { "leon": "Tarak", "rival": "Gwenaël", //Male breton name, a celtic language spoken in Brittany (France) and related to the word for "white" (gwenn). Finn meaning is also "white" in irish/goidelic which are also celtic languages. "rival_female": "Papina", //Litteral translation of ivy, also used as Female name in a North-American indigenous language + + + // Double Names + "blue_red_double": "Blue & Red", + "red_blue_double": "Red & Blue", + "tate_liza_double": "Tate & Liza", + "liza_tate_double": "Liza & Tate", + "steven_wallace_double": "Steven & Wallace", + "wallace_steven_double": "Wallace & Steven", + "alder_iris_double": "Alder & Iris", + "iris_alder_double": "Iris & Alder", + "marnie_piers_double": "Marnie & Piers", + "piers_marnie_double": "Piers & Marnie", } as const; diff --git a/src/locales/fr/weather.ts b/src/locales/fr/weather.ts index 0f7072210dc..76d56887578 100644 --- a/src/locales/fr/weather.ts +++ b/src/locales/fr/weather.ts @@ -33,7 +33,7 @@ export const weather: SimpleTranslationEntries = { "heavyRainStartMessage": "Une pluie battante s’abat soudainement !", "heavyRainLapseMessage": "La pluie battante continue.", "heavyRainClearMessage": "La pluie battante s’est arrêtée…", - + "harshSunStartMessage": "Les rayons du soleil s’intensifient !", "harshSunLapseMessage": "Les rayons du soleil sont brulants !", "harshSunClearMessage": "Les rayons du soleil s’affaiblissent !", diff --git a/src/locales/it/ability.ts b/src/locales/it/ability.ts index e0e827ff27c..9eb9480f771 100644 --- a/src/locales/it/ability.ts +++ b/src/locales/it/ability.ts @@ -471,7 +471,7 @@ export const ability: AbilityTranslationEntries = { }, honeyGather: { name: "Mielincetta", - description: "Il Pokémon può raccogliere del Miele alla fine della lotta.", + description: "The Pokémon gathers Honey after a battle. The Honey is then sold for money.", }, frisk: { name: "Indagine", diff --git a/src/locales/it/battle.ts b/src/locales/it/battle.ts index 4cd640132c4..444e1f01bf0 100644 --- a/src/locales/it/battle.ts +++ b/src/locales/it/battle.ts @@ -4,6 +4,7 @@ export const battle: SimpleTranslationEntries = { "bossAppeared": "{{bossName}} è apparso.", "trainerAppeared": "{{trainerName}}\nvuole combattere!", "trainerAppearedDouble": "{{trainerName}}\nwould like to battle!", + "trainerSendOut": "{{trainerName}} manda in campo\n{{pokemonName}}!", "singleWildAppeared": "Appare {{pokemonName}} selvatico!", "multiWildAppeared": "Appaiono {{pokemonName1}}\ne {{pokemonName2}} salvatici!", "playerComeBack": "Rientra, {{pokemonName}}!", @@ -12,7 +13,9 @@ export const battle: SimpleTranslationEntries = { "trainerGo": "{{trainerName}} manda in campo {{pokemonName}}!", "switchQuestion": "Vuoi cambiare\n{{pokemonName}}?", "trainerDefeated": "Hai sconfitto\n{{trainerName}}!", + "moneyWon": "Hai vinto {{moneyAmount}}₽", "pokemonCaught": "Preso! {{pokemonName}} è stato catturato!", + "partyFull": "La tua squadra è al completo.\nVuoi liberare un Pokémon per far spazio a {{pokemonName}}?", "pokemon": "Pokémon", "sendOutPokemon": "Vai! {{pokemonName}}!", "hitResultCriticalHit": "Brutto colpo!", diff --git a/src/locales/it/biome.ts b/src/locales/it/biome.ts new file mode 100644 index 00000000000..5631b91b836 --- /dev/null +++ b/src/locales/it/biome.ts @@ -0,0 +1,40 @@ +import { SimpleTranslationEntries } from "#app/plugins/i18n"; + +export const biome: SimpleTranslationEntries = { + "unknownLocation": "Somewhere you can\'t remember", + "TOWN": "Town", + "PLAINS": "Plains", + "GRASS": "Grassy Field", + "TALL_GRASS": "Tall Grass", + "METROPOLIS": "Metropolis", + "FOREST": "Forest", + "SEA": "Sea", + "SWAMP": "Swamp", + "BEACH": "Beach", + "LAKE": "Lake", + "SEABED": "Seabed", + "MOUNTAIN": "Mountain", + "BADLANDS": "Badlands", + "CAVE": "Cave", + "DESERT": "Desert", + "ICE_CAVE": "Ice Cave", + "MEADOW": "Meadow", + "POWER_PLANT": "Power Plant", + "VOLCANO": "Volcano", + "GRAVEYARD": "Graveyard", + "DOJO": "Dojo", + "FACTORY": "Factory", + "RUINS": "Ancient Ruins", + "WASTELAND": "Wasteland", + "ABYSS": "Abyss", + "SPACE": "Space", + "CONSTRUCTION_SITE": "Construction Site", + "JUNGLE": "Jungle", + "FAIRY_CAVE": "Fairy Cave", + "TEMPLE": "Temple", + "SLUM": "Slum", + "SNOWY_FOREST": "Snowy Forest", + "ISLAND": "Island", + "LABORATORY": "Laboratory", + "END": "???", +} as const; diff --git a/src/locales/it/config.ts b/src/locales/it/config.ts index de5bfe32b8a..942ef2063c7 100644 --- a/src/locales/it/config.ts +++ b/src/locales/it/config.ts @@ -21,6 +21,8 @@ import { weather } from "./weather"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; import { voucher } from "./voucher"; +import { biome } from "./biome"; + export const itConfig = { ability: ability, @@ -48,4 +50,5 @@ export const itConfig = { battleMessageUiHandler: battleMessageUiHandler, berry: berry, voucher: voucher, + biome: biome, }; diff --git a/src/locales/it/modifier-type.ts b/src/locales/it/modifier-type.ts index 88b8a545b59..271d55ce6da 100644 --- a/src/locales/it/modifier-type.ts +++ b/src/locales/it/modifier-type.ts @@ -139,10 +139,10 @@ export const modifierType: ModifierTypeTranslationEntries = { "HYPER_POTION": { name: "Iperpozione" }, "MAX_POTION": { name: "Pozione Max" }, "FULL_RESTORE": { name: "Ricarica Totale" }, - + "REVIVE": { name: "Revitalizzante" }, "MAX_REVIVE": { name: "Revitalizzante Max" }, - + "FULL_HEAL": { name: "Cura Totale" }, "SACRED_ASH": { name: "Cenere Magica" }, @@ -187,12 +187,12 @@ export const modifierType: ModifierTypeTranslationEntries = { "AMULET_COIN": { name: "Monetamuleto", description: "Aumenta le ricompense in denaro del 20%" }, "GOLDEN_PUNCH": { name: "Pugno Dorato", description: "Garantisce il 50% dei danni inflitti come denaro" }, "COIN_CASE": { name: " Salvadanaio", description: "Dopo ogni 10° battaglia, riceverete il 10% del vostro denaro in interessi" }, - + "LOCK_CAPSULE": { name: "Capsula Scrigno", description: "Permette di bloccare le rarità degli oggetti quando si fa un reroll degli oggetti" }, "GRIP_CLAW": { name: "Presartigli" }, "WIDE_LENS": { name: "Grandelente" }, - + "MULTI_LENS": { name: "Multilente" }, "HEALING_CHARM": { name: "Curamuleto", description: "Aumenta del 10% l'efficacia delle mosse e degli oggetti che ripristinano i PS (escluse le rianimazioni)" }, @@ -290,7 +290,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "TART_APPLE": "Aspropomo", "STRAWBERRY_SWEET": "Bonbonfragola", "UNREMARKABLE_TEACUP": "Tazza dozzinale", - + "CHIPPED_POT": "Teiera crepata", "BLACK_AUGURITE": "Augite nera", "GALARICA_CUFF": "Fascia Galarnoce", diff --git a/src/locales/it/starter-select-ui-handler.ts b/src/locales/it/starter-select-ui-handler.ts index c8e172b89f6..0f3f9df421a 100644 --- a/src/locales/it/starter-select-ui-handler.ts +++ b/src/locales/it/starter-select-ui-handler.ts @@ -22,7 +22,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "nature": "Natura:", "eggMoves": "Mosse delle uova", "start": "Inizia", - "addToParty": "Aggiungi al Gruppo", + "addToParty": "Aggiungi al Gruppo", "toggleIVs": "Vedi/Nascondi IV", "manageMoves": "Gestisci Mosse", "useCandies": "Usa Caramelle", diff --git a/src/locales/it/trainers.ts b/src/locales/it/trainers.ts index 46199b8aa13..a65589b43dd 100644 --- a/src/locales/it/trainers.ts +++ b/src/locales/it/trainers.ts @@ -5,7 +5,9 @@ export const titles: SimpleTranslationEntries = { "elite_four": "Superquattro", "gym_leader": "Capopalestra", "gym_leader_female": "Capopalestra", + "gym_leader_double": "Gym Leader Duo", "champion": "Campione", + "champion_double": "Champion Duo", "rival": "Rivale", "professor": "Professore", "frontier_brain": "Asso Lotta", @@ -241,4 +243,17 @@ export const trainerNames: SimpleTranslationEntries = { "leon": "Leon", "rival": "Finn", "rival_female": "Ivy", + + + // Double Names + "blue_red_double": "Blue & Red", + "red_blue_double": "Red & Blue", + "tate_liza_double": "Tate & Liza", + "liza_tate_double": "Liza & Tate", + "steven_wallace_double": "Steven & Wallace", + "wallace_steven_double": "Wallace & Steven", + "alder_iris_double": "Alder & Iris", + "iris_alder_double": "Iris & Alder", + "marnie_piers_double": "Marnie & Piers", + "piers_marnie_double": "Piers & Marnie", } as const; diff --git a/src/locales/it/tutorial.ts b/src/locales/it/tutorial.ts index c4215b68e43..8488fc3151f 100644 --- a/src/locales/it/tutorial.ts +++ b/src/locales/it/tutorial.ts @@ -5,9 +5,9 @@ export const tutorial: SimpleTranslationEntries = { $Questo gioco non è monetizzato e non siamo proprietari di Pokemon e Assets presenti nel gioco. $Il gioco è work-in-progress ma giocabile al 100%.\nPer reportare eventuali bugs è possibile discuterne sul nostro Discord. $Se il game risulta 'lento', assicurati di aver abilitato l'Accelerazione Hardware nelle impostazioni del tuo Browser`, - + "accessMenu": "Per accedere al menù, press M o Esc.\nDal menù puoi cambiare impostazioni, controllare la wiki e accedere a varie features.", - + "menu": `Da questo menù puoi accedere alle impostazioni. $Dalle impostazioni puoi cambiare velocità di gioco, stile di finestra e altre opzioni. $Ci sono varie funzionalità, controlla bene e non perderti nulla!`, diff --git a/src/locales/it/weather.ts b/src/locales/it/weather.ts index ae07570aeb9..3895fcebc46 100644 --- a/src/locales/it/weather.ts +++ b/src/locales/it/weather.ts @@ -33,7 +33,7 @@ export const weather: SimpleTranslationEntries = { "heavyRainStartMessage": "Ha iniziato a piovere forte!", "heavyRainLapseMessage": "La pioggia battente continua.", "heavyRainClearMessage": "La pioggia battente è cessata.", - + "harshSunStartMessage": "La luce solare è molto intensa!", "harshSunLapseMessage": "La luce solare è estremamente calda.", "harshSunClearMessage": "La luce solare si sta attenuando.", diff --git a/src/locales/pt_BR/ability.ts b/src/locales/pt_BR/ability.ts index 060a8b7611e..05ef735bfde 100644 --- a/src/locales/pt_BR/ability.ts +++ b/src/locales/pt_BR/ability.ts @@ -471,7 +471,7 @@ export const ability: AbilityTranslationEntries = { }, honeyGather: { name: "Honey Gather", - description: "O Pokémon pode coletar Mel ao final de uma batalha.", + description: "The Pokémon gathers Honey after a battle. The Honey is then sold for money.", }, frisk: { name: "Frisk", diff --git a/src/locales/pt_BR/battle.ts b/src/locales/pt_BR/battle.ts index 327b0cb51e9..b96266ac189 100644 --- a/src/locales/pt_BR/battle.ts +++ b/src/locales/pt_BR/battle.ts @@ -5,6 +5,7 @@ export const battle: SimpleTranslationEntries = { "trainerAppeared": "{{trainerName}}\nquer batalhar!", "trainerAppearedDouble": "{{trainerName}}\nquerem batalhar!", "singleWildAppeared": "Um {{pokemonName}} selvagem apareceu!", + "trainerSendOut": "{{trainerName}} sent out\n{{pokemonName}}!", "multiWildAppeared": "Um {{pokemonName1}} e um {{pokemonName2}} selvagens\napareceram!", "playerComeBack": "{{pokemonName}}, retorne!", "trainerComeBack": "{{trainerName}} retirou {{pokemonName}} da batalha!", @@ -12,7 +13,9 @@ export const battle: SimpleTranslationEntries = { "trainerGo": "{{trainerName}} escolheu {{pokemonName}}!", "switchQuestion": "Quer trocar\nde {{pokemonName}}?", "trainerDefeated": "Você derrotou\n{{trainerName}}!", + "moneyWon": "You got\n₽{{moneyAmount}} for winning!", "pokemonCaught": "{{pokemonName}} foi capturado!", + "partyFull": "Your party is full.\nRelease a Pokémon to make room for {{pokemonName}}?", "pokemon": "Pokémon", "sendOutPokemon": "{{pokemonName}}, eu escolho você!!", "hitResultCriticalHit": "Um golpe crítico!", diff --git a/src/locales/pt_BR/biome.ts b/src/locales/pt_BR/biome.ts new file mode 100644 index 00000000000..5631b91b836 --- /dev/null +++ b/src/locales/pt_BR/biome.ts @@ -0,0 +1,40 @@ +import { SimpleTranslationEntries } from "#app/plugins/i18n"; + +export const biome: SimpleTranslationEntries = { + "unknownLocation": "Somewhere you can\'t remember", + "TOWN": "Town", + "PLAINS": "Plains", + "GRASS": "Grassy Field", + "TALL_GRASS": "Tall Grass", + "METROPOLIS": "Metropolis", + "FOREST": "Forest", + "SEA": "Sea", + "SWAMP": "Swamp", + "BEACH": "Beach", + "LAKE": "Lake", + "SEABED": "Seabed", + "MOUNTAIN": "Mountain", + "BADLANDS": "Badlands", + "CAVE": "Cave", + "DESERT": "Desert", + "ICE_CAVE": "Ice Cave", + "MEADOW": "Meadow", + "POWER_PLANT": "Power Plant", + "VOLCANO": "Volcano", + "GRAVEYARD": "Graveyard", + "DOJO": "Dojo", + "FACTORY": "Factory", + "RUINS": "Ancient Ruins", + "WASTELAND": "Wasteland", + "ABYSS": "Abyss", + "SPACE": "Space", + "CONSTRUCTION_SITE": "Construction Site", + "JUNGLE": "Jungle", + "FAIRY_CAVE": "Fairy Cave", + "TEMPLE": "Temple", + "SLUM": "Slum", + "SNOWY_FOREST": "Snowy Forest", + "ISLAND": "Island", + "LABORATORY": "Laboratory", + "END": "???", +} as const; diff --git a/src/locales/pt_BR/config.ts b/src/locales/pt_BR/config.ts index 587a5e62fb9..52a7357e170 100644 --- a/src/locales/pt_BR/config.ts +++ b/src/locales/pt_BR/config.ts @@ -20,9 +20,11 @@ import { tutorial } from "./tutorial"; import { weather } from "./weather"; import { berry } from "./berry"; import { voucher } from "./voucher"; +import { biome } from "./biome"; -export const ptBrConfig = { + +export const ptBrConfig = { ability: ability, abilityTriggers: abilityTriggers, battle: battle, @@ -47,4 +49,5 @@ export const ptBrConfig = { modifierType: modifierType, berry: berry, voucher: voucher, + biome: biome, }; diff --git a/src/locales/pt_BR/modifier-type.ts b/src/locales/pt_BR/modifier-type.ts index 9d8e5f1675a..22446846a05 100644 --- a/src/locales/pt_BR/modifier-type.ts +++ b/src/locales/pt_BR/modifier-type.ts @@ -139,10 +139,10 @@ export const modifierType: ModifierTypeTranslationEntries = { "HYPER_POTION": { name: "Hiper Poção" }, "MAX_POTION": { name: "Poção Máxima" }, "FULL_RESTORE": { name: "Restaurador" }, - + "REVIVE": { name: "Reanimador" }, "MAX_REVIVE": { name: "Reanimador Máximo" }, - + "FULL_HEAL": { name: "Cura Total" }, "SACRED_ASH": { name: "Cinza Sagrada" }, @@ -187,12 +187,12 @@ export const modifierType: ModifierTypeTranslationEntries = { "AMULET_COIN": { name: "Moeda Amuleto", description: "Aumenta a recompensa de dinheiro em 50%" }, "GOLDEN_PUNCH": { name: "Soco Dourado", description: "Concede 50% do dano causado em dinheiro" }, "COIN_CASE": { name: "Moedeira", description: "Após cada 10ª batalha, recebe 10% de seu dinheiro em juros" }, - + "LOCK_CAPSULE": { name: "Cápsula de Travamento", description: "Permite que você trave raridades de itens ao rolar novamente" }, "GRIP_CLAW": { name: "Garra-Aperto" }, "WIDE_LENS": { name: "Lente Ampla" }, - + "MULTI_LENS": { name: "Multi Lentes" }, "HEALING_CHARM": { name: "Amuleto de Cura", description: "Aumenta a eficácia dos movimentos e itens que restauram PS em 10% (exceto Reanimador)" }, @@ -290,7 +290,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "TART_APPLE": "Maçã Azeda", "STRAWBERRY_SWEET": "Doce de Morango", "UNREMARKABLE_TEACUP": "Xícara Comum", - + "CHIPPED_POT": "Pote Lascado", "BLACK_AUGURITE": "Mineral Negro", "GALARICA_CUFF": "Bracelete de Galar", diff --git a/src/locales/pt_BR/trainers.ts b/src/locales/pt_BR/trainers.ts index add49fcb072..5cbe19873dd 100644 --- a/src/locales/pt_BR/trainers.ts +++ b/src/locales/pt_BR/trainers.ts @@ -5,7 +5,9 @@ export const titles: SimpleTranslationEntries = { "elite_four": "Elite dos Quatro", "gym_leader": "Líder de Ginásio", "gym_leader_female": "Líder de Ginásio", + "gym_leader_double": "Gym Leader Duo", "champion": "Campeão", + "champion_double": "Champion Duo", "rival": "Rival", "professor": "Professor", "frontier_brain": "Cérebro da Fronteira", @@ -61,7 +63,7 @@ export const trainerClasses: SimpleTranslationEntries = { "maid": "Doméstica", "madame": "Madame", "medical_team": "Equipe Médica", - "musician": "Músico", + "musician": "Músico", "hex_maniac": "Ocultista", "nurse": "Enfermeira", "nursery_aide": "Professora do Berçário", @@ -241,4 +243,16 @@ export const trainerNames: SimpleTranslationEntries = { "leon": "Leon", "rival": "Finn", "rival_female": "Ivy", + + // Double Names + "blue_red_double": "Blue & Red", + "red_blue_double": "Red & Blue", + "tate_liza_double": "Tate & Liza", + "liza_tate_double": "Liza & Tate", + "steven_wallace_double": "Steven & Wallace", + "wallace_steven_double": "Wallace & Steven", + "alder_iris_double": "Alder & Iris", + "iris_alder_double": "Iris & Alder", + "marnie_piers_double": "Marnie & Piers", + "piers_marnie_double": "Piers & Marnie", } as const; diff --git a/src/locales/pt_BR/weather.ts b/src/locales/pt_BR/weather.ts index 31027a691c3..269ba0e3726 100644 --- a/src/locales/pt_BR/weather.ts +++ b/src/locales/pt_BR/weather.ts @@ -33,7 +33,7 @@ export const weather: SimpleTranslationEntries = { "heavyRainStartMessage": "Um temporal começou!", "heavyRainLapseMessage": "O temporal continua forte.", "heavyRainClearMessage": "O temporal parou.", - + "harshSunStartMessage": "A luz do sol está escaldante!", "harshSunLapseMessage": "A luz do sol é intensa.", "harshSunClearMessage": "A luz do sol enfraqueceu.", diff --git a/src/locales/zh_CN/ability.ts b/src/locales/zh_CN/ability.ts index 24859668764..77034d61743 100644 --- a/src/locales/zh_CN/ability.ts +++ b/src/locales/zh_CN/ability.ts @@ -471,11 +471,11 @@ export const ability: AbilityTranslationEntries = { }, honeyGather: { name: "采蜜", - description: "战斗结束时,有时候会捡来\n甜甜蜜。", + description: "The Pokémon gathers Honey after a battle. The Honey is then sold for money.", }, frisk: { name: "察觉", - description: "进入战斗时,神奇宝贝可以检查对方神奇宝贝的能力。", + description: "出场时,可以察觉对手的特性。", }, reckless: { name: "舍身", @@ -1063,7 +1063,7 @@ export const ability: AbilityTranslationEntries = { }, asOneGlastrier: { name: "人马一体", - description: "兼备蕾冠王的紧张感和灵幽\n马的漆黑嘶鸣这两种特性。", + description: "兼备蕾冠王的紧张感和雪暴\n马的苍白嘶鸣这两种特性。", }, asOneSpectrier: { name: "人马一体", @@ -1211,11 +1211,11 @@ export const ability: AbilityTranslationEntries = { }, embodyAspectTeal: { name: "面影辉映", - description: "将回忆映于心中,让水井面\n具发出光辉,提高自己的特\n防。", + description: "将回忆映于心中,让碧草面\n具发出光辉,提高自己的速\n度。", }, embodyAspectWellspring: { name: "面影辉映", - description: "将回忆映于心中,让碧草面\n具发出光辉,提高自己的速\n度。", + description: "将回忆映于心中,让水井面\n具发出光辉,提高自己的特\n防。", }, embodyAspectHearthflame: { name: "面影辉映", diff --git a/src/locales/zh_CN/battle.ts b/src/locales/zh_CN/battle.ts index 5334bfe154b..6eb400f5176 100644 --- a/src/locales/zh_CN/battle.ts +++ b/src/locales/zh_CN/battle.ts @@ -4,26 +4,29 @@ export const battle: SimpleTranslationEntries = { "bossAppeared": "{{bossName}} 出现了。", "trainerAppeared": "{{trainerName}}\n想要和你对战!", "trainerAppearedDouble": "{{trainerName}}\n想要和你对战!", + "trainerSendOut": "{{trainerName}} 派出了\n{{pokemonName}}!", "singleWildAppeared": "一只野生 {{pokemonName}} 出现了!", "multiWildAppeared": "野生的 {{pokemonName1}}\n和 {{pokemonName2}} 出现了!", "playerComeBack": "回来吧, {{pokemonName}}!", "trainerComeBack": "{{trainerName}} 收回了 {{pokemonName}}!", "playerGo": "去吧! {{pokemonName}}!", - "trainerGo": "{{trainerName}} 派出了 {{pokemonName}}!", + "trainerGo": "{{trainerName}} 派出了\n{{pokemonName}}!", "switchQuestion": "要更换\n{{pokemonName}}吗?", "trainerDefeated": "你击败了\n{{trainerName}}!", + "moneyWon": "你赢得了\n₽{{moneyAmount}}!", "pokemonCaught": "{{pokemonName}} 被抓住了!", + "partyFull": "你的队伍已满员.是否放生其他宝可梦\n为 {{pokemonName}} 腾出空间?", "pokemon": "宝可梦", - "sendOutPokemon": "上吧! {{pokemonName}}!", + "sendOutPokemon": "上吧!\n{{pokemonName}}!", "hitResultCriticalHit": "击中了要害!", "hitResultSuperEffective": "效果拔群!", "hitResultNotVeryEffective": "收效甚微…", "hitResultNoEffect": "对 {{pokemonName}} 没有效果!!", - "hitResultOneHitKO": "一击必杀!", + "hitResultOneHitKO": "一击必杀!", "attackFailed": "但是失败了!", "attackHitsCount": "击中 {{count}} 次!", "expGain": "{{pokemonName}} 获得了 {{exp}} 经验值!", - "levelUp": "{{pokemonName}} 升级到 Lv. {{level}}!", + "levelUp": "{{pokemonName}} 升级到 Lv.{{level}}!", "learnMove": "{{pokemonName}} 学会了 {{moveName}}!", "learnMovePrompt": "{{pokemonName}} 想要学习 {{moveName}}。", "learnMoveLimitReached": "但是,{{pokemonName}} 已经学会了\n四个技能", @@ -32,7 +35,7 @@ export const battle: SimpleTranslationEntries = { "learnMoveNotLearned": "{{pokemonName}} 没有学会 {{moveName}}。", "learnMoveForgetQuestion": "要忘记哪个技能?", "learnMoveForgetSuccess": "{{pokemonName}} 忘记了\n如何使用 {{moveName}}。", - "countdownPoof": "@d{32}1, @d{15}2, @d{15}和@d{15}… @d{15}… @d{15}… @d{15}@s{pb_bounce_1}噗!", + "countdownPoof": "@d{32}1, @d{15}2 @d{15}… @d{15}… @d{15}@s{pb_bounce_1}空!", "learnMoveAnd": "然后...", "levelCapUp": "等级上限提升到 {{levelCap}}!", "moveNotImplemented": "{{moveName}} 尚未实装,无法选择。", diff --git a/src/locales/zh_CN/biome.ts b/src/locales/zh_CN/biome.ts new file mode 100644 index 00000000000..cd0f1219177 --- /dev/null +++ b/src/locales/zh_CN/biome.ts @@ -0,0 +1,40 @@ +import { SimpleTranslationEntries } from "#app/plugins/i18n"; + +export const biome: SimpleTranslationEntries = { + "unknownLocation": "未知领域", + "TOWN": "城镇", + "PLAINS": "平原", + "GRASS": "草地", + "TALL_GRASS": "高草", + "METROPOLIS": "都市", + "FOREST": "森林", + "SEA": "海洋", + "SWAMP": "湿地", + "BEACH": "沙滩", + "LAKE": "湖泊", + "SEABED": "海底", + "MOUNTAIN": "山脉", + "BADLANDS": "荒地", + "CAVE": "洞窟", + "DESERT": "沙漠", + "ICE_CAVE": "冰窟", + "MEADOW": "草原", + "POWER_PLANT": "发电厂", + "VOLCANO": "火山", + "GRAVEYARD": "墓地", + "DOJO": "道场", + "FACTORY": "工厂", + "RUINS": "遗迹", + "WASTELAND": "荒地", + "ABYSS": "深穴", + "SPACE": "太空", + "CONSTRUCTION_SITE": "工地", + "JUNGLE": "丛林", + "FAIRY_CAVE": "仙洞", + "TEMPLE": "寺庙", + "SLUM": "陋巷", + "SNOWY_FOREST": "雪原", + "ISLAND": "岛屿", + "LABORATORY": "实验室", + "END": "???", +} as const; diff --git a/src/locales/zh_CN/config.ts b/src/locales/zh_CN/config.ts index be096007655..7dd42a392c5 100644 --- a/src/locales/zh_CN/config.ts +++ b/src/locales/zh_CN/config.ts @@ -21,6 +21,8 @@ import { weather } from "./weather"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; import { voucher } from "./voucher"; +import { biome } from "./biome"; + export const zhCnConfig = { @@ -49,4 +51,5 @@ export const zhCnConfig = { battleMessageUiHandler: battleMessageUiHandler, berry: berry, voucher: voucher, + biome: biome, }; diff --git a/src/locales/zh_CN/menu.ts b/src/locales/zh_CN/menu.ts index 63b34811cc1..cdd1862e0f3 100644 --- a/src/locales/zh_CN/menu.ts +++ b/src/locales/zh_CN/menu.ts @@ -18,13 +18,13 @@ export const menu: SimpleTranslationEntries = { "login": "登录", "register": "注册", "emptyUsername": "用户名不能为空", - "invalidLoginUsername": "提供的用户名无效", + "invalidLoginUsername": "输入的用户名无效", "invalidRegisterUsername": "用户名只能包含字母、数字或下划线", - "invalidLoginPassword": "提供的密码无效", + "invalidLoginPassword": "输入的密码无效", "invalidRegisterPassword": "密码必须至少包含 6 个字符", - "usernameAlreadyUsed": "提供的用户名已被使用", - "accountNonExistent": "提供的用户不存在", - "unmatchingPassword": "提供的密码不匹配", + "usernameAlreadyUsed": "输入的用户名已被使用", + "accountNonExistent": "输入的用户不存在", + "unmatchingPassword": "输入的密码不匹配", "passwordNotMatchingConfirmPassword": "密码必须与确认密码一致", "confirmPassword": "确认密码", "registrationAgeWarning": "注册即表示您确认您已年满 13 岁。", diff --git a/src/locales/zh_CN/modifier-type.ts b/src/locales/zh_CN/modifier-type.ts index f290f7b644e..12af6749dc7 100644 --- a/src/locales/zh_CN/modifier-type.ts +++ b/src/locales/zh_CN/modifier-type.ts @@ -17,7 +17,7 @@ export const modifierType: ModifierTypeTranslationEntries = { } }, "PokemonHpRestoreModifierType": { - description: "为一只宝可梦回复 {{restorePoints}} HP 或 {{restorePercent}}% HP,取最大值", + description: "为一只宝可梦回复 {{restorePoints}} HP 或 {{restorePercent}}% HP,取较大值", extra: { "fully": "为一只宝可梦回复全部HP", "fullyWithStatus": "为一只宝可梦回复全部HP并消除所有负面\n状态", @@ -139,10 +139,10 @@ export const modifierType: ModifierTypeTranslationEntries = { "HYPER_POTION": { name: "厉害伤药" }, "MAX_POTION": { name: "全满药" }, "FULL_RESTORE": { name: "全复药" }, - + "REVIVE": { name: "活力碎片" }, "MAX_REVIVE": { name: "活力块" }, - + "FULL_HEAL": { name: "万灵药" }, "SACRED_ASH": { name: "圣灰" }, @@ -187,16 +187,16 @@ export const modifierType: ModifierTypeTranslationEntries = { "AMULET_COIN": { name: "护符金币", description: "金钱奖励增加20%" }, "GOLDEN_PUNCH": { name: "黄金拳头", description: "将50%造成的伤害转换为金钱" }, "COIN_CASE": { name: "代币盒", description: "每十场战斗, 获得自己金钱10%的利息" }, - + "LOCK_CAPSULE": { name: "上锁的容器", description: "允许在刷新物品时锁定物品稀有度" }, "GRIP_CLAW": { name: "紧缠钩爪" }, "WIDE_LENS": { name: "广角镜" }, - + "MULTI_LENS": { name: "多重镜" }, "HEALING_CHARM": { name: "治愈护符", description: "HP回复量增加10% (含复活)" }, - "CANDY_JAR": { name: "糖果罐", description: "神奇糖果提供的升级提升1级" }, + "CANDY_JAR": { name: "糖果罐", description: "神奇糖果提供的升级额外增加1级" }, "BERRY_POUCH": { name: "树果袋", description: "使用树果时有33%的几率不会消耗树果" }, @@ -290,7 +290,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "TART_APPLE": "酸酸苹果", "STRAWBERRY_SWEET": "草莓糖饰", "UNREMARKABLE_TEACUP": "凡作茶碗", - + "CHIPPED_POT": "缺损的茶壶", "BLACK_AUGURITE": "黑奇石", "GALARICA_CUFF": "伽勒豆蔻手环", diff --git a/src/locales/zh_CN/move.ts b/src/locales/zh_CN/move.ts index 1268bcc985c..e8d4b847d99 100644 --- a/src/locales/zh_CN/move.ts +++ b/src/locales/zh_CN/move.ts @@ -2915,7 +2915,7 @@ export const move: MoveTranslationEntries = { }, "zippyZap": { name: "电电加速", - effect: "The user attacks the target with bursts of electricity at high speed. This move always goes first and raises the user's evasiveness.", + effect: "迅猛无比的电击。必定能够\n先制攻击,并且提高自己的\n闪避率。", }, "splishySplash": { name: "滔滔冲浪", @@ -3809,4 +3809,4 @@ export const move: MoveTranslationEntries = { name: "邪毒锁链", effect: "用由毒形成的锁链缠住对手\n注入毒素加以侵蚀。有时会\n让对手陷入剧毒状态", } -} as const; +} 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 a4e511038f6..9491438bb13 100644 --- a/src/locales/zh_CN/starter-select-ui-handler.ts +++ b/src/locales/zh_CN/starter-select-ui-handler.ts @@ -22,7 +22,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "nature": "性格:", "eggMoves": "蛋招式", "start": "开始", - "addToParty": "加入队伍", + "addToParty": "加入队伍", "toggleIVs": "切换个体值", "manageMoves": "管理招式", "useCandies": "使用糖果", diff --git a/src/locales/zh_CN/trainers.ts b/src/locales/zh_CN/trainers.ts index 4d8703629c4..66ec51a7b0a 100644 --- a/src/locales/zh_CN/trainers.ts +++ b/src/locales/zh_CN/trainers.ts @@ -5,7 +5,9 @@ export const titles: SimpleTranslationEntries = { "elite_four": "四天王", "gym_leader": "道馆馆主", "gym_leader_female": "道馆馆主", + "gym_leader_double": "Gym Leader Duo", "champion": "冠军", + "champion_double": "Champion Duo", "rival": "劲敌", "professor": "博士", "frontier_brain": "开拓头脑", @@ -297,4 +299,17 @@ export const trainerNames: SimpleTranslationEntries = { // 劲敌 rival "rival": "芬恩", "rival_female": "艾薇", + + + // Double Names + "blue_red_double": "Blue & Red", + "red_blue_double": "Red & Blue", + "tate_liza_double": "Tate & Liza", + "liza_tate_double": "Liza & Tate", + "steven_wallace_double": "Steven & Wallace", + "wallace_steven_double": "Wallace & Steven", + "alder_iris_double": "Alder & Iris", + "iris_alder_double": "Iris & Alder", + "marnie_piers_double": "Marnie & Piers", + "piers_marnie_double": "Piers & Marnie", } as const; diff --git a/src/locales/zh_CN/tutorial.ts b/src/locales/zh_CN/tutorial.ts index 65fb8cd1d06..0e53c24b420 100644 --- a/src/locales/zh_CN/tutorial.ts +++ b/src/locales/zh_CN/tutorial.ts @@ -4,11 +4,11 @@ export const tutorial: SimpleTranslationEntries = { "intro": `欢迎来到PokéRogue!这是一款以战斗为核心的融合了roguelite元素的宝可梦同人游戏。 $本游戏未进行商业化,我们没有\nPokémon或Pokémon使用的版 $权资产的所有权。 - $游戏仍在开发中,但已可完整游玩。如需报\n告错误,请使用 Discord 社区。 + $游戏仍在开发中,但已可完整游玩。如需报\n告错误,请通过 Discord 社区。 $如果游戏运行缓慢,请确保在浏览器设置中\n打开了“硬件加速”。`, - + "accessMenu": "在等待输入时,按 M 或 Escape 键可访\n问菜单。菜单包含设置和各种功能。", - + "menu": `在此菜单中,您可以访问设置。 $在设置中,您可以更改游戏速度、窗口样式\n和其他选项。 $这里还有各种其他功能,请务必全部查看!`, diff --git a/src/locales/zh_TW/ability.ts b/src/locales/zh_TW/ability.ts index bf374c28f06..f760a9614f6 100644 --- a/src/locales/zh_TW/ability.ts +++ b/src/locales/zh_TW/ability.ts @@ -418,7 +418,7 @@ export const ability: AbilityTranslationEntries = { snowWarning: { name: "降雪", description: "出場時,會將天氣變爲下雪。" }, honeyGather: { name: "採蜜", - description: "戰鬥結束時,有時候會撿來\n甜甜蜜。", + description: "The Pokémon gathers Honey after a battle. The Honey is then sold for money.", }, frisk: { name: "察覺", diff --git a/src/locales/zh_TW/biome.ts b/src/locales/zh_TW/biome.ts new file mode 100644 index 00000000000..5631b91b836 --- /dev/null +++ b/src/locales/zh_TW/biome.ts @@ -0,0 +1,40 @@ +import { SimpleTranslationEntries } from "#app/plugins/i18n"; + +export const biome: SimpleTranslationEntries = { + "unknownLocation": "Somewhere you can\'t remember", + "TOWN": "Town", + "PLAINS": "Plains", + "GRASS": "Grassy Field", + "TALL_GRASS": "Tall Grass", + "METROPOLIS": "Metropolis", + "FOREST": "Forest", + "SEA": "Sea", + "SWAMP": "Swamp", + "BEACH": "Beach", + "LAKE": "Lake", + "SEABED": "Seabed", + "MOUNTAIN": "Mountain", + "BADLANDS": "Badlands", + "CAVE": "Cave", + "DESERT": "Desert", + "ICE_CAVE": "Ice Cave", + "MEADOW": "Meadow", + "POWER_PLANT": "Power Plant", + "VOLCANO": "Volcano", + "GRAVEYARD": "Graveyard", + "DOJO": "Dojo", + "FACTORY": "Factory", + "RUINS": "Ancient Ruins", + "WASTELAND": "Wasteland", + "ABYSS": "Abyss", + "SPACE": "Space", + "CONSTRUCTION_SITE": "Construction Site", + "JUNGLE": "Jungle", + "FAIRY_CAVE": "Fairy Cave", + "TEMPLE": "Temple", + "SLUM": "Slum", + "SNOWY_FOREST": "Snowy Forest", + "ISLAND": "Island", + "LABORATORY": "Laboratory", + "END": "???", +} as const; diff --git a/src/locales/zh_TW/config.ts b/src/locales/zh_TW/config.ts index 05bc59d0141..9a88d7ae7c4 100644 --- a/src/locales/zh_TW/config.ts +++ b/src/locales/zh_TW/config.ts @@ -21,8 +21,9 @@ import { weather } from "./weather"; import { battleMessageUiHandler } from "./battle-message-ui-handler"; import { berry } from "./berry"; import { voucher } from "./voucher"; +import { biome } from "./biome"; -export const zhTWConfig = { +export const zhTWConfig = { ability: ability, abilityTriggers: abilityTriggers, battle: battle, @@ -48,4 +49,5 @@ export const zhTWConfig = { battleMessageUiHandler: battleMessageUiHandler, berry: berry, voucher: voucher, + biome: biome, }; diff --git a/src/locales/zh_TW/move.ts b/src/locales/zh_TW/move.ts index 80604445e9d..2dc42353a2b 100644 --- a/src/locales/zh_TW/move.ts +++ b/src/locales/zh_TW/move.ts @@ -34,8 +34,8 @@ export const move: MoveTranslationEntries = { scratch: { name: "抓", effect: "用堅硬且無比鋒利的爪子抓\n對手進行攻擊" }, viseGrip: { name: "夾住", effect: "將對手從兩側夾住,給予傷\n害" }, guillotine: { - name: "極落鉗", - effect: "用大鉗子或剪刀等夾斷對手\n進行攻擊。只要命中就會一\n擊昏厥", + name: "斷頭鉗", + effect: "用大鉗子或剪刀等夾斷對手\n進行攻擊。只要命中就會一\n擊瀕死", }, razorWind: { name: "旋風刀", @@ -45,7 +45,7 @@ export const move: MoveTranslationEntries = { name: "劍舞", effect: "激烈地跳起戰舞提高氣勢。\n大幅提高自己的攻擊", }, - cut: { name: "居合劈", effect: "用鐮刀或爪子等切斬對手進\n行攻擊" }, + cut: { name: "居合斬", effect: "用鐮刀或爪子等切斬對手進\n行攻擊" }, gust: { name: "起風", effect: "用翅膀將颳起的狂風襲向對\n手進行攻擊" }, wingAttack: { name: "翅膀攻擊", @@ -217,7 +217,7 @@ export const move: MoveTranslationEntries = { effect: "一邊旋轉,一邊將尖喙刺入\n對手進行攻擊", }, submission: { - name: "深淵翻滾", + name: "地獄翻滾", effect: "將對手連同自己一起摔向地\n面進行攻擊。自己也會受到\n少許傷害", }, lowKick: { @@ -305,7 +305,7 @@ export const move: MoveTranslationEntries = { }, fissure: { name: "地裂", - effect: "讓對手掉落於地裂的裂縫中\n進行攻擊。只要命中就會一\n擊昏厥", + effect: "讓對手掉落於地裂的裂縫中\n進行攻擊。只要命中就會一\n擊瀕死", }, dig: { name: "挖洞", effect: "第1回合鑽入地底,第2回\n合攻擊對手" }, toxic: { @@ -421,8 +421,8 @@ export const move: MoveTranslationEntries = { effect: "模仿對手使用的招式,自己\n也使用相同招式", }, selfDestruct: { - name: "玉石俱碎", - effect: "引發爆炸,攻擊自己周圍所\n有的寶可夢。使用後陷入昏\n厥", + name: "自爆", + effect: "引發爆炸,攻擊自己周圍所\n有的寶可夢。使用後陷入瀕\n死", }, eggBomb: { name: "炸蛋", effect: "向對手用力投擲大大的蛋進\n行攻擊" }, lick: { @@ -548,7 +548,7 @@ export const move: MoveTranslationEntries = { }, explosion: { name: "大爆炸", - effect: "引發大爆炸,攻擊自己周圍\n所有的寶可夢。使用後自己\n會陷入昏厥", + effect: "引發大爆炸,攻擊自己周圍\n所有的寶可夢。使用後自己\n會陷入瀕死", }, furySwipes: { name: "亂抓", @@ -563,15 +563,15 @@ export const move: MoveTranslationEntries = { effect: "連續睡上2回合。回覆自己\n的全部HP以及治癒所有異\n常狀態", }, rockSlide: { - name: "巖崩", + name: "岩崩", effect: "將大岩石猛烈地撞向對手進\n行攻擊。有時會使對手畏縮", }, hyperFang: { - name: "終結門牙", + name: "必殺門牙", effect: "用鋒利的門牙牢牢地咬住對\n手進行攻擊。有時會使對手\n畏縮", }, sharpen: { - name: "棱角化", + name: "稜角化", effect: "增加身體的角,變得棱棱角\n角,從而提高自己的攻擊", }, conversion: { @@ -651,7 +651,7 @@ export const move: MoveTranslationEntries = { effect: "將棉花般柔軟的孢子緊貼對\n手,從而大幅降低對手的速\n度", }, reversal: { - name: "絕處逢生", + name: "起死回生", effect: "竭盡全力進行攻擊。自己的\nHP越少,招式的威力越大", }, spite: { @@ -671,7 +671,7 @@ export const move: MoveTranslationEntries = { effect: "以迅雷不及掩耳之勢出拳。\n必定能夠先制攻擊", }, scaryFace: { - name: "可怕面孔", + name: "鬼面", effect: "用恐怖的表情瞪着對手,使\n其害怕,從而大幅降低對手\n的速度", }, feintAttack: { @@ -712,11 +712,11 @@ export const move: MoveTranslationEntries = { }, destinyBond: { name: "同命", - effect: "使出招式後,當受到對手攻\n擊陷入昏厥時,對手也會一\n同昏厥。連續使出則會失敗", + effect: "使出招式後,當受到對手攻\n擊陷入瀕死時,對手也會一\n同瀕死。連續使出則會失敗", }, perishSong: { - name: "終焉之歌", - effect: "傾聽歌聲的寶可夢經過3回\n合陷入昏厥。替換後效果消\n失", + name: "滅亡之歌", + effect: "傾聽歌聲的寶可夢經過3回\n合陷入瀕死。替換後效果消\n失", }, icyWind: { name: "冰凍之風", @@ -922,7 +922,7 @@ export const move: MoveTranslationEntries = { effect: "在使用招式2回合後,向對\n手發送一團念力進行攻擊", }, rockSmash: { - name: "碎巖", + name: "碎岩", effect: "用拳頭進行攻擊。有時會降\n低對手的防禦", }, whirlpool: { @@ -970,7 +970,7 @@ export const move: MoveTranslationEntries = { effect: "吹捧對手,使其混亂。同時\n還會提高對手的特攻", }, willOWisp: { - name: "磷火", + name: "鬼火", effect: "放出怪異的火焰,從而讓對\n手陷入灼傷狀態", }, memento: { @@ -1023,8 +1023,8 @@ export const move: MoveTranslationEntries = { effect: "向同伴緊急求助,從我方寶\n可夢已學會的招式中隨機使\n用1個", }, ingrain: { - name: "紮根", - effect: "在大地上紮根,每回合回覆\n自己的HP。因爲紮根了,\n所以不能替換寶可夢", + name: "扎根", + effect: "在大地上扎根,每回合回覆\n自己的HP。因爲扎根了,\n所以不能替換寶可夢", }, superpower: { name: "蠻力", @@ -1201,8 +1201,8 @@ export const move: MoveTranslationEntries = { effect: "讓對手聽舒適的笛聲,從而\n陷入睡眠狀態", }, tickle: { - name: "撓癢", - effect: "給對手撓癢,使其發笑,從\n而降低對手的攻擊和防禦", + name: "搔癢", + effect: "給對手搔癢,使其發笑,從\n而降低對手的攻擊和防禦", }, cosmicPower: { name: "宇宙力量", @@ -1222,16 +1222,16 @@ export const move: MoveTranslationEntries = { effect: "發出看不見的神奇力量進行\n攻擊。有時會使對手畏縮", }, skyUppercut: { - name: "沖天拳", + name: "衝天拳", effect: "用衝向天空般高高的上勾拳\n頂起對手進行攻擊", }, sandTomb: { - name: "流沙深淵", + name: "流沙地獄", effect: "將對手困在鋪天蓋地的沙暴\n中,在4~5回合內進行攻\n擊", }, sheerCold: { name: "絕對零度", - effect: "給對手一擊昏厥。如果是冰\n屬性以外的寶可夢使用,就\n會難以打中", + effect: "給對手一擊瀕死。如果是冰\n屬性以外的寶可夢使用,就\n會難以打中", }, muddyWater: { name: "濁流", @@ -1353,7 +1353,7 @@ export const move: MoveTranslationEntries = { }, healingWish: { name: "治癒之願", - effect: "雖然自己陷入昏厥,但可以\n治癒後備上場的寶可夢的異\n常狀態以及回覆HP", + effect: "雖然自己陷入瀕死,但可以\n治癒後備上場的寶可夢的異\n常狀態以及回覆HP", }, brine: { name: "鹽水", @@ -1511,15 +1511,15 @@ export const move: MoveTranslationEntries = { name: "暗襲要害", effect: "抓住瞬間的空隙切斬對手。\n容易擊中要害", }, - aquaTail: { - name: "水流尾", effect: "如驚濤駭浪般揮動大尾巴攻\n擊對手" + aquaTail: { + name: "水流尾", effect: "如驚濤駭浪般揮動大尾巴攻\n擊對手" }, seedBomb: { name: "種子炸彈", effect: "將外殼堅硬的大種子,從上\n方砸下攻擊對手", }, airSlash: { - name: "空氣之刃", + name: "空氣斬", effect: "用連天空也能劈開的空氣之\n刃進行攻擊。有時會使對手\n畏縮", }, xScissor: { @@ -1538,8 +1538,8 @@ export const move: MoveTranslationEntries = { name: "龍之俯衝", effect: "釋放出駭人的殺氣,一邊威\n懾一邊撞擊對手。有時會使\n對手畏縮", }, - powerGem: { - name: "力量寶石", effect: "發射如寶石般閃耀的光芒攻\n擊對手" + powerGem: { + name: "力量寶石", effect: "發射如寶石般閃耀的光芒攻\n擊對手" }, drainPunch: { name: "吸取拳", @@ -1630,7 +1630,7 @@ export const move: MoveTranslationEntries = { effect: "將身體的光芒聚集在一點釋\n放出去。有時會降低對手的\n特防", }, rockClimb: { - name: "攀巖", + name: "攀岩", effect: "發動猛撞攻擊,有時會使對\n手混亂。是寶可表的祕傳招\n式之一", }, defog: { @@ -1642,7 +1642,7 @@ export const move: MoveTranslationEntries = { effect: "製造出離奇的空間。在5回\n合內速度慢的寶可夢可以先\n行動", }, dracoMeteor: { - name: "流星羣", + name: "流星群", effect: "從天空中向對手落下隕石。\n使用之後因爲反作用力,自\n己的特攻會大幅降低", }, discharge: { @@ -1690,7 +1690,7 @@ export const move: MoveTranslationEntries = { effect: "♂誘惑♀或♀誘惑♂,從而\n大幅降低對手的特攻", }, stealthRock: { - name: "隱形巖", + name: "隱形岩", effect: "將無數岩石懸浮在對手的周\n圍,從而對替換出場的對手\n的寶可夢給予傷害", }, grassKnot: { @@ -1853,8 +1853,8 @@ export const move: MoveTranslationEntries = { name: "電球", effect: "用電氣團撞向對手。自己比\n對手速度越快,威力越大", }, - soak: { - name: "浸水", effect: "將大量的水潑向對手,從而\n使其變成水屬性" + soak: { + name: "浸水", effect: "將大量的水潑向對手,從而\n使其變成水屬性" }, flameCharge: { name: "蓄能焰襲", @@ -1893,7 +1893,7 @@ export const move: MoveTranslationEntries = { effect: "用歌聲攻擊對手。大家一起\n輪唱便可以接連使出,威力\n也會提高", }, echoedVoice: { - name: "回聲", + name: "迴聲", effect: "用回聲攻擊對手。如果每回\n合都有寶可夢接着使用該招\n式,威力就會提高", }, chipAway: { @@ -1945,11 +1945,11 @@ export const move: MoveTranslationEntries = { effect: "扔飛對手,強制拉後備寶可\n夢上場。如果對手爲野生寶\n可夢,戰鬥將直接結束", }, incinerate: { - name: "燒淨", + name: "燒盡", effect: "用火焰攻擊對手。對手攜帶\n樹果等時,會燒掉,使其不\n能使用", }, - quash: { - name: "延後", effect: "壓制對手,從而將其行動順\n序放到最後" + quash: { + name: "延後", effect: "壓制對手,從而將其行動順\n序放到最後" }, acrobatics: { name: "雜技", @@ -1972,8 +1972,8 @@ export const move: MoveTranslationEntries = { effect: "當對手未攜帶道具時,能夠\n將自己攜帶的道具交給對手", }, inferno: { - name: "烈火深淵", - effect: "用烈焰包裹住對手進行攻擊。\n讓對手陷入灼傷狀態", + name: "煉獄", + effect: "用猛烈的火焰包圍對手進行\n攻擊。讓對手陷入灼傷狀態", }, waterPledge: { name: "水之誓約", @@ -2007,8 +2007,8 @@ export const move: MoveTranslationEntries = { name: "龍尾", effect: "彈飛對手,強制拉後備寶可\n夢上場。如果對手爲野生寶\n可夢,戰鬥將直接結束", }, - workUp: { - name: "自我激勵", effect: "激勵自己,從而提高攻擊和\n特攻" + workUp: { + name: "自我激勵", effect: "激勵自己,從而提高攻擊和\n特攻" }, electroweb: { name: "電網", @@ -2238,8 +2238,8 @@ export const move: MoveTranslationEntries = { name: "嬉鬧", effect: "與對手嬉鬧並攻擊。有時會\n降低對手的攻擊", }, - fairyWind: { - name: "妖精之風", effect: "颳起妖精之風,吹向對手進\n行攻擊" + fairyWind: { + name: "妖精之風", effect: "颳起妖精之風,吹向對手進\n行攻擊" }, moonblast: { name: "月亮之力", diff --git a/src/locales/zh_TW/pokemon-info.ts b/src/locales/zh_TW/pokemon-info.ts index 0229525b75a..5c00add8081 100644 --- a/src/locales/zh_TW/pokemon-info.ts +++ b/src/locales/zh_TW/pokemon-info.ts @@ -17,25 +17,25 @@ export const pokemonInfo: PokemonInfoTranslationEntries = { }, Type: { - "UNKNOWN": "未知", - "NORMAL": "一般", - "FIGHTING": "格鬥", - "FLYING": "飛行", - "POISON": "毒", - "GROUND": "地面", - "ROCK": "岩石", - "BUG": "蟲", - "GHOST": "幽靈", - "STEEL": "鋼", - "FIRE": "火", - "WATER": "水", - "GRASS": "草", - "ELECTRIC": "電", - "PSYCHIC": "超能力", - "ICE": "冰", - "DRAGON": "龍", - "DARK": "惡", - "FAIRY": "妖精", + "UNKNOWN": "未知", + "NORMAL": "一般", + "FIGHTING": "格鬥", + "FLYING": "飛行", + "POISON": "毒", + "GROUND": "地面", + "ROCK": "岩石", + "BUG": "蟲", + "GHOST": "幽靈", + "STEEL": "鋼", + "FIRE": "火", + "WATER": "水", + "GRASS": "草", + "ELECTRIC": "電", + "PSYCHIC": "超能力", + "ICE": "冰", + "DRAGON": "龍", + "DARK": "惡", + "FAIRY": "妖精", "STELLAR": "星晶" }, } as const; diff --git a/src/locales/zh_TW/pokemon.ts b/src/locales/zh_TW/pokemon.ts index 6a0ee4f319e..cee85d8905b 100644 --- a/src/locales/zh_TW/pokemon.ts +++ b/src/locales/zh_TW/pokemon.ts @@ -31,7 +31,7 @@ export const pokemon: SimpleTranslationEntries = { "sandslash": "穿山王", "nidoran_f": "尼多蘭", "nidorina": "尼多娜", - "nidoqueen": "尼多後", + "nidoqueen": "尼多后", "nidoran_m": "尼多朗", "nidorino": "尼多力諾", "nidoking": "尼多王", @@ -57,7 +57,7 @@ export const pokemon: SimpleTranslationEntries = { "psyduck": "可達鴨", "golduck": "哥達鴨", "mankey": "猴怪", - "primeape": "火暴猴", + "primeape": "火爆猴", "growlithe": "卡蒂狗", "arcanine": "風速狗", "poliwag": "蚊香蝌蚪", @@ -76,7 +76,7 @@ export const pokemon: SimpleTranslationEntries = { "tentacruel": "毒刺水母", "geodude": "小拳石", "graveler": "隆隆石", - "golem": "隆隆巖", + "golem": "隆隆岩", "ponyta": "小火馬", "rapidash": "烈焰馬", "slowpoke": "呆呆獸", @@ -95,7 +95,7 @@ export const pokemon: SimpleTranslationEntries = { "gastly": "鬼斯", "haunter": "鬼斯通", "gengar": "耿鬼", - "onix": "大巖蛇", + "onix": "大岩蛇", "drowzee": "催眠貘", "hypno": "引夢貘人", "krabby": "大鉗蟹", @@ -156,7 +156,7 @@ export const pokemon: SimpleTranslationEntries = { "bayleef": "月桂葉", "meganium": "大竺葵", "cyndaquil": "火球鼠", - "quilava": "火巖鼠", + "quilava": "火岩鼠", "typhlosion": "火暴獸", "totodile": "小鋸鱷", "croconaw": "藍鱷", @@ -185,7 +185,7 @@ export const pokemon: SimpleTranslationEntries = { "bellossom": "美麗花", "marill": "瑪力露", "azumarill": "瑪力露麗", - "sudowoodo": "樹纔怪", + "sudowoodo": "樹才怪", "politoed": "蚊香蛙皇", "hoppip": "毽子草", "skiploom": "毽子花", @@ -233,7 +233,7 @@ export const pokemon: SimpleTranslationEntries = { "kingdra": "刺龍王", "phanpy": "小小象", "donphan": "頓甲", - "porygon2": "多邊獸2型", + "porygon2": "多邊獸Ⅱ", "stantler": "驚角鹿", "smeargle": "圖圖犬", "tyrogue": "無畏小子", @@ -338,7 +338,7 @@ export const pokemon: SimpleTranslationEntries = { "zangoose": "貓鼬斬", "seviper": "飯匙蛇", "lunatone": "月石", - "solrock": "太陽巖", + "solrock": "太陽岩", "barboach": "泥泥鰍", "whiscash": "鯰魚王", "corphish": "龍蝦小兵", @@ -438,11 +438,11 @@ export const pokemon: SimpleTranslationEntries = { "skuntank": "坦克臭鼬", "bronzor": "銅鏡怪", "bronzong": "青銅鐘", - "bonsly": "盆纔怪", + "bonsly": "盆才怪", "mime_jr": "魔尼尼", "happiny": "小福蛋", "chatot": "聒噪鳥", - "spiritomb": "花巖怪", + "spiritomb": "花岩怪", "gible": "圓陸鯊", "gabite": "尖牙陸鯊", "garchomp": "烈咬陸鯊", @@ -474,12 +474,12 @@ export const pokemon: SimpleTranslationEntries = { "glaceon": "冰伊布", "gliscor": "天蠍王", "mamoswine": "象牙豬", - "porygon_z": "多邊獸乙型", + "porygon_z": "多邊獸Z", "gallade": "艾路雷朵", "probopass": "大朝北鼻", "dusknoir": "黑夜魔靈", "froslass": "雪妖女", - "rotom": "洛託姆", + "rotom": "洛托姆", "uxie": "由克希", "mesprit": "艾姆利多", "azelf": "亞克諾姆", @@ -525,8 +525,8 @@ export const pokemon: SimpleTranslationEntries = { "blitzle": "斑斑馬", "zebstrika": "雷電斑馬", "roggenrola": "石丸子", - "boldore": "地幔巖", - "gigalith": "龐巖怪", + "boldore": "地幔岩", + "gigalith": "龐岩怪", "woobat": "滾滾蝙蝠", "swoobat": "心蝙蝠", "drilbur": "螺釘地鼠", @@ -544,7 +544,7 @@ export const pokemon: SimpleTranslationEntries = { "swadloon": "寶包繭", "leavanny": "保姆蟲", "venipede": "百足蜈蚣", - "whirlipede": "車輪球", + "whirlipede": "車輪毬", "scolipede": "蜈蚣王", "cottonee": "木棉球", "whimsicott": "風妖精", @@ -558,12 +558,12 @@ export const pokemon: SimpleTranslationEntries = { "darmanitan": "達摩狒狒", "maractus": "沙鈴仙人掌", "dwebble": "石居蟹", - "crustle": "巖殿居蟹", + "crustle": "岩殿居蟹", "scraggy": "滑滑小子", "scrafty": "頭巾混混", "sigilyph": "象徵鳥", "yamask": "哭哭面具", - "cofagrigus": "迭失棺", + "cofagrigus": "死神棺", "tirtouga": "原蓋海龜", "carracosta": "肋骨海龜", "archen": "始祖小鳥", @@ -650,7 +650,7 @@ export const pokemon: SimpleTranslationEntries = { "keldeo": "凱路迪歐", "meloetta": "美洛耶塔", "genesect": "蓋諾賽克特", - "chespin": "哈力慄", + "chespin": "哈力栗", "quilladin": "胖胖哈力", "chesnaught": "布里卡隆", "fennekin": "火狐狸", @@ -744,8 +744,8 @@ export const pokemon: SimpleTranslationEntries = { "oricorio": "花舞鳥", "cutiefly": "萌虻", "ribombee": "蝶結萌虻", - "rockruff": "巖狗狗", - "lycanroc": "鬃巖狼人", + "rockruff": "岩狗狗", + "lycanroc": "鬃岩狼人", "wishiwashi": "弱丁魚", "mareanie": "好壞星", "toxapex": "超壞星", @@ -758,7 +758,7 @@ export const pokemon: SimpleTranslationEntries = { "morelull": "睡睡菇", "shiinotic": "燈罩夜菇", "salandit": "夜盜火蜥", - "salazzle": "焰後蜥", + "salazzle": "焰后蜥", "stufful": "童偶熊", "bewear": "穿着熊", "bounsweet": "甜竹竹", @@ -778,7 +778,7 @@ export const pokemon: SimpleTranslationEntries = { "komala": "樹枕尾熊", "turtonator": "爆焰龜獸", "togedemaru": "託戈德瑪爾", - "mimikyu": "謎擬丘", + "mimikyu": "謎擬Q", "bruxish": "磨牙彩皮魚", "drampa": "老翁龍", "dhelmise": "破破舵輪", @@ -827,8 +827,8 @@ export const pokemon: SimpleTranslationEntries = { "blipbug": "索偵蟲", "dottler": "天罩蟲", "orbeetle": "以歐路普", - "nickit": "狡小狐", - "thievul": "猾大狐", + "nickit": "偷兒狐", + "thievul": "狐大盜", "gossifleur": "幼棉棉", "eldegoss": "白蓬蓬", "wooloo": "毛辮羊", @@ -848,7 +848,7 @@ export const pokemon: SimpleTranslationEntries = { "cramorant": "古月鳥", "arrokuda": "刺梭魚", "barraskewda": "戽斗尖梭", - "toxel": "電音嬰", + "toxel": "毒電嬰", "toxtricity": "顫弦蠑螈", "sizzlipede": "燒火蚣", "centiskorch": "焚焰蚣", @@ -867,7 +867,7 @@ export const pokemon: SimpleTranslationEntries = { "cursola": "魔靈珊瑚", "sirfetchd": "蔥遊兵", "mr_rime": "踏冰人偶", - "runerigus": "迭失板", + "runerigus": "死神板", "milcery": "小仙奶", "alcremie": "霜奶仙", "falinks": "列陣兵", @@ -915,7 +915,7 @@ export const pokemon: SimpleTranslationEntries = { "quaxly": "潤水鴨", "quaxwell": "湧躍鴨", "quaquaval": "狂歡浪舞鴨", - "lechonk": "愛喫豚", + "lechonk": "愛吃豚", "oinkologne": "飄香豚", "tarountula": "團珠蛛", "spidops": "操陷蛛", @@ -1039,7 +1039,7 @@ export const pokemon: SimpleTranslationEntries = { "alola_persian": "貓老大", "alola_geodude": "小拳石", "alola_graveler": "隆隆石", - "alola_golem": "隆隆巖", + "alola_golem": "隆隆岩", "alola_grimer": "臭泥", "alola_muk": "臭臭泥", "alola_exeggutor": "椰蛋樹", diff --git a/src/locales/zh_TW/starter-select-ui-handler.ts b/src/locales/zh_TW/starter-select-ui-handler.ts index f9fa9ef5333..f7139a54189 100644 --- a/src/locales/zh_TW/starter-select-ui-handler.ts +++ b/src/locales/zh_TW/starter-select-ui-handler.ts @@ -22,7 +22,7 @@ export const starterSelectUiHandler: SimpleTranslationEntries = { "nature": "性格:", "eggMoves": "孵化招式", "start": "開始", - "addToParty": "加入隊伍", + "addToParty": "加入隊伍", "toggleIVs": "查看個體值", "manageMoves": "管理技能", "useCandies": "使用糖果", diff --git a/src/locales/zh_TW/trainers.ts b/src/locales/zh_TW/trainers.ts index 03b98a97e24..41465f0cf64 100644 --- a/src/locales/zh_TW/trainers.ts +++ b/src/locales/zh_TW/trainers.ts @@ -5,7 +5,9 @@ export const titles: SimpleTranslationEntries = { "elite_four": "四天王", "gym_leader": "道館館主", "gym_leader_female": "道館館主", + "gym_leader_double": "Gym Leader Duo", "champion": "冠軍", + "champion_double": "Champion Duo", "rival": "勁敵", "professor": "博士", "frontier_brain": "開拓頭腦", @@ -296,5 +298,17 @@ export const trainerNames: SimpleTranslationEntries = { // 勁敵 Rival "rival": "芬恩", - "rival_female": "艾薇" + "rival_female": "艾薇", + + // Double Names + "blue_red_double": "Blue & Red", + "red_blue_double": "Red & Blue", + "tate_liza_double": "Tate & Liza", + "liza_tate_double": "Liza & Tate", + "steven_wallace_double": "Steven & Wallace", + "wallace_steven_double": "Wallace & Steven", + "alder_iris_double": "Alder & Iris", + "iris_alder_double": "Iris & Alder", + "marnie_piers_double": "Marnie & Piers", + "piers_marnie_double": "Piers & Marnie", } as const; diff --git a/src/locales/zh_TW/tutorial.ts b/src/locales/zh_TW/tutorial.ts index 7f2cb43801a..a97314abec8 100644 --- a/src/locales/zh_TW/tutorial.ts +++ b/src/locales/zh_TW/tutorial.ts @@ -5,26 +5,26 @@ export const tutorial: SimpleTranslationEntries = { $本遊戲未進行商業化,我們沒有\nPokémon或Pokémon使用的版 $權資產的所有權。 $遊戲仍在開發中,但已可完整遊玩。如需報\n告錯誤,請使用 Discord 社區。 - $如果遊戲運行緩慢,請確保在瀏覽器設置中\n打開了“硬件加速”。`, + $如果遊戲運行緩慢,請確保在瀏覽器設置中\n打開了“硬件加速”。`, - "accessMenu": "在等待輸入時,按 M 或 Escape 鍵可訪\n問菜單。菜單包含設置和各種功能。", + "accessMenu": "在等待輸入時,按 M 或 Escape 鍵可訪\n問菜單。菜單包含設置和各種功能。", "menu": `在此菜單中,您可以訪問設置。 $在設置中,您可以更改遊戲速度、窗口樣式\n和其他選項。 - $這裏還有各種其他功能,請務必全部查看!`, + $這裏還有各種其他功能,請務必全部查看!`, "starterSelect": `在此頁面中,您可以選擇您的初始寶可夢。\n這些是您最初的隊伍成員。 $每個初始寶可夢都有一個費用值。您的隊伍\n最多可以擁有6名成員,只要總費用不超過10。 $您還可以根據您捕獲或孵化的變種選擇性別\n、特性和形態。 - $一個物種個體值是您捕獲或孵化的所有寶可\n夢中最好的,所以儘量獲得更多同種寶可夢!`, + $一個物種個體值是您捕獲或孵化的所有寶可\n夢中最好的,所以儘量獲得更多同種寶可夢!`, "pokerus": `每天隨機3個可選的初始寶可夢會有紫色邊\n框。 $如果您看到您擁有的初始寶可夢帶有紫色邊\n框,請嘗試將其添加到您的隊伍中。請務必 - $查看其概況!`, + $查看其概況!`, "statChange": `只要您的寶可夢沒有被召回,屬性變化就會\n在戰鬥中持續存在。 $在訓練家戰鬥之前和進入新的寶可夢羣落之\n前,您的寶可夢會被召回。 - $您還可以通過按住C或Shift鍵來查看\n場上寶可夢的能力變化。`, + $您還可以通過按住C或Shift鍵來查看\n場上寶可夢的能力變化。`, "selectItem": `每次戰鬥後,您都可以選擇 3 個隨機物品。\n您只能選擇其中一個。 $這些物品包括消耗品、寶可夢攜帶物品和永\n久被動道具。 @@ -33,8 +33,8 @@ export const tutorial: SimpleTranslationEntries = { $您還可以使用轉移選項在寶可夢之間轉移攜\n帶物品。 $一旦您獲得了攜帶物品,轉移選項就會出現\n在右下角。 $您可以用金錢購買消耗品,並且隨着您遊戲\n的深入,將會有更多種類的消耗品可供選擇。 - $請務必在選擇隨機物品之前購買這些消耗品\n因爲一旦您選擇,遊戲就會進入下一場戰鬥。`, - + $請務必在選擇隨機物品之前購買這些消耗品\n因爲一旦您選擇,遊戲就會進入下一場戰鬥。`, + "eggGacha": `在此頁面中,您可以使用您的兌換券兌換寶\n可夢蛋。 $蛋需要孵化,並且在每場戰鬥後都會減少孵\n化週期。稀有蛋需要更長時間才能孵化。 $孵化的寶可夢不會被添加到您的隊伍中,它\n們將被添加到您的初始寶可夢中。 diff --git a/src/locales/zh_TW/weather.ts b/src/locales/zh_TW/weather.ts index 144f333874e..0a235b3b10c 100644 --- a/src/locales/zh_TW/weather.ts +++ b/src/locales/zh_TW/weather.ts @@ -33,7 +33,7 @@ export const weather: SimpleTranslationEntries = { "heavyRainStartMessage": "開始下起了暴雨!", "heavyRainLapseMessage": "暴雨勢頭不減。", "heavyRainClearMessage": "暴雨停了。", - + "harshSunStartMessage": "日照變得非常強了!", "harshSunLapseMessage": "強日照勢頭不減。", "harshSunClearMessage": "日照復原了。", diff --git a/src/main.ts b/src/main.ts index e9b911b0e05..c92c8eeca5b 100644 --- a/src/main.ts +++ b/src/main.ts @@ -20,7 +20,7 @@ window.onerror = function (message, source, lineno, colno, error) { }; // Catch global promise rejections and display them in an alert so users can report the issue. -window.addEventListener("unhandledrejection", (event) => { +window.addEventListener("unhandledrejection", (event) => { // const errorString = `Received unhandled promise rejection. Open browser console and click OK to see details.\nReason: ${event.reason}`; console.error(event.reason); //alert(errorString); diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 51e6c25122c..ff4ef6a37a3 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -450,7 +450,7 @@ export class BerryModifierType extends PokemonHeldItemModifierType implements Ge constructor(berryType: BerryType) { super("", `${BerryType[berryType].toLowerCase()}_berry`, (type, args) => new Modifiers.BerryModifier(type, (args[0] as Pokemon).id, berryType), "berry"); - + this.berryType = berryType; } @@ -653,7 +653,7 @@ export class PokemonExpBoosterModifierType extends PokemonHeldItemModifierType { constructor(localeKey: string, iconImage: string, boostPercent: integer) { super(localeKey, iconImage, (_type, args) => new Modifiers.PokemonExpBoosterModifier(this, (args[0] as Pokemon).id, boostPercent)); - + this.boostPercent = boostPercent; } @@ -742,7 +742,7 @@ export class EvolutionItemModifierType extends PokemonModifierType implements Ge this.evolutionItem = evolutionItem; } - + get name(): string { return i18next.t(`modifierType:EvolutionItem.${EvolutionItem[this.evolutionItem]}`); } @@ -834,7 +834,7 @@ class AttackTypeBoosterModifierTypeGenerator extends ModifierTypeGenerator { } let type: Type; - + const randInt = Utils.randSeedInt(totalWeight); let weight = 0; @@ -846,7 +846,7 @@ class AttackTypeBoosterModifierTypeGenerator extends ModifierTypeGenerator { } weight += typeWeight; } - + return new AttackTypeBoosterModifierType(type, 20); }); } @@ -1041,7 +1041,7 @@ export const modifierTypes = { HYPER_POTION: () => new PokemonHpRestoreModifierType("modifierType:ModifierType.HYPER_POTION", "hyper_potion", 200, 50), MAX_POTION: () => new PokemonHpRestoreModifierType("modifierType:ModifierType.MAX_POTION", "max_potion", 0, 100), FULL_RESTORE: () => new PokemonHpRestoreModifierType("modifierType:ModifierType.FULL_RESTORE", "full_restore", 0, 100, true), - + REVIVE: () => new PokemonReviveModifierType("modifierType:ModifierType.REVIVE", "revive", 50), MAX_REVIVE: () => new PokemonReviveModifierType("modifierType:ModifierType.MAX_REVIVE", "max_revive", 100), @@ -1192,7 +1192,7 @@ export const modifierTypes = { DNA_SPLICERS: () => new FusePokemonModifierType("modifierType:ModifierType.DNA_SPLICERS", "dna_splicers"), MINI_BLACK_HOLE: () => new TurnHeldItemTransferModifierType("modifierType:ModifierType.MINI_BLACK_HOLE", "mini_black_hole"), - + VOUCHER: () => new AddVoucherModifierType(VoucherType.REGULAR, 1), VOUCHER_PLUS: () => new AddVoucherModifierType(VoucherType.PLUS, 1), VOUCHER_PREMIUM: () => new AddVoucherModifierType(VoucherType.PREMIUM, 1), @@ -1242,7 +1242,7 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.BERRY, 2), new WeightedModifierType(modifierTypes.TM_COMMON, 1), ].map(m => { - m.setTier(ModifierTier.COMMON); return m; + m.setTier(ModifierTier.COMMON); return m; }), [ModifierTier.GREAT]: [ new WeightedModifierType(modifierTypes.GREAT_BALL, 6), @@ -1301,7 +1301,7 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.TERA_SHARD, 1), new WeightedModifierType(modifierTypes.DNA_SPLICERS, (party: Pokemon[]) => party[0].scene.gameMode.isSplicedOnly && party.filter(p => !p.fusionSpecies).length > 1 ? 4 : 0), ].map(m => { - m.setTier(ModifierTier.GREAT); return m; + m.setTier(ModifierTier.GREAT); return m; }), [ModifierTier.ULTRA]: [ new WeightedModifierType(modifierTypes.ULTRA_BALL, 24), @@ -1325,7 +1325,7 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.TERA_ORB, (party: Pokemon[]) => Math.min(Math.max(Math.floor(party[0].scene.currentBattle.waveIndex / 50) * 2, 1), 4), 4), new WeightedModifierType(modifierTypes.VOUCHER, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily ? Math.max(3 - rerollCount, 0) : 0, 3), ].map(m => { - m.setTier(ModifierTier.ULTRA); return m; + m.setTier(ModifierTier.ULTRA); return m; }), [ModifierTier.ROGUE]: [ new WeightedModifierType(modifierTypes.ROGUE_BALL, 24), @@ -1349,7 +1349,7 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.MEGA_BRACELET, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 8, 32), new WeightedModifierType(modifierTypes.DYNAMAX_BAND, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 8, 32), ].map(m => { - m.setTier(ModifierTier.ROGUE); return m; + m.setTier(ModifierTier.ROGUE); return m; }), [ModifierTier.MASTER]: [ new WeightedModifierType(modifierTypes.MASTER_BALL, 24), @@ -1360,7 +1360,7 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.DNA_SPLICERS, (party: Pokemon[]) => !party[0].scene.gameMode.isSplicedOnly && party.filter(p => !p.fusionSpecies).length > 1 ? 24 : 0, 24), new WeightedModifierType(modifierTypes.MINI_BLACK_HOLE, (party: Pokemon[]) => party[0].scene.gameData.unlocks[Unlockables.MINI_BLACK_HOLE] ? 1 : 0, 1), ].map(m => { - m.setTier(ModifierTier.MASTER); return m; + m.setTier(ModifierTier.MASTER); return m; }) }; @@ -1368,27 +1368,27 @@ const wildModifierPool: ModifierPool = { [ModifierTier.COMMON]: [ new WeightedModifierType(modifierTypes.BERRY, 1) ].map(m => { - m.setTier(ModifierTier.COMMON); return m; + m.setTier(ModifierTier.COMMON); return m; }), [ModifierTier.GREAT]: [ new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 1) ].map(m => { - m.setTier(ModifierTier.GREAT); return m; + m.setTier(ModifierTier.GREAT); return m; }), [ModifierTier.ULTRA]: [ new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 10), ].map(m => { - m.setTier(ModifierTier.ULTRA); return m; + m.setTier(ModifierTier.ULTRA); return m; }), [ModifierTier.ROGUE]: [ new WeightedModifierType(modifierTypes.LUCKY_EGG, 4), ].map(m => { - m.setTier(ModifierTier.ROGUE); return m; + m.setTier(ModifierTier.ROGUE); return m; }), [ModifierTier.MASTER]: [ new WeightedModifierType(modifierTypes.GOLDEN_EGG, 1) ].map(m => { - m.setTier(ModifierTier.MASTER); return m; + m.setTier(ModifierTier.MASTER); return m; }) }; @@ -1397,17 +1397,17 @@ const trainerModifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.BERRY, 8), new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 3) ].map(m => { - m.setTier(ModifierTier.COMMON); return m; + m.setTier(ModifierTier.COMMON); return m; }), [ModifierTier.GREAT]: [ new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 3), ].map(m => { - m.setTier(ModifierTier.GREAT); return m; + m.setTier(ModifierTier.GREAT); return m; }), [ModifierTier.ULTRA]: [ new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 1), ].map(m => { - m.setTier(ModifierTier.ULTRA); return m; + m.setTier(ModifierTier.ULTRA); return m; }), [ModifierTier.ROGUE]: [ new WeightedModifierType(modifierTypes.REVIVER_SEED, 2), @@ -1417,14 +1417,14 @@ const trainerModifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.GRIP_CLAW, 1), new WeightedModifierType(modifierTypes.WIDE_LENS, 1), ].map(m => { - m.setTier(ModifierTier.ROGUE); return m; + m.setTier(ModifierTier.ROGUE); return m; }), [ModifierTier.MASTER]: [ new WeightedModifierType(modifierTypes.KINGS_ROCK, 1), new WeightedModifierType(modifierTypes.LEFTOVERS, 1), new WeightedModifierType(modifierTypes.SHELL_BELL, 1), ].map(m => { - m.setTier(ModifierTier.MASTER); return m; + m.setTier(ModifierTier.MASTER); return m; }) }; @@ -1441,7 +1441,7 @@ const enemyBuffModifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.ENEMY_ENDURE_CHANCE, 5), new WeightedModifierType(modifierTypes.ENEMY_FUSED_CHANCE, 1) ].map(m => { - m.setTier(ModifierTier.COMMON); return m; + m.setTier(ModifierTier.COMMON); return m; }), [ModifierTier.GREAT]: [ new WeightedModifierType(modifierTypes.ENEMY_DAMAGE_BOOSTER, 5), @@ -1450,7 +1450,7 @@ const enemyBuffModifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.ENEMY_ENDURE_CHANCE, 5), new WeightedModifierType(modifierTypes.ENEMY_FUSED_CHANCE, 1) ].map(m => { - m.setTier(ModifierTier.GREAT); return m; + m.setTier(ModifierTier.GREAT); return m; }), [ModifierTier.ULTRA]: [ new WeightedModifierType(modifierTypes.ENEMY_DAMAGE_BOOSTER, 10), @@ -1460,13 +1460,13 @@ const enemyBuffModifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.ENEMY_ENDURE_CHANCE, 10), new WeightedModifierType(modifierTypes.ENEMY_FUSED_CHANCE, 5) ].map(m => { - m.setTier(ModifierTier.ULTRA); return m; + m.setTier(ModifierTier.ULTRA); return m; }), [ModifierTier.ROGUE]: [ ].map(m => { - m.setTier(ModifierTier.ROGUE); return m; + m.setTier(ModifierTier.ROGUE); return m; }), [ModifierTier.MASTER]: [ ].map(m => { - m.setTier(ModifierTier.MASTER); return m; + m.setTier(ModifierTier.MASTER); return m; }) }; @@ -1475,12 +1475,12 @@ const dailyStarterModifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 1), new WeightedModifierType(modifierTypes.BERRY, 3), ].map(m => { - m.setTier(ModifierTier.COMMON); return m; + m.setTier(ModifierTier.COMMON); return m; }), [ModifierTier.GREAT]: [ new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 5), ].map(m => { - m.setTier(ModifierTier.GREAT); return m; + m.setTier(ModifierTier.GREAT); return m; }), [ModifierTier.ULTRA]: [ new WeightedModifierType(modifierTypes.REVIVER_SEED, 4), @@ -1488,7 +1488,7 @@ const dailyStarterModifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.SOUL_DEW, 1), new WeightedModifierType(modifierTypes.GOLDEN_PUNCH, 1), ].map(m => { - m.setTier(ModifierTier.ULTRA); return m; + m.setTier(ModifierTier.ULTRA); return m; }), [ModifierTier.ROGUE]: [ new WeightedModifierType(modifierTypes.GRIP_CLAW, 5), @@ -1497,13 +1497,13 @@ const dailyStarterModifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.QUICK_CLAW, 3), new WeightedModifierType(modifierTypes.KINGS_ROCK, 3), ].map(m => { - m.setTier(ModifierTier.ROGUE); return m; + m.setTier(ModifierTier.ROGUE); return m; }), [ModifierTier.MASTER]: [ new WeightedModifierType(modifierTypes.LEFTOVERS, 1), new WeightedModifierType(modifierTypes.SHELL_BELL, 1), ].map(m => { - m.setTier(ModifierTier.MASTER); return m; + m.setTier(ModifierTier.MASTER); return m; }) }; @@ -1553,7 +1553,7 @@ const tierWeights = [ 769 / 1024, 192 / 1024, 48 / 1024, 12 / 1024, 1 / 1024 ]; export function regenerateModifierPoolThresholds(party: Pokemon[], poolType: ModifierPoolType, rerollCount: integer = 0) { const pool = getModifierPoolForType(poolType); - + const ignoredIndexes = {}; const modifierTableData = {}; const thresholds = Object.fromEntries(new Map(Object.keys(pool).map(t => { @@ -1801,7 +1801,7 @@ function getNewModifierTypeOption(party: Pokemon[], poolType: ModifierPoolType, if (index === undefined) { return null; } - + if (player) { console.log(index, ignoredPoolIndexes[tier].filter(i => i <= index).length, ignoredPoolIndexes[tier]); } diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index b49a3a11a12..233a5294849 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -364,7 +364,7 @@ export class MapModifier extends PersistentModifier { constructor(type: ModifierType, stackCount?: integer) { super(type, stackCount); } - + clone(): MapModifier { return new MapModifier(this.type, this.stackCount); } @@ -382,7 +382,7 @@ export class MegaEvolutionAccessModifier extends PersistentModifier { constructor(type: ModifierType, stackCount?: integer) { super(type, stackCount); } - + clone(): MegaEvolutionAccessModifier { return new MegaEvolutionAccessModifier(this.type, this.stackCount); } @@ -400,7 +400,7 @@ export class GigantamaxAccessModifier extends PersistentModifier { constructor(type: ModifierType, stackCount?: integer) { super(type, stackCount); } - + clone(): GigantamaxAccessModifier { return new GigantamaxAccessModifier(this.type, this.stackCount); } @@ -418,7 +418,7 @@ export class TerastallizeAccessModifier extends PersistentModifier { constructor(type: ModifierType, stackCount?: integer) { super(type, stackCount); } - + clone(): TerastallizeAccessModifier { return new TerastallizeAccessModifier(this.type, this.stackCount); } @@ -596,7 +596,7 @@ export class TerastallizeModifier extends LapsingPokemonHeldItemModifier { } return ret; } - + getTransferrable(withinParty: boolean): boolean { return false; } @@ -692,7 +692,7 @@ export class AttackTypeBoosterModifier extends PokemonHeldItemModifier { } /** - * @param {Array} args Array + * @param {Array} args Array * - Index 0: {Pokemon} Pokemon * - Index 1: {number} Move type * - Index 2: {Utils.NumberHolder} Move power @@ -1062,7 +1062,7 @@ export class PokemonHpRestoreModifier extends ConsumablePokemonModifier { pokemon.resetStatus(); } pokemon.hp = Math.min(pokemon.hp + Math.max(Math.ceil(Math.max(Math.floor((this.restorePercent * 0.01) * pokemon.getMaxHp()), restorePoints)), 1), pokemon.getMaxHp()); - + return true; } @@ -1466,7 +1466,7 @@ export class PokemonFriendshipBoosterModifier extends PokemonHeldItemModifier { clone(): PersistentModifier { return new PokemonFriendshipBoosterModifier(this.type as ModifierTypes.PokemonFriendshipBoosterModifierType, this.pokemonId, this.stackCount); } - + apply(args: any[]): boolean { const friendship = args[1] as Utils.IntegerHolder; friendship.value = Math.floor(friendship.value * (1 + 0.5 * this.getStackCount())); @@ -1491,7 +1491,7 @@ export class PokemonNatureWeightModifier extends PokemonHeldItemModifier { clone(): PersistentModifier { return new PokemonNatureWeightModifier(this.type, this.pokemonId, this.stackCount); } - + apply(args: any[]): boolean { const multiplier = args[1] as Utils.IntegerHolder; if (multiplier.value !== 1) { @@ -1559,7 +1559,7 @@ export class PokemonMultiHitModifier extends PokemonHeldItemModifier { clone(): PersistentModifier { return new PokemonMultiHitModifier(this.type as ModifierTypes.PokemonMultiHitModifierType, this.pokemonId, this.stackCount); } - + apply(args: any[]): boolean { (args[1] as Utils.IntegerHolder).value *= (this.getStackCount() + 1); @@ -1648,7 +1648,7 @@ export class MoneyRewardModifier extends ConsumableModifier { const moneyAmount = new Utils.IntegerHolder(scene.getWaveMoneyAmount(this.moneyMultiplier)); scene.applyModifiers(MoneyMultiplierModifier, true, moneyAmount); - + scene.addMoney(moneyAmount.value); return true; @@ -1856,7 +1856,7 @@ export abstract class HeldItemTransferModifier extends PokemonHeldItemModifier { let tierItemModifiers = itemModifiers.filter(m => m.type.getOrInferTier(poolType) === highestItemTier); const heldItemTransferPromises: Promise[] = []; - + for (let i = 0; i < transferredItemCount; i++) { if (!tierItemModifiers.length) { while (highestItemTier-- && !tierItemModifiers.length) { @@ -2210,7 +2210,7 @@ export class EnemyEndureChanceModifier extends EnemyPersistentModifier { if (target.battleData.endured || Phaser.Math.RND.realInRange(0, 1) >= (this.chance * this.getStackCount())) { return false; } - + target.addTag(BattlerTagType.ENDURING, 1); target.battleData.endured = true; diff --git a/src/overrides.ts b/src/overrides.ts index aab8bd16c4d..517da5a5353 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -77,8 +77,8 @@ export const OPP_VARIANT_OVERRIDE: Variant = 0; * 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"}] - * - * Some items are generated based on a sub-type (i.e. berries), to override those: + * + * 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) @@ -92,8 +92,8 @@ interface ModifierOverride { count?: integer type?: TempBattleStat|Stat|Nature|Type|BerryType } -export const STARTING_MODIFIER_OVERRIDE: Array = []; -export const OPP_MODIFIER_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 STARTING_HELD_ITEMS_OVERRIDE: Array = []; +export const OPP_HELD_ITEMS_OVERRIDE: Array = []; diff --git a/src/phases.ts b/src/phases.ts index 58e17d4d9a8..62d944e68e7 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -30,7 +30,7 @@ import { Weather, WeatherType, getRandomWeatherType, getTerrainBlockMessage, get import { TempBattleStat } from "./data/temp-battle-stat"; import { ArenaTagSide, ArenaTrapTag, MistTag, TrickRoomTag } from "./data/arena-tag"; import { ArenaTagType } from "./data/enums/arena-tag-type"; -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, applyPostBattleInitAbAttrs, PostBattleInitAbAttr, BlockNonDirectDamageAbAttr as BlockNonDirectDamageAbAttr, applyPostKnockOutAbAttrs, PostKnockOutAbAttr, PostBiomeChangeAbAttr, applyPostFaintAbAttrs, PostFaintAbAttr, IncreasePpAbAttr, PostStatChangeAbAttr, applyPostStatChangeAbAttrs, AlwaysHitAbAttr, PreventBerryUseAbAttr, StatChangeCopyAbAttr } from "./data/ability"; +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, applyPostBattleInitAbAttrs, PostBattleInitAbAttr, BlockNonDirectDamageAbAttr as BlockNonDirectDamageAbAttr, applyPostKnockOutAbAttrs, PostKnockOutAbAttr, PostBiomeChangeAbAttr, applyPostFaintAbAttrs, PostFaintAbAttr, IncreasePpAbAttr, PostStatChangeAbAttr, applyPostStatChangeAbAttrs, AlwaysHitAbAttr, PreventBerryUseAbAttr, StatChangeCopyAbAttr, applyPostMoveUsedAbAttrs, PostMoveUsedAbAttr } from "./data/ability"; import { Unlockables, getUnlockableName } from "./system/unlockables"; import { getBiomeKey } from "./field/arena"; import { BattleType, BattlerIndex, TurnCommand } from "./battle"; @@ -61,6 +61,7 @@ import { Abilities } from "./data/enums/abilities"; import * as Overrides from "./overrides"; import { TextStyle, addTextObject } from "./ui/text"; import { Type } from "./data/type"; +import { MoveUsedEvent, TurnEndEvent, TurnInitEvent } from "./battle-scene-events"; export class LoginPhase extends Phase { @@ -86,13 +87,13 @@ export class LoginPhase extends Phase { if (this.showText) { this.scene.ui.showText(i18next.t("menu:logInOrCreateAccount")); } - + this.scene.playSound("menu_open"); const loadData = () => { updateUserInfo().then(() => this.scene.gameData.loadSystem().then(() => this.end())); }; - + this.scene.ui.setMode(Mode.LOGIN_FORM, { buttonActions: [ () => { @@ -138,7 +139,7 @@ export class LoginPhase extends Phase { if (!this.scene.gameData.gender) { this.scene.unshiftPhase(new SelectGenderPhase(this.scene)); } - + handleTutorial(this.scene, Tutorial.Intro).then(() => super.end()); } } @@ -319,7 +320,7 @@ export class TitlePhase extends Phase { party.push(starterPokemon); loadPokemonAssets.push(starterPokemon.loadAssets()); } - + regenerateModifierPoolThresholds(party, ModifierPoolType.DAILY_STARTER); const modifiers: Modifier[] = Array(3).fill(null).map(() => modifierTypes.EXP_SHARE().withIdFromFunc(modifierTypes.EXP_SHARE).newModifier()) .concat(Array(3).fill(null).map(() => modifierTypes.GOLDEN_EXP_CHARM().withIdFromFunc(modifierTypes.GOLDEN_EXP_CHARM).newModifier())) @@ -341,7 +342,7 @@ export class TitlePhase extends Phase { this.end(); }); }; - + // If Online, calls seed fetch from db to generate daily run. If Offline, generates a daily run based on current date. if (!Utils.isLocal) { fetchDailyRunSeed().then(seed => { @@ -457,7 +458,7 @@ export class SelectGenderPhase extends Phase { constructor(scene: BattleScene) { super(scene); } - + start(): void { super.start(); @@ -728,6 +729,11 @@ export class EncounterPhase extends BattlePhase { this.scene.initSession(); + // Failsafe if players somehow skip floor 200 in classic mode + if (this.scene.gameMode.isClassic && this.scene.currentBattle.waveIndex > 200) { + this.scene.unshiftPhase(new GameOverPhase(this.scene)); + } + const loadEnemyAssets = []; const battle = this.scene.currentBattle; @@ -771,11 +777,11 @@ export class EncounterPhase extends BattlePhase { enemyPokemon.updateScale(); } } - + totalBst += enemyPokemon.getSpeciesForm().baseTotal; loadEnemyAssets.push(enemyPokemon.loadAssets()); - + console.log(enemyPokemon.name, enemyPokemon.species.speciesId, enemyPokemon.stats); }); @@ -915,7 +921,7 @@ export class EncounterPhase extends BattlePhase { const trainer = this.scene.currentBattle.trainer; trainer.untint(100, "Sine.easeOut"); trainer.playAnim(); - + const doSummon = () => { this.scene.currentBattle.started = true; this.scene.playBgm(undefined); @@ -936,7 +942,7 @@ export class EncounterPhase extends BattlePhase { doTrainerSummon(); } }; - + const encounterMessages = this.scene.currentBattle.trainer.getEncounterMessages(); if (!encounterMessages?.length) { @@ -999,7 +1005,7 @@ export class EncounterPhase extends BattlePhase { } this.scene.pushPhase(new ToggleDoublePositionPhase(this.scene, false)); } - + if (this.scene.currentBattle.battleType !== BattleType.TRAINER && (this.scene.currentBattle.waveIndex > 1 || !this.scene.gameMode.isDaily)) { const minPartySize = this.scene.currentBattle.double ? 2 : 1; if (availablePartyMembers.length > minPartySize) { @@ -1061,7 +1067,7 @@ export class NextEncounterPhase extends EncounterPhase { if (this.scene.lastEnemyTrainer) { this.scene.lastEnemyTrainer.destroy(); } - + if (!this.tryOverrideForBattleSpec()) { this.doEncounterCommon(); } @@ -1278,7 +1284,7 @@ export class SummonPhase extends PartyMemberPokemonPhase { if (partyMember.isFainted()) { console.warn("The Pokemon about to be sent out is fainted. Attempting to resolve..."); const party = this.getParty(); - + // Find the first non-fainted Pokemon index above the current one const nonFaintedIndex = party.findIndex((p, i) => i > this.partyMemberIndex && !p.isFainted()); if (nonFaintedIndex === -1) { @@ -1287,7 +1293,7 @@ export class SummonPhase extends PartyMemberPokemonPhase { } // Swaps the fainted Pokemon and the first non-fainted Pokemon in the party - [party[this.partyMemberIndex], party[nonFaintedIndex]] = [party[nonFaintedIndex], party[this.partyMemberIndex]]; + [party[this.partyMemberIndex], party[nonFaintedIndex]] = [party[nonFaintedIndex], party[this.partyMemberIndex]]; console.warn("Swapped %s %O with %s %O", partyMember?.name, partyMember, party[0]?.name, party[0]); } @@ -1311,8 +1317,12 @@ export class SummonPhase extends PartyMemberPokemonPhase { }); this.scene.time.delayedCall(750, () => this.summon()); } else { + const trainerName = this.scene.currentBattle.trainer.getName(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER); + const pokemonName = this.getPokemon().name; + const message = i18next.t("battle:trainerSendOut", { trainerName, pokemonName }); + this.scene.pbTrayEnemy.hide(); - this.scene.ui.showText(`${this.scene.currentBattle.trainer.getName(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER)} sent out\n${this.getPokemon().name}!`, null, () => this.summon()); + this.scene.ui.showText(message, null, () => this.summon()); } } @@ -1709,6 +1719,7 @@ export class TurnInitPhase extends FieldPhase { super.start(); //this.scene.pushPhase(new MoveAnimTestPhase(this.scene)); + this.scene.eventTarget.dispatchEvent(new TurnInitEvent()); this.scene.getField().forEach((pokemon, i) => { if (pokemon?.isActive()) { @@ -1786,9 +1797,9 @@ export class CommandPhase extends FieldPhase { switch (command) { case Command.FIGHT: let useStruggle = false; - if (cursor === -1 || - playerPokemon.trySelectMove(cursor, args[0] as boolean) || - (useStruggle = cursor > -1 && !playerPokemon.getMoveset().filter(m => m.isUsable(playerPokemon)).length)) { + if (cursor === -1 || + playerPokemon.trySelectMove(cursor, args[0] as boolean) || + (useStruggle = cursor > -1 && !playerPokemon.getMoveset().filter(m => m.isUsable(playerPokemon)).length)) { const moveId = !useStruggle ? cursor > -1 ? playerPokemon.getMoveset()[cursor].moveId : Moves.NONE : Moves.STRUGGLE; const turnCommand: TurnCommand = { command: Command.FIGHT, cursor: cursor, move: { move: moveId, targets: [], ignorePP: args[0] }, args: args }; const moveTargets: MoveTargetSet = args.length < 3 ? getMoveTargets(playerPokemon, moveId) : args[2]; @@ -1798,7 +1809,7 @@ export class CommandPhase extends FieldPhase { console.log(moveTargets, playerPokemon.name); if (moveTargets.targets.length <= 1 || moveTargets.multiple) { turnCommand.move.targets = moveTargets.targets; - } else if(playerPokemon.getTag(BattlerTagType.CHARGING) && playerPokemon.getMoveQueue().length >= 1) { + } else if (playerPokemon.getTag(BattlerTagType.CHARGING) && playerPokemon.getMoveQueue().length >= 1) { turnCommand.move.targets = playerPokemon.getMoveQueue()[0].targets; } else { this.scene.unshiftPhase(new SelectTargetPhase(this.scene, this.fieldIndex)); @@ -1810,8 +1821,8 @@ export class CommandPhase extends FieldPhase { this.scene.ui.setMode(Mode.MESSAGE); // Decides between a Disabled, Not Implemented, or No PP translation message - const errorMessage = - playerPokemon.summonData.disabledMove === move.moveId ? "battle:moveDisabled" : + const errorMessage = + playerPokemon.summonData.disabledMove === move.moveId ? "battle:moveDisabled" : move.getName().endsWith(" (N)") ? "battle:moveNotImplemented" : "battle:moveNoPP"; const moveName = move.getName().replace(" (N)", ""); // Trims off the indicator @@ -1898,14 +1909,14 @@ export class CommandPhase extends FieldPhase { this.scene.currentBattle.turnCommands[this.fieldIndex - 1].skip = true; } } else if (trapTag) { - if(trapTag.sourceMove === Moves.INGRAIN && this.scene.getPokemonById(trapTag.sourceId).isOfType(Type.GHOST)) { + if (trapTag.sourceMove === Moves.INGRAIN && this.scene.getPokemonById(trapTag.sourceId).isOfType(Type.GHOST)) { success = true; - this.scene.currentBattle.turnCommands[this.fieldIndex] = isSwitch + this.scene.currentBattle.turnCommands[this.fieldIndex] = isSwitch ? { command: Command.POKEMON, cursor: cursor, args: args } : { command: Command.RUN }; break; } - if (!isSwitch) { + if (!isSwitch) { this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); this.scene.ui.setMode(Mode.MESSAGE); } @@ -2005,7 +2016,7 @@ export class EnemyCommandPhase extends FieldPhase { if (partyMemberScores.length) { const matchupScores = opponents.map(opp => enemyPokemon.getMatchupScore(opp)); const matchupScore = matchupScores.reduce((total, score) => total += score, 0) / matchupScores.length; - + const sortedPartyMemberScores = trainer.getSortedPartyMemberMatchupScores(partyMemberScores); const switchMultiplier = 1 - (battle.enemySwitchCounter ? Math.pow(0.1, (1 / battle.enemySwitchCounter)) : 0); @@ -2015,7 +2026,7 @@ export class EnemyCommandPhase extends FieldPhase { battle.turnCommands[this.fieldIndex + BattlerIndex.ENEMY] = { command: Command.POKEMON, cursor: index, args: [ false ] }; - + battle.enemySwitchCounter++; return this.end(); @@ -2104,7 +2115,7 @@ export class TurnStartPhase extends FieldPhase { applyAbAttrs(IncrementMovePriorityAbAttr, this.scene.getField().find(p => p?.isActive() && p.getBattlerIndex() === a), null, aMove, aPriority); applyAbAttrs(IncrementMovePriorityAbAttr, this.scene.getField().find(p => p?.isActive() && p.getBattlerIndex() === b), null, bMove, bPriority); - + if (aPriority.value !== bPriority.value) { return aPriority.value < bPriority.value ? 1 : -1; } @@ -2113,7 +2124,7 @@ export class TurnStartPhase extends FieldPhase { if (battlerBypassSpeed[a].value !== battlerBypassSpeed[b].value) { return battlerBypassSpeed[a].value ? -1 : 1; } - + const aIndex = order.indexOf(a); const bIndex = order.indexOf(b); @@ -2151,13 +2162,28 @@ export class TurnStartPhase extends FieldPhase { this.scene.unshiftPhase(new AttemptCapturePhase(this.scene, turnCommand.targets[0] % 2, turnCommand.cursor)); break; case Command.POKEMON: + this.scene.unshiftPhase(new SwitchSummonPhase(this.scene, pokemon.getFieldIndex(), turnCommand.cursor, true, turnCommand.args[0] as boolean, pokemon.isPlayer())); + break; case Command.RUN: - const isSwitch = turnCommand.command === Command.POKEMON; - if (isSwitch) { - this.scene.unshiftPhase(new SwitchSummonPhase(this.scene, pokemon.getFieldIndex(), turnCommand.cursor, true, turnCommand.args[0] as boolean, pokemon.isPlayer())); - } else { - this.scene.unshiftPhase(new AttemptRunPhase(this.scene, pokemon.getFieldIndex())); + let runningPokemon = pokemon; + if (this.scene.currentBattle.double) { + const playerActivePokemon = field.filter(pokemon => { + if (!!pokemon) { + return pokemon.isPlayer() && pokemon.isActive(); + } else { + return; + } + }); + // if only one pokemon is alive, use that one + if (playerActivePokemon.length > 1) { + // find which active pokemon has faster speed + const fasterPokemon = playerActivePokemon[0].getStat(Stat.SPD) > playerActivePokemon[1].getStat(Stat.SPD) ? playerActivePokemon[0] : playerActivePokemon[1]; + // check if either active pokemon has the ability "Run Away" + const hasRunAway = playerActivePokemon.find(p => p.hasAbility(Abilities.RUN_AWAY)); + runningPokemon = hasRunAway !== undefined ? hasRunAway : fasterPokemon; + } } + this.scene.unshiftPhase(new AttemptRunPhase(this.scene, runningPokemon.getFieldIndex())); break; } } @@ -2227,10 +2253,11 @@ export class TurnEndPhase extends FieldPhase { super.start(); this.scene.currentBattle.incrementTurn(this.scene); - + this.scene.eventTarget.dispatchEvent(new TurnEndEvent(this.scene.currentBattle.turn)); + const handlePokemon = (pokemon: Pokemon) => { pokemon.lapseTags(BattlerTagLapseType.TURN_END); - + if (pokemon.summonData.disabledMove && !--pokemon.summonData.disabledTurns) { this.scene.pushPhase(new MessagePhase(this.scene, i18next.t("battle:notDisabled", { pokemonName: `${getPokemonPrefix(pokemon)}${pokemon.name}`, moveName: allMoves[pokemon.summonData.disabledMove].name }))); pokemon.summonData.disabledMove = Moves.NONE; @@ -2256,7 +2283,7 @@ export class TurnEndPhase extends FieldPhase { }; this.executeForAll(handlePokemon); - + this.scene.arena.lapseTags(); if (this.scene.arena.weather && !this.scene.arena.weather.lapse()) { @@ -2276,9 +2303,6 @@ export class BattleEndPhase extends BattlePhase { super.start(); this.scene.currentBattle.addBattleScore(this.scene); - if (this.scene.currentBattle.moneyScattered) { - this.scene.currentBattle.pickUpScatteredMoney(this.scene); - } this.scene.gameData.gameStats.battles++; if (this.scene.currentBattle.trainer) { @@ -2298,6 +2322,10 @@ export class BattleEndPhase extends BattlePhase { applyPostBattleAbAttrs(PostBattleAbAttr, pokemon); } + if (this.scene.currentBattle.moneyScattered) { + this.scene.currentBattle.pickUpScatteredMoney(this.scene); + } + this.scene.clearEnemyHeldItemModifiers(); const lapsingModifiers = this.scene.findModifiers(m => m instanceof LapsingPersistentModifier || m instanceof LapsingPokemonHeldItemModifier) as (LapsingPersistentModifier | LapsingPokemonHeldItemModifier)[]; @@ -2384,7 +2412,7 @@ export class MovePhase extends BattlePhase { console.log(Moves[this.move.moveId]); if (!this.canMove()) { - if (this.move.moveId && this.pokemon.summonData.disabledMove === this.move.moveId) { + if (this.move.moveId && this.pokemon.summonData?.disabledMove === this.move.moveId) { this.scene.queueMessage(`${this.move.getName()} is disabled!`); } return this.end(); @@ -2440,9 +2468,9 @@ export class MovePhase extends BattlePhase { const doMove = () => { this.pokemon.turnData.acted = true; // Record that the move was attempted, even if it fails - + this.pokemon.lapseTags(BattlerTagLapseType.PRE_MOVE); - + let ppUsed = 1; // Filter all opponents to include only those this move is targeting const targetedOpponents = this.pokemon.getOpponents().filter(o => this.targets.includes(o.getBattlerIndex())); @@ -2454,7 +2482,7 @@ export class MovePhase extends BattlePhase { ppUsed++; } } - + if (!this.followUp && this.canMove() && !this.cancelled) { this.pokemon.lapseTags(BattlerTagLapseType.MOVE); } @@ -2462,8 +2490,9 @@ export class MovePhase extends BattlePhase { const moveQueue = this.pokemon.getMoveQueue(); if (this.cancelled || this.failed) { if (this.failed) { - this.move.usePp(ppUsed); - } // Only use PP if the move failed + this.move.usePp(ppUsed); // Only use PP if the move failed + this.scene.eventTarget.dispatchEvent(new MoveUsedEvent(this.pokemon?.id, this.move.getMove(), ppUsed)); + } // Record a failed move so Abilities like Truant don't trigger next turn and soft-lock this.pokemon.pushMoveHistory({ move: Moves.NONE, result: MoveResult.FAIL }); @@ -2480,10 +2509,10 @@ export class MovePhase extends BattlePhase { } // This should only happen when there are no valid targets left on the field - if ((moveQueue.length && moveQueue[0].move === Moves.NONE) || !targets.length) { + if ((moveQueue.length && moveQueue[0].move === Moves.NONE) || !targets.length) { this.showFailedText(); this.cancel(); - + // Record a failed move so Abilities like Truant don't trigger next turn and soft-lock this.pokemon.pushMoveHistory({ move: Moves.NONE, result: MoveResult.FAIL }); @@ -2493,8 +2522,9 @@ export class MovePhase extends BattlePhase { return this.end(); } - if (!moveQueue.length || !moveQueue.shift().ignorePP) {// using .shift here clears out two turn moves once they've been used + if (!moveQueue.length || !moveQueue.shift().ignorePP) { // using .shift here clears out two turn moves once they've been used this.move.usePp(ppUsed); + this.scene.eventTarget.dispatchEvent(new MoveUsedEvent(this.pokemon?.id, this.move.getMove(), ppUsed)); } if (!allMoves[this.move.moveId].getAttrs(CopyMoveAttr).length) { @@ -2521,7 +2551,16 @@ export class MovePhase extends BattlePhase { this.showFailedText(failedText); } } - + // Checks if Dancer ability is triggered + if (this.move.getMove().hasFlag(MoveFlags.DANCE_MOVE) && !this.followUp) { + // Pokemon with Dancer can be on either side of the battle so we check in both cases + this.scene.getPlayerField().forEach(pokemon => { + applyPostMoveUsedAbAttrs(PostMoveUsedAbAttr, pokemon, this.move, this.pokemon, this.targets); + }); + this.scene.getEnemyParty().forEach(pokemon => { + applyPostMoveUsedAbAttrs(PostMoveUsedAbAttr, pokemon, this.move, this.pokemon, this.targets); + }); + } this.end(); }; @@ -2529,7 +2568,7 @@ export class MovePhase extends BattlePhase { this.pokemon.status.incrementTurn(); let activated = false; let healed = false; - + switch (this.pokemon.status.effect) { case StatusEffect.PARALYSIS: if (!this.pokemon.randSeedInt(4)) { @@ -2549,7 +2588,7 @@ export class MovePhase extends BattlePhase { this.cancelled = activated; break; } - + if (activated) { this.scene.queueMessage(getPokemonMessage(this.pokemon, getStatusEffectActivationText(this.pokemon.status.effect))); this.scene.unshiftPhase(new CommonAnimPhase(this.scene, this.pokemon.getBattlerIndex(), undefined, CommonAnim.POISON + (this.pokemon.status.effect - 1))); @@ -2574,7 +2613,7 @@ export class MovePhase extends BattlePhase { showMoveText(): void { if (this.move.getMove().getAttrs(ChargeAttr).length) { const lastMove = this.pokemon.getLastXMoves() as TurnMove[]; - if (!lastMove.length || lastMove[0].move !== this.move.getMove().id || lastMove[0].result !== MoveResult.OTHER){ + if (!lastMove.length || lastMove[0].move !== this.move.getMove().id || lastMove[0].result !== MoveResult.OTHER) { this.scene.queueMessage(getPokemonMessage(this.pokemon, ` used\n${this.move.getName()}!`), 500); return; } @@ -2583,7 +2622,7 @@ export class MovePhase extends BattlePhase { if (this.pokemon.getTag(BattlerTagType.RECHARGING || BattlerTagType.INTERRUPTED)) { return; } - + this.scene.queueMessage(getPokemonMessage(this.pokemon, ` used\n${this.move.getName()}!`), 500); applyMoveAttrs(PreMoveMessageAttr, this.pokemon, this.pokemon.getOpponents().find(() => true), this.move.getMove()); } @@ -2604,11 +2643,17 @@ export class MovePhase extends BattlePhase { export class MoveEffectPhase extends PokemonPhase { public move: PokemonMove; protected targets: BattlerIndex[]; - + constructor(scene: BattleScene, battlerIndex: BattlerIndex, targets: BattlerIndex[], move: PokemonMove) { super(scene, battlerIndex); - this.move = move; + // In double battles, if the right Pokemon selects a spread move and the left Pokemon dies + // with no party members available to switch in, then the right Pokemon takes the index + // of the left Pokemon and gets hit unless this is checked. + if (targets.includes(battlerIndex) && this.move.getMove().moveTarget === MoveTarget.ALL_NEAR_OTHERS) { + const i = targets.indexOf(battlerIndex); + targets.splice(i,i+1); + } this.targets = targets; } @@ -2630,7 +2675,7 @@ export class MoveEffectPhase extends PokemonPhase { if (overridden.value) { return this.end(); } - + user.lapseTags(BattlerTagLapseType.MOVE_EFFECT); if (user.turnData.hitsLeft === undefined) { @@ -2683,7 +2728,7 @@ export class MoveEffectPhase extends PokemonPhase { const firstHit = moveHistoryEntry.result !== MoveResult.SUCCESS; moveHistoryEntry.result = MoveResult.SUCCESS; - + const hitResult = !isProtected ? target.apply(user, this.move) : HitResult.NO_EFFECT; this.scene.triggerPokemonFormChange(user, SpeciesFormChangePostMoveTrigger); @@ -2736,7 +2781,7 @@ export class MoveEffectPhase extends PokemonPhase { // Trigger effect which should only apply one time after all targeted effects have already applied const postTarget = applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && (attr as MoveEffectAttr).trigger === MoveEffectTrigger.POST_TARGET, user, null, this.move.getMove()); - + if (applyAttrs.length) { // If there is a pending asynchronous move effect, do this after applyAttrs[applyAttrs.length - 1]?.then(() => postTarget); } else { // Otherwise, push a new asynchronous move effect @@ -2761,7 +2806,7 @@ export class MoveEffectPhase extends PokemonPhase { this.scene.applyModifiers(HitHealModifier, this.player, user); } } - + super.end(); } @@ -2786,7 +2831,7 @@ export class MoveEffectPhase extends PokemonPhase { if (user.getTag(BattlerTagType.IGNORE_ACCURACY) && (user.getLastXMoves().slice(1).find(() => true)?.targets || []).indexOf(target.getBattlerIndex()) !== -1) { return true; } - + const hiddenTag = target.getTag(HiddenTag); if (hiddenTag && !this.move.getMove().getAttrs(HitsTagAttr).filter(hta => (hta as HitsTagAttr).tagType === hiddenTag.tagType).length) { return false; @@ -2813,7 +2858,7 @@ export class MoveEffectPhase extends PokemonPhase { 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); @@ -2981,7 +3026,7 @@ export class StatChangePhase extends PokemonPhase { if (!cancelled.value && !this.selfTarget && this.levels < 0) { applyPreStatChangeAbAttrs(ProtectStatAbAttr, this.getPokemon(), stat, cancelled); } - + return !cancelled.value; }); @@ -3005,15 +3050,15 @@ export class StatChangePhase extends PokemonPhase { for (const stat of filteredStats) { pokemon.summonData.battleStats[stat] = Math.max(Math.min(pokemon.summonData.battleStats[stat] + levels.value, 6), -6); } - + if (levels.value > 0 && this.canBeCopied) { for (const opponent of pokemon.getOpponents()) { applyAbAttrs(StatChangeCopyAbAttr, opponent, null, this.stats, levels.value); } } - + applyPostStatChangeAbAttrs(PostStatChangeAbAttr, pokemon, filteredStats, this.levels, this.selfTarget); - + pokemon.updateInfo(); handleTutorial(this.scene, Tutorial.Stat_Change).then(() => super.end()); @@ -3057,7 +3102,7 @@ export class StatChangePhase extends PokemonPhase { duration: 1500, y: `${levels.value >= 1 ? "-" : "+"}=${160 * 6}` }); - + this.scene.time.delayedCall(1750, () => { pokemon.disableMask(); end(); @@ -3142,7 +3187,7 @@ export class WeatherEffectPhase extends CommonAnimPhase { start() { if (this.weather.isDamaging()) { - + const cancelled = new Utils.BooleanHolder(false); this.executeForAll((pokemon: Pokemon) => applyPreWeatherEffectAbAttrs(SuppressWeatherEffectAbAttr, pokemon, this.weather, cancelled)); @@ -3623,7 +3668,7 @@ export class VictoryPhase extends PokemonPhase { } } } - + if (!this.scene.getEnemyParty().find(p => this.scene.currentBattle.battleType ? !p?.isFainted(true) : p.isOnField())) { this.scene.pushPhase(new BattleEndPhase(this.scene)); if (this.scene.currentBattle.battleType === BattleType.TRAINER) { @@ -3697,7 +3742,7 @@ export class TrainerVictoryPhase extends BattlePhase { let message: string; this.scene.executeWithSeedOffset(() => message = Utils.randSeedItem(victoryMessages), this.scene.currentBattle.waveIndex); const messagePages = message.split(/\$/g).map(m => m.trim()); - + for (let p = messagePages.length - 1; p >= 0; p--) { const originalFunc = showMessageOrEnd; showMessageOrEnd = () => this.scene.ui.showDialogue(messagePages[p], this.scene.currentBattle.trainer.getName(), null, originalFunc); @@ -3739,7 +3784,11 @@ export class MoneyRewardPhase extends BattlePhase { this.scene.addMoney(moneyAmount.value); - this.scene.ui.showText(`You got ₽${moneyAmount.value.toLocaleString("en-US")}\nfor winning!`, null, () => this.end(), null, true); + const userLocale = navigator.language || "en-US"; + const formattedMoneyAmount = moneyAmount.value.toLocaleString(userLocale); + const message = i18next.t("battle:moneyWon", { moneyAmount: formattedMoneyAmount }); + + this.scene.ui.showText(message, null, () => this.end(), null, true); } } @@ -3827,6 +3876,11 @@ export class GameOverPhase extends BattlePhase { start() { super.start(); + // Failsafe if players somehow skip floor 200 in classic mode + if (this.scene.gameMode.isClassic && this.scene.currentBattle.waveIndex > 200) { + this.victory = true; + } + if (this.victory || !this.scene.enableRetries) { this.handleGameOver(); } else { @@ -3839,7 +3893,7 @@ export class GameOverPhase extends BattlePhase { this.scene.pushPhase(new EncounterPhase(this.scene, true)); const availablePartyMembers = this.scene.getParty().filter(p => !p.isFainted()).length; - + this.scene.pushPhase(new SummonPhase(this.scene, 0)); if (this.scene.currentBattle.double && availablePartyMembers > 1) { this.scene.pushPhase(new SummonPhase(this.scene, 1)); @@ -3993,9 +4047,9 @@ export class EndCardPhase extends Phase { this.scene.field.add(this.text); this.scene.ui.clearText(); - + this.scene.ui.fadeIn(1000).then(() => { - + this.scene.ui.showText("", null, () => { this.scene.ui.getMessageHandler().bg.setVisible(true); this.end(); @@ -4367,7 +4421,7 @@ export class PokemonHealPhase extends CommonAnimPhase { end() { const pokemon = this.getPokemon(); - + if (!pokemon.isOnField() || (!this.revive && !pokemon.isActive())) { super.end(); return; @@ -4385,7 +4439,7 @@ export class PokemonHealPhase extends CommonAnimPhase { } const healAmount = new Utils.NumberHolder(Math.floor(this.hpHealed * hpRestoreMultiplier.value)); if (healAmount.value < 0) { - pokemon.damageAndUpdate(healAmount.value * -1, HitResult.HEAL); + pokemon.damageAndUpdate(healAmount.value * -1, HitResult.HEAL as DamageResult); healAmount.value = 0; } // Prevent healing to full if specified (in case of healing tokens so Sturdy doesn't cause a softlock) @@ -4530,7 +4584,7 @@ export class AttemptCapturePhase extends PokemonPhase { } else { this.scene.playSound("pb_lock"); addPokeballCaptureStars(this.scene, this.pokeball); - + const pbTint = this.scene.add.sprite(this.pokeball.x, this.pokeball.y, "pb", "pb"); pbTint.setOrigin(this.pokeball.originX, this.pokeball.originY); pbTint.setTintFill(0); @@ -4586,7 +4640,7 @@ export class AttemptCapturePhase extends PokemonPhase { ease: "Sine.easeOut", scale: 1 }); - + this.scene.currentBattle.lastUsedPokeball = this.pokeballType; this.removePb(); this.end(); @@ -4617,7 +4671,7 @@ export class AttemptCapturePhase extends PokemonPhase { this.scene.pokemonInfoContainer.show(pokemon, true); this.scene.gameData.updateSpeciesDexIvs(pokemon.species.getRootSpeciesId(true), pokemon.ivs); - + this.scene.ui.showText(i18next.t("battle:pokemonCaught", { pokemonName: pokemon.name }), null, () => { const end = () => { this.scene.pokemonInfoContainer.hide(); @@ -4651,7 +4705,7 @@ 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(`Your party is full.\nRelease a Pokémon to make room for ${pokemon.name}?`, null, () => { + this.scene.ui.showText(i18next.t("battle:partyFull", { pokemonName: pokemon.name }), null, () => { this.scene.pokemonInfoContainer.makeRoomForConfirmUi(); this.scene.ui.setMode(Mode.CONFIRM, () => { this.scene.ui.setMode(Mode.PARTY, PartyUiMode.RELEASE, this.fieldIndex, (slotIndex: integer, _option: PartyOption) => { @@ -4710,7 +4764,7 @@ export class AttemptRunPhase extends PokemonPhase { if (playerPokemon.randSeedInt(256) < escapeChance.value) { this.scene.playSound("flee"); this.scene.queueMessage(i18next.t("battle:runAwaySuccess"), null, true, 500); - + this.scene.tweens.add({ targets: [ this.scene.arenaEnemy, enemyField ].flat(), alpha: 0, @@ -4925,7 +4979,7 @@ export class SelectModifierPhase extends BattlePhase { } return Math.min(Math.ceil(this.scene.currentBattle.waveIndex / 10) * baseValue * Math.pow(2, this.rerollCount), Number.MAX_SAFE_INTEGER); } - + getPoolType(): ModifierPoolType { return ModifierPoolType.PLAYER; } @@ -4953,11 +5007,11 @@ export class EggLapsePhase extends Phase { if (eggsToHatch.length) { this.scene.queueMessage(i18next.t("battle:eggHatching")); - + for (const egg of eggsToHatch) { this.scene.unshiftPhase(new EggHatchPhase(this.scene, egg)); } - + } this.end(); } @@ -4975,7 +5029,7 @@ export class AddEnemyBuffModifierPhase extends Phase { const tier = !(waveIndex % 1000) ? ModifierTier.ULTRA : !(waveIndex % 250) ? ModifierTier.GREAT : ModifierTier.COMMON; regenerateModifierPoolThresholds(this.scene.getEnemyParty(), ModifierPoolType.ENEMY_BUFF); - + const count = Math.ceil(waveIndex / 250); for (let i = 0; i < count; i++) { this.scene.addEnemyModifier(getEnemyBuffModifierForWave(tier, this.scene.findModifiers(m => m instanceof EnemyPersistentModifier, false), this.scene), true, true); @@ -5116,7 +5170,7 @@ export class TrainerMessageTestPhase extends BattlePhase { constructor(scene: BattleScene, ...trainerTypes: TrainerType[]) { super(scene); - + this.trainerTypes = trainerTypes; } @@ -5124,7 +5178,7 @@ export class TrainerMessageTestPhase extends BattlePhase { super.start(); const testMessages: string[] = []; - + for (const t of Object.keys(trainerConfigs)) { const type = parseInt(t); if (this.trainerTypes.length && !this.trainerTypes.find(tt => tt === type as TrainerType)) { diff --git a/src/pipelines/sprite.ts b/src/pipelines/sprite.ts index e1997c28635..741c31183d4 100644 --- a/src/pipelines/sprite.ts +++ b/src/pipelines/sprite.ts @@ -378,7 +378,7 @@ export default class SpritePipeline extends FieldSpritePipeline { this.set1f("yOffset", sprite.height - sprite.frame.height * (isEntityObj ? sprite.parentContainer.scale : sprite.scale)); this.set4fv("tone", tone); this.bindTexture(this.game.textures.get("tera").source[0].glTexture, 1); - + if ((gameObject.scene as BattleScene).fusionPaletteSwaps) { const spriteColors = ((ignoreOverride && data["spriteColorsBase"]) || data["spriteColors"] || []) as number[][]; const fusionSpriteColors = ((ignoreOverride && data["fusionSpriteColorsBase"]) || data["fusionSpriteColors"] || []) as number[][]; @@ -460,7 +460,7 @@ export default class SpritePipeline extends FieldSpritePipeline { const pixelHeight = (v1 - v0) / (sprite.frame.height * (isEntityObj ? sprite.parentContainer.scale : sprite.scale)); v1 += (yDelta + bottomPadding / field.scale) * pixelHeight; } - + return super.batchQuad(gameObject, x0, y0, x1, y1, x2, y2, x3, y3, u0, v0, u1, v1, tintTL, tintTR, tintBL, tintBR, tintEffect, texture, unit); } diff --git a/src/plugins/cache-busted-loader-plugin.ts b/src/plugins/cache-busted-loader-plugin.ts index 0472ad51fe7..3ed939c49dd 100644 --- a/src/plugins/cache-busted-loader-plugin.ts +++ b/src/plugins/cache-busted-loader-plugin.ts @@ -17,7 +17,7 @@ export default class CacheBustedLoaderPlugin extends Phaser.Loader.LoaderPlugin if (!Array.isArray(file)) { file = [ file ]; } - + file.forEach(item => { if (manifest) { const timestamp = manifest[`/${item.url.replace(/\/\//g, "/")}` ]; diff --git a/src/plugins/i18n.ts b/src/plugins/i18n.ts index 8af69929441..a66a075b5d5 100644 --- a/src/plugins/i18n.ts +++ b/src/plugins/i18n.ts @@ -124,7 +124,7 @@ export function initI18n(): void { }, zh_CN: { ...zhCnConfig - }, + }, zh_TW: { ...zhTWConfig } @@ -161,6 +161,7 @@ declare module "i18next" { battleMessageUiHandler: SimpleTranslationEntries; berry: BerryTranslationEntries; voucher: SimpleTranslationEntries; + biome: SimpleTranslationEntries; }; } } diff --git a/src/system/game-data.ts b/src/system/game-data.ts index 3211a32d2e6..5bc0df19aa2 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -180,7 +180,7 @@ export interface StarterMoveData { } export interface StarterDataEntry { - moveset: StarterMoveset | StarterFormMoveData; + moveset: StarterMoveset | StarterFormMoveData; eggMoves: integer; candyCount: integer; friendship: integer; @@ -223,7 +223,7 @@ export class GameData { public secretId: integer; public gender: PlayerGender; - + public dexData: DexData; private defaultDexData: DexData; @@ -372,7 +372,7 @@ export class GameData { localStorage.setItem(`data_${loggedInUser.username}`, encrypt(systemDataStr, bypassLogin)); /*const versions = [ this.scene.game.config.gameVersion, data.gameVersion || '0.0.0' ]; - + if (versions[0] !== versions[1]) { const [ versionNumbers, oldVersionNumbers ] = versions.map(ver => ver.split('.').map(v => parseInt(v))); }*/ @@ -439,7 +439,7 @@ export class GameData { if (achvs.hasOwnProperty(a)) { this.achvUnlocks[a] = systemData.achvUnlocks[a]; } - } + } } if (systemData.voucherUnlocks) { @@ -908,7 +908,7 @@ export class GameData { v = []; } for (const md of v) { - if(md?.className === "ExpBalanceModifier") { // Temporarily limit EXP Balance until it gets reworked + if (md?.className === "ExpBalanceModifier") { // Temporarily limit EXP Balance until it gets reworked md.stackCount = Math.min(md.stackCount, 4); } ret.push(new PersistentModifierData(md, player)); @@ -1029,7 +1029,7 @@ export class GameData { if (saveFile) { saveFile.remove(); } - + saveFile = document.createElement("input"); saveFile.id = "saveFile"; saveFile.type = "file"; @@ -1084,6 +1084,7 @@ export class GameData { if (!valid) { return this.scene.ui.showText(`Your ${dataName} data could not be loaded. It may be corrupted.`, null, () => this.scene.ui.showText(null, 0), Utils.fixedInt(1500)); } + this.scene.ui.revertMode(); this.scene.ui.showText(`Your ${dataName} data will be overridden and the page will reload. Proceed?`, null, () => { this.scene.ui.setOverlayMode(Mode.CONFIRM, () => { localStorage.setItem(dataKey, encrypt(dataStr, bypassLogin)); @@ -1218,7 +1219,7 @@ export class GameData { : AbilityAttr.ABILITY_HIDDEN; } dexEntry.natureAttr |= Math.pow(2, pokemon.nature + 1); - + const hasPrevolution = pokemonPrevolutions.hasOwnProperty(species.speciesId); const newCatch = !caughtAttr; const hasNewAttr = (caughtAttr & dexAttr) !== dexAttr; @@ -1256,7 +1257,7 @@ export class GameData { this.addStarterCandy(species, (1 * (pokemon.isShiny() ? 5 * Math.pow(2, pokemon.variant || 0) : 1)) * (fromEgg || pokemon.isBoss() ? 2 : 1)); } } - + const checkPrevolution = () => { if (hasPrevolution) { const prevolutionSpecies = pokemonPrevolutions[species.speciesId]; @@ -1281,7 +1282,7 @@ export class GameData { if (!this.starterData[speciesIdToIncrement].classicWinCount) { this.starterData[speciesIdToIncrement].classicWinCount = 0; } - + if (!this.starterData[speciesIdToIncrement].classicWinCount) { this.scene.gameData.gameStats.ribbonsOwned++; } @@ -1473,7 +1474,7 @@ export class GameData { getFormAttr(formIndex: integer): bigint { return BigInt(Math.pow(2, 7 + formIndex)); } - + consolidateDexData(dexData: DexData): void { for (const k of Object.keys(dexData)) { const entry = dexData[k] as DexEntry; @@ -1554,7 +1555,7 @@ export class GameData { } } } - + fixStarterData(systemData: SystemSaveData): void { for (const starterId of defaultStarterSpecies) { systemData.starterData[starterId].abilityAttr |= AbilityAttr.ABILITY_1; diff --git a/src/system/game-speed.ts b/src/system/game-speed.ts index e4af04bc2be..760288e841f 100644 --- a/src/system/game-speed.ts +++ b/src/system/game-speed.ts @@ -85,7 +85,7 @@ export function initGameSpeed() { } return originalAddCounter.apply(this, [ config ]); }; - + const originalFadeOut = SoundFade.fadeOut; SoundFade.fadeOut = (( scene: Phaser.Scene, diff --git a/src/system/pokemon-data.ts b/src/system/pokemon-data.ts index 6ec180922e2..0aa72f97801 100644 --- a/src/system/pokemon-data.ts +++ b/src/system/pokemon-data.ts @@ -125,7 +125,7 @@ export default class PokemonData { this.summonData.ability = source.summonData.ability; this.summonData.moveset = source.summonData.moveset?.map(m => PokemonMove.loadMove(m)); this.summonData.types = source.summonData.types; - + if (source.summonData.tags) { this.summonData.tags = source.summonData.tags?.map(t => loadBattlerTag(t)); } else { diff --git a/src/test/achievement.test.ts b/src/test/achievement.test.ts new file mode 100644 index 00000000000..a27c2d90154 --- /dev/null +++ b/src/test/achievement.test.ts @@ -0,0 +1,9 @@ +import {describe, expect, it} from "vitest"; +import {MoneyAchv} from "#app/system/achv"; + +describe("check some Achievement related stuff", () => { + it ("should check Achievement creation", () => { + const ach = new MoneyAchv("Achievement", 1000, null, 100); + expect(ach.name).toBe("Achievement"); + }); +}); diff --git a/src/test/debugImports.test.ts b/src/test/debugImports.test.ts new file mode 100644 index 00000000000..c164813a3cd --- /dev/null +++ b/src/test/debugImports.test.ts @@ -0,0 +1,35 @@ +import { describe, expect, it} from "vitest"; +import {initStatsKeys} from "#app/ui/game-stats-ui-handler"; + +async function importModule() { + try { + initStatsKeys(); + const { PokemonMove } = await import("#app/field/pokemon"); + const { Species } = await import("#app/data/enums/species"); + return { + PokemonMove, + Species, + }; + // Dynamically import the module + } catch (error) { + // Log the error stack trace + console.error("Error during import:", error.stack); + // Rethrow the error to ensure the test fails + throw error; + } +} + +describe("tests to debug the import, with trace", () => { + it("import PokemonMove module", async () => { + const module = await importModule(); + // Example assertion + expect(module.PokemonMove).toBeDefined(); + }); + + it("import Species module", async () => { + const module = await importModule(); + // Example assertion + expect(module.Species).toBeDefined(); + }); +}); + diff --git a/src/test/pokemon.test.ts b/src/test/pokemon.test.ts new file mode 100644 index 00000000000..d1f7da45256 --- /dev/null +++ b/src/test/pokemon.test.ts @@ -0,0 +1,57 @@ +import {describe, expect, it} from "vitest"; +import {getPokemonSpecies} from "#app/data/pokemon-species"; +import {PokemonMove} from "#app/field/pokemon"; +import {Species} from "#app/data/enums/species"; +import {Moves} from "#app/data/enums/moves"; +import PokemonData from "#app/system/pokemon-data"; + +describe("some tests related to PokemonData and Species", () => { + it("should create a species", () => { + const species = getPokemonSpecies(Species.MEW); + expect(species).not.toBeNull(); + }); + + it("should create a pokemon", () => { + const pokemon = new PokemonData({ + species: Species.MEW, + level: 1, + }); + expect(pokemon).not.toBeNull(); + expect(pokemon.level).toEqual(1); + expect(pokemon.species).toEqual(Species.MEW); + }); + + it("should generate a moveset", () => { + const pokemon = new PokemonData({ + species: Species.MEW, + level: 1, + }); + expect(pokemon.moveset[0].moveId).toBe(Moves.TACKLE); + expect(pokemon.moveset[1].moveId).toBe(Moves.GROWL); + }); + + it("should create an ennemypokemon", () => { + const ennemyPokemon = new PokemonData({ + species: Species.MEWTWO, + level: 100, + }); + expect(ennemyPokemon).not.toBeNull(); + expect(ennemyPokemon.level).toEqual(100); + expect(ennemyPokemon.species).toEqual(Species.MEWTWO); + }); + + it("should create an ennemypokemon with specified moveset", () => { + const ennemyPokemon = new PokemonData({ + species: Species.MEWTWO, + level: 100, + moveset: [ + new PokemonMove(Moves.ACID), + new PokemonMove(Moves.ACROBATICS), + new PokemonMove(Moves.FOCUS_ENERGY), + ] + }); + expect(ennemyPokemon.moveset[0].moveId).toBe(Moves.ACID); + expect(ennemyPokemon.moveset[1].moveId).toBe(Moves.ACROBATICS); + expect(ennemyPokemon.moveset[2].moveId).toBe(Moves.FOCUS_ENERGY); + }); +}); diff --git a/src/test/pokemonSprite.test.ts b/src/test/pokemonSprite.test.ts index 264977ecec2..07b3cd01cc7 100644 --- a/src/test/pokemonSprite.test.ts +++ b/src/test/pokemonSprite.test.ts @@ -50,41 +50,49 @@ describe("check if every variant's sprite are correctly set", () => { if (name.includes("_")) { const id = name.split("_")[0]; const variant = name.split("_")[1]; + const index = parseInt(variant, 10) - 1; if (ext !== "json") { + const urlJsonFile = `${dirpath}${id}.json`; if (mlist.hasOwnProperty(id)) { - const urlJsonFile = `${dirpath}${id}.json`; const trimmedUrlJsonFilepath = `${trimmedDirpath}${id}.json`; const jsonFileExists = fs.existsSync(urlJsonFile); - if (mlist[id].includes(1)) { + if (mlist[id].includes(1) && !jsonFileExists) { const msg = `[${name}] MISSING JSON ${trimmedUrlJsonFilepath}`; - if (!jsonFileExists && !errors.includes(msg)) { + if (!errors.includes(msg)) { errors.push(msg); } } - } - if (!mlist.hasOwnProperty(id)) { - errors.push(`[${id}] missing key ${id} in masterlist for ${trimmedFilePath}`); - } else if (mlist[id][parseInt(variant, 10) - 1] !== 2) { - const urlJsonFile = `${dirpath}${name}.json`; - const trimmedUrlJsonFilepath = `${trimmedDirpath}${name}.json`; - const jsonFileExists = fs.existsSync(urlJsonFile); - if (mlist[id].includes(1)) { - const msg = `[${id}] MISSING JSON ${trimmedUrlJsonFilepath}`; - if (!jsonFileExists && !errors.includes(msg)) { - errors.push(msg); + if (!mlist.hasOwnProperty(id) && jsonFileExists) { + errors.push(`[${id}] missing key ${id} in masterlist for ${trimmedFilePath}`); + } + if (mlist[id][index] === 1 && jsonFileExists) { + const raw = fs.readFileSync(urlJsonFile, {encoding: "utf8", flag: "r"}); + const data = JSON.parse(raw); + const keys = Object.keys(data); + if (!keys.includes(`${index}`)) { + const urlSpriteJsonFile = `${dirpath}${id}_${variant}.json`; + const trimmedUrlSpriteFilepath = `${trimmedDirpath}${id}_${variant}.json`; + const spriteFileExists = fs.existsSync(urlSpriteJsonFile); + if (spriteFileExists) { + errors.push(`[${id}] [${mlist[id]}] - the value should be 2 for the index ${index} - ${trimmedUrlSpriteFilepath}`); + } } } - errors.push(`[${id}] [${mlist[id]}] - the value should be 2 for the index ${parseInt(variant, 10) - 1} - ${trimmedFilePath}`); } } } else if (!mlist.hasOwnProperty(name)) { - errors.push(`named - missing key ${name} in masterlist for ${trimmedFilePath}`); - }else { + errors.push(`[${name}] - missing key ${name} in masterlist for ${trimmedFilePath}`); + } else { const raw = fs.readFileSync(filePath, {encoding: "utf8", flag: "r"}); const data = JSON.parse(raw); for (const key of Object.keys(data)) { if (mlist[name][key] !== 1) { - errors.push(`[${name}] [${mlist[name]}] - the value should be 1 for the index ${key} - ${trimmedFilePath}`); + // if 2, check if json there + const urlSpriteJsonFile = `${dirpath}${name}_${parseInt(key, 10) + 1}.json`; + const spriteFileExists = fs.existsSync(urlSpriteJsonFile); + if (!spriteFileExists) { + errors.push(`[${name}] [${mlist[name]}] - the value should be 1 for the index ${key} - ${trimmedFilePath}`); + } } } } diff --git a/src/test/testUtils.ts b/src/test/testUtils.ts index 481efbed032..f3ee634cd76 100644 --- a/src/test/testUtils.ts +++ b/src/test/testUtils.ts @@ -3,7 +3,7 @@ const path = require("path"); export function getAppRootDir () { let currentDir = __dirname; - while(!fs.existsSync(path.join(currentDir, "package.json"))) { + while (!fs.existsSync(path.join(currentDir, "package.json"))) { currentDir = path.join(currentDir, ".."); } return currentDir; diff --git a/src/test/vitest.setup.ts b/src/test/vitest.setup.ts index d0141ca9fc3..f17a16caf14 100644 --- a/src/test/vitest.setup.ts +++ b/src/test/vitest.setup.ts @@ -1,2 +1,19 @@ import "vitest-canvas-mock"; import "#app/test/phaser.setup"; +import {initStatsKeys} from "#app/ui/game-stats-ui-handler"; +import {initPokemonPrevolutions} from "#app/data/pokemon-evolutions"; +import {initBiomes} from "#app/data/biomes"; +import {initEggMoves} from "#app/data/egg-moves"; +import {initPokemonForms} from "#app/data/pokemon-forms"; +import {initSpecies} from "#app/data/pokemon-species"; +import {initMoves} from "#app/data/move"; +import {initAbilities} from "#app/data/ability"; + +initStatsKeys(); +initPokemonPrevolutions(); +initBiomes(); +initEggMoves(); +initPokemonForms(); +initSpecies(); +initMoves(); +initAbilities(); diff --git a/src/touch-controls.js b/src/touch-controls.js index 956bc03179f..8390df50ec8 100644 --- a/src/touch-controls.js +++ b/src/touch-controls.js @@ -32,7 +32,7 @@ export function isMobile() { */ function simulateKeyboardEvent(eventType, button, buttonMap) { const key = buttonMap[button]; - + switch (eventType) { case "keydown": key.onDown({}); diff --git a/src/ui-inputs.ts b/src/ui-inputs.ts index 6254773e656..6b175beb8b7 100644 --- a/src/ui-inputs.ts +++ b/src/ui-inputs.ts @@ -123,10 +123,10 @@ export class UiInputs { case Mode.PARTY: case Mode.SUMMARY: case Mode.STARTER_SELECT: - case Mode.CONFIRM: case Mode.OPTION_SELECT: this.scene.ui.setOverlayMode(Mode.MENU); break; + case Mode.CONFIRM: case Mode.MENU: case Mode.SETTINGS: case Mode.ACHIEVEMENTS: diff --git a/src/ui/ability-bar.ts b/src/ui/ability-bar.ts index a4a49011c10..3e85077e07d 100644 --- a/src/ui/ability-bar.ts +++ b/src/ui/ability-bar.ts @@ -63,7 +63,7 @@ export default class AbilityBar extends Phaser.GameObjects.Container { this.resetAutoHideTimer(); } }); - + this.setVisible(true); this.shown = true; } diff --git a/src/ui/abstact-option-select-ui-handler.ts b/src/ui/abstact-option-select-ui-handler.ts index 82e8ab0da35..925bbefc930 100644 --- a/src/ui/abstact-option-select-ui-handler.ts +++ b/src/ui/abstact-option-select-ui-handler.ts @@ -54,7 +54,7 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { setup() { const ui = this.getUi(); - + this.optionSelectContainer = this.scene.add.container((this.scene.game.canvas.width / 6) - 1, -48); this.optionSelectContainer.setVisible(false); ui.add(this.optionSelectContainer); @@ -159,7 +159,7 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { ui.playError(); return false; } - + success = true; if (button === Button.CANCEL) { if (this.config?.maxOptions && this.config.options.length > this.config.maxOptions) { @@ -171,8 +171,8 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { return false; } } - const option = this.config.options[this.cursor + (this.scrollCursor - (this.scrollCursor ? 1 : 0))]; - if (option.handler()) { + const option = this.config?.options[this.cursor + (this.scrollCursor - (this.scrollCursor ? 1 : 0))]; + if (option?.handler()) { if (!option.keepOpen) { this.clear(); } diff --git a/src/ui/achv-bar.ts b/src/ui/achv-bar.ts index c59b61da720..fa5d02416c0 100644 --- a/src/ui/achv-bar.ts +++ b/src/ui/achv-bar.ts @@ -76,7 +76,7 @@ export default class AchvBar extends Phaser.GameObjects.Container { }); this.scene.time.delayedCall(10000, () => this.hide()); - + this.setVisible(true); this.shown = true; } diff --git a/src/ui/achvs-ui-handler.ts b/src/ui/achvs-ui-handler.ts index 27d01b7b661..da56024a4d6 100644 --- a/src/ui/achvs-ui-handler.ts +++ b/src/ui/achvs-ui-handler.ts @@ -24,7 +24,7 @@ export default class AchvsUiHandler extends MessageUiHandler { setup() { const ui = this.getUi(); - + this.achvsContainer = this.scene.add.container(1, -(this.scene.game.canvas.height / 6) + 1); this.achvsContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6), Phaser.Geom.Rectangle.Contains); @@ -40,7 +40,7 @@ export default class AchvsUiHandler extends MessageUiHandler { this.achvIconsBg.setOrigin(0, 0); this.achvIconsContainer = this.scene.add.container(6, headerBg.height + 6); - + this.achvIcons = []; for (let a = 0; a < Object.keys(achvs).length; a++) { diff --git a/src/ui/awaitable-ui-handler.ts b/src/ui/awaitable-ui-handler.ts index 46f5094a2f6..22a21069acb 100644 --- a/src/ui/awaitable-ui-handler.ts +++ b/src/ui/awaitable-ui-handler.ts @@ -21,7 +21,7 @@ export default abstract class AwaitableUiHandler extends UiHandler { this.awaitingActionInput = false; return true; } - + return false; } } diff --git a/src/ui/ball-ui-handler.ts b/src/ui/ball-ui-handler.ts index 5fb6242750f..b96dd799b18 100644 --- a/src/ui/ball-ui-handler.ts +++ b/src/ui/ball-ui-handler.ts @@ -21,7 +21,7 @@ export default class BallUiHandler extends UiHandler { setup() { const ui = this.getUi(); - + this.pokeballSelectContainer = this.scene.add.container((this.scene.game.canvas.width / 6) - 115, -49); this.pokeballSelectContainer.setVisible(false); ui.add(this.pokeballSelectContainer); diff --git a/src/ui/battle-info.ts b/src/ui/battle-info.ts index 35db5edf4b8..7c981ab8c27 100644 --- a/src/ui/battle-info.ts +++ b/src/ui/battle-info.ts @@ -12,6 +12,8 @@ import { BattleStat } from "#app/data/battle-stat"; const battleStatOrder = [ BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.ACC, BattleStat.EVA, BattleStat.SPD ]; export default class BattleInfo extends Phaser.GameObjects.Container { + private baseY: number; + private player: boolean; private mini: boolean; private boss: boolean; @@ -33,6 +35,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { private nameText: Phaser.GameObjects.Text; private genderText: Phaser.GameObjects.Text; private ownedIcon: Phaser.GameObjects.Sprite; + private championRibbon: Phaser.GameObjects.Sprite; private teraIcon: Phaser.GameObjects.Sprite; private shinyIcon: Phaser.GameObjects.Sprite; private fusionShinyIcon: Phaser.GameObjects.Sprite; @@ -47,7 +50,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { private type2Icon: Phaser.GameObjects.Sprite; private type3Icon: Phaser.GameObjects.Sprite; private expBar: Phaser.GameObjects.Image; - + public expMaskRect: Phaser.GameObjects.Graphics; private statsContainer: Phaser.GameObjects.Container; @@ -57,6 +60,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { constructor(scene: Phaser.Scene, x: number, y: number, player: boolean) { super(scene, x, y); + this.baseY = y; this.player = player; this.mini = !player; this.boss = false; @@ -75,27 +79,39 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.setVisible(false); this.box = this.scene.add.sprite(0, 0, this.getTextureName()); + this.box.setName("box"); this.box.setOrigin(1, 0.5); this.add(this.box); this.nameText = addTextObject(this.scene, player ? -115 : -124, player ? -15.2 : -11.2, "", TextStyle.BATTLE_INFO); + this.nameText.setName("text_name"); this.nameText.setOrigin(0, 0); this.add(this.nameText); this.genderText = addTextObject(this.scene, 0, 0, "", TextStyle.BATTLE_INFO); + this.genderText.setName("text_gender"); this.genderText.setOrigin(0, 0); this.genderText.setPositionRelative(this.nameText, 0, 2); this.add(this.genderText); if (!this.player) { this.ownedIcon = this.scene.add.sprite(0, 0, "icon_owned"); + this.ownedIcon.setName("icon_owned"); this.ownedIcon.setVisible(false); this.ownedIcon.setOrigin(0, 0); this.ownedIcon.setPositionRelative(this.nameText, 0, 11.75); this.add(this.ownedIcon); + + this.championRibbon = this.scene.add.sprite(0, 0, "champion_ribbon"); + this.championRibbon.setName("icon_champion_ribbon"); + this.championRibbon.setVisible(false); + this.championRibbon.setOrigin(0, 0); + this.championRibbon.setPositionRelative(this.nameText, 11.75, 11.75); + this.add(this.championRibbon); } this.teraIcon = this.scene.add.sprite(0, 0, "icon_tera"); + this.teraIcon.setName("icon_tera"); this.teraIcon.setVisible(false); this.teraIcon.setOrigin(0, 0); this.teraIcon.setScale(0.5); @@ -104,6 +120,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.add(this.teraIcon); this.shinyIcon = this.scene.add.sprite(0, 0, "shiny_star"); + this.shinyIcon.setName("icon_shiny"); this.shinyIcon.setVisible(false); this.shinyIcon.setOrigin(0, 0); this.shinyIcon.setScale(0.5); @@ -112,6 +129,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.add(this.shinyIcon); this.fusionShinyIcon = this.scene.add.sprite(0, 0, "shiny_star_2"); + this.fusionShinyIcon.setName("icon_fusion_shiny"); this.fusionShinyIcon.setVisible(false); this.fusionShinyIcon.setOrigin(0, 0); this.fusionShinyIcon.setScale(0.5); @@ -119,6 +137,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.add(this.fusionShinyIcon); this.splicedIcon = this.scene.add.sprite(0, 0, "icon_spliced"); + this.splicedIcon.setName("icon_spliced"); this.splicedIcon.setVisible(false); this.splicedIcon.setOrigin(0, 0); this.splicedIcon.setScale(0.5); @@ -127,31 +146,37 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.add(this.splicedIcon); this.statusIndicator = this.scene.add.sprite(0, 0, "statuses"); + this.statusIndicator.setName("icon_status"); this.statusIndicator.setVisible(false); this.statusIndicator.setOrigin(0, 0); this.statusIndicator.setPositionRelative(this.nameText, 0, 11.5); this.add(this.statusIndicator); this.levelContainer = this.scene.add.container(player ? -41 : -50, player ? -10 : -5); + this.levelContainer.setName("container_level"); this.add(this.levelContainer); const levelOverlay = this.scene.add.image(0, 0, "overlay_lv"); this.levelContainer.add(levelOverlay); this.hpBar = this.scene.add.image(player ? -61 : -71, player ? -1 : 4.5, "overlay_hp"); + this.hpBar.setName("hp_bar"); this.hpBar.setOrigin(0); this.add(this.hpBar); this.hpBarSegmentDividers = []; this.levelNumbersContainer = this.scene.add.container(9.5, (this.scene as BattleScene).uiTheme ? 0 : -0.5); + this.levelNumbersContainer.setName("container_level"); this.levelContainer.add(this.levelNumbersContainer); if (this.player) { this.hpNumbersContainer = this.scene.add.container(-15, 10); + this.hpNumbersContainer.setName("container_hp"); this.add(this.hpNumbersContainer); const expBar = this.scene.add.image(-98, 18, "overlay_exp"); + expBar.setName("overlay_exp"); expBar.setOrigin(0); this.add(expBar); @@ -170,10 +195,12 @@ export default class BattleInfo extends Phaser.GameObjects.Container { } this.statsContainer = this.scene.add.container(0, 0); + this.statsContainer.setName("container_stats"); this.statsContainer.setAlpha(0); this.add(this.statsContainer); this.statsBox = this.scene.add.sprite(0, 0, `${this.getTextureName()}_stats`); + this.statsBox.setName("box_stats"); this.statsBox.setOrigin(1, 0.5); this.statsContainer.add(this.statsBox); @@ -187,25 +214,30 @@ export default class BattleInfo extends Phaser.GameObjects.Container { const statX = i > 1 ? this.statNumbers[i - 2].x + this.statNumbers[i - 2].width + 4 : -this.statsBox.width + 8; const statY = -this.statsBox.height / 2 + 4 + (i < battleStatOrder.length - 1 ? (i % 2 ? 10 : 0) : 5); const statLabel = this.scene.add.sprite(statX, statY, "pbinfo_stat", BattleStat[s]); + statLabel.setName("icon_stat_label_" + i.toString()); statLabel.setOrigin(0, 0); statLabels.push(statLabel); this.statValuesContainer.add(statLabel); const statNumber = this.scene.add.sprite(statX + statLabel.width, statY, "pbinfo_stat_numbers", "3"); + statNumber.setName("icon_stat_number_" + i.toString()); statNumber.setOrigin(0, 0); this.statNumbers.push(statNumber); this.statValuesContainer.add(statNumber); }); this.type1Icon = this.scene.add.sprite(player ? -139 : -15, player ? -17 : -15.5, `pbinfo_${player ? "player" : "enemy"}_type1`); + this.type1Icon.setName("icon_type_1"); this.type1Icon.setOrigin(0, 0); this.add(this.type1Icon); this.type2Icon = this.scene.add.sprite(player ? -139 : -15, player ? -1 : -2.5, `pbinfo_${player ? "player" : "enemy"}_type2`); + this.type2Icon.setName("icon_type_2"); this.type2Icon.setOrigin(0, 0); this.add(this.type2Icon); this.type3Icon = this.scene.add.sprite(player ? -154 : 0, player ? -17 : -15.5, `pbinfo_${player ? "player" : "enemy"}_type`); + this.type3Icon.setName("icon_type_3"); this.type3Icon.setOrigin(0, 0); this.add(this.type3Icon); } @@ -263,9 +295,14 @@ export default class BattleInfo extends Phaser.GameObjects.Container { const dexEntry = pokemon.scene.gameData.dexData[pokemon.species.speciesId]; this.ownedIcon.setVisible(!!dexEntry.caughtAttr); const opponentPokemonDexAttr = pokemon.getDexAttr(); + if (pokemon.scene.gameMode.isClassic) { + if (pokemon.scene.gameData.starterData[pokemon.species.getRootSpeciesId()].classicWinCount > 0 && pokemon.scene.gameData.starterData[pokemon.species.getRootSpeciesId(true)].classicWinCount > 0) { + this.championRibbon.setVisible(true); + } + } // Check if Player owns all genders and forms of the Pokemon - const missingDexAttrs = ((dexEntry.caughtAttr & opponentPokemonDexAttr) < opponentPokemonDexAttr); + const missingDexAttrs = ((dexEntry.caughtAttr & opponentPokemonDexAttr) < opponentPokemonDexAttr); /** * If the opposing Pokemon only has 1 normal ability and is using the hidden ability it should have the same behavior @@ -343,6 +380,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { if (this.player) { this.y -= 12 * (mini ? 1 : -1); + this.baseY = this.y; } const offsetElements = [ this.nameText, this.genderText, this.teraIcon, this.splicedIcon, this.shinyIcon, this.statusIndicator, this.levelContainer ]; @@ -374,15 +412,15 @@ export default class BattleInfo extends Phaser.GameObjects.Container { if (boss !== this.boss) { this.boss = boss; - - [ this.nameText, this.genderText, this.teraIcon, this.splicedIcon, this.shinyIcon, this.ownedIcon, this.statusIndicator, this.levelContainer, this.statValuesContainer ].map(e => e.x += 48 * (boss ? -1 : 1)); + + [ this.nameText, this.genderText, this.teraIcon, this.splicedIcon, this.shinyIcon, this.ownedIcon, this.championRibbon, this.statusIndicator, this.levelContainer, this.statValuesContainer ].map(e => e.x += 48 * (boss ? -1 : 1)); this.hpBar.x += 38 * (boss ? -1 : 1); this.hpBar.y += 2 * (this.boss ? -1 : 1); this.hpBar.setTexture(`overlay_hp${boss ? "_boss" : ""}`); this.box.setTexture(this.getTextureName()); this.statsBox.setTexture(`${this.getTextureName()}_stats`); } - + this.bossSegments = boss ? pokemon.bossSegments : 0; this.updateBossSegmentDividers(pokemon); } @@ -399,6 +437,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { const dividerX = (Math.round((maxHp / this.bossSegments) * s) / maxHp) * this.hpBar.width; const divider = this.scene.add.rectangle(0, 0, 1, this.hpBar.height - (uiTheme ? 0 : 1), pokemon.bossSegmentIndex >= s ? 0xFFFFFF : 0x404040); divider.setOrigin(0.5, 0); + divider.setName("hpBar_divider_" + s.toString()); this.add(divider); this.moveBelow(divider as Phaser.GameObjects.GameObject, this.statsContainer); @@ -407,16 +446,17 @@ export default class BattleInfo extends Phaser.GameObjects.Container { } } } - + setOffset(offset: boolean): void { if (this.offset === offset) { return; } - + this.offset = offset; this.x += 10 * (offset === this.player ? 1 : -1); this.y += 27 * (offset ? 1 : -1); + this.baseY = this.y; } updateInfo(pokemon: Pokemon, instant?: boolean): Promise { @@ -431,7 +471,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.updateNameText(pokemon); this.genderText.setPositionRelative(this.nameText, this.nameText.displayWidth, 0); } - + const teraType = pokemon.getTeraType(); const teraTypeUpdated = this.lastTeraType !== teraType; @@ -457,7 +497,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { 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); } @@ -539,7 +579,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { ? pokemon.summonData.battleStats : battleStatOrder.map(() => 0); const battleStatsStr = battleStats.join(""); - + if (this.lastBattleStats !== battleStatsStr) { this.updateBattleStats(battleStats); this.lastBattleStats = battleStatsStr; @@ -655,6 +695,14 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.statNumbers[i].setFrame(battleStats[s].toString()); }); } + + getBaseY(): number { + return this.baseY; + } + + resetY(): void { + this.y = this.baseY; + } } export class PlayerBattleInfo extends BattleInfo { diff --git a/src/ui/candy-bar.ts b/src/ui/candy-bar.ts index 5afb06ba3e3..aa08ed58e60 100644 --- a/src/ui/candy-bar.ts +++ b/src/ui/candy-bar.ts @@ -84,7 +84,7 @@ export default class CandyBar extends Phaser.GameObjects.Container { resolve(); } }); - + this.setVisible(true); this.shown = true; }); diff --git a/src/ui/char-sprite.ts b/src/ui/char-sprite.ts index 1e6459096fe..d76c7ec59d0 100644 --- a/src/ui/char-sprite.ts +++ b/src/ui/char-sprite.ts @@ -56,7 +56,7 @@ export default class CharSprite extends Phaser.GameObjects.Container { resolve(); } }); - + this.setVisible(this.scene.textures.get(key).key !== Utils.MissingTextureKey); this.shown = true; diff --git a/src/ui/command-ui-handler.ts b/src/ui/command-ui-handler.ts index ad0d1a4ad11..7c21d5cc142 100644 --- a/src/ui/command-ui-handler.ts +++ b/src/ui/command-ui-handler.ts @@ -27,11 +27,11 @@ export default class CommandUiHandler extends UiHandler { setup() { const ui = this.getUi(); - const commands = [ - i18next.t("commandUiHandler:fight"), - i18next.t("commandUiHandler:ball"), - i18next.t("commandUiHandler:pokemon"), - i18next.t("commandUiHandler:run") + const commands = [ + i18next.t("commandUiHandler:fight"), + i18next.t("commandUiHandler:ball"), + i18next.t("commandUiHandler:pokemon"), + i18next.t("commandUiHandler:run") ]; this.commandsContainer = this.scene.add.container(216, -38.7); @@ -77,7 +77,7 @@ export default class CommandUiHandler extends UiHandler { const cursor = this.getCursor(); if (button === Button.CANCEL || button === Button.ACTION) { - + if (button === Button.ACTION) { switch (cursor) { // Fight diff --git a/src/ui/confirm-ui-handler.ts b/src/ui/confirm-ui-handler.ts index c2048eb1f88..4e4e0f9bb8c 100644 --- a/src/ui/confirm-ui-handler.ts +++ b/src/ui/confirm-ui-handler.ts @@ -42,7 +42,7 @@ export default class ConfirmUiHandler extends AbstractOptionSelectUiHandler { }; super.show([ config ]); - + this.switchCheck = args.length >= 3 && args[2] !== null && args[2] as boolean; const xOffset = (args.length >= 4 && args[3] !== null ? args[3] as number : 0); diff --git a/src/ui/daily-run-scoreboard.ts b/src/ui/daily-run-scoreboard.ts index 0a5c777cc2a..aa0cce62525 100644 --- a/src/ui/daily-run-scoreboard.ts +++ b/src/ui/daily-run-scoreboard.ts @@ -30,7 +30,7 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container { private pageCount: integer; private page: integer; private category: ScoreboardCategory; - + private _isUpdating: boolean; constructor(scene: BattleScene, x: number, y: number) { @@ -165,13 +165,13 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container { /** * Updates the scoreboard rankings based on the selected category and page. - * + * * If the update process is already ongoing, the method exits early. Otherwise, it begins the update process by clearing * the current rankings and showing a loading label. If the category changes, the page is reset to 1. - * + * * The method fetches the total page count if necessary, followed by fetching the rankings for the specified category * and page. It updates the UI with the fetched rankings or shows an appropriate message if no rankings are found. - * + * * @param {ScoreboardCategory} [category=this.category] - The category to fetch rankings for. Defaults to the current category. * @param {number} [page=this.page] - The page number to fetch. Defaults to the current page. */ @@ -209,7 +209,7 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container { }).finally(() => { this.isUpdating = false; }); - }).catch(err => { + }).catch(err => { console.error("Failed to load daily rankings:\n", err); }); } diff --git a/src/ui/egg-gacha-ui-handler.ts b/src/ui/egg-gacha-ui-handler.ts index ef8e5de24c7..9536df7dbed 100644 --- a/src/ui/egg-gacha-ui-handler.ts +++ b/src/ui/egg-gacha-ui-handler.ts @@ -61,16 +61,20 @@ export default class EggGachaUiHandler extends MessageUiHandler { this.eggGachaContainer.add(bg); const hatchFrameNames = this.scene.anims.generateFrameNames("gacha_hatch", { suffix: ".png", start: 1, end: 4 }); - this.scene.anims.create({ - key: "open", - frames: hatchFrameNames, - frameRate: 12 - }); - this.scene.anims.create({ - key: "close", - frames: hatchFrameNames.reverse(), - frameRate: 12 - }); + if (!(this.scene.anims.exists("open"))) { + this.scene.anims.create({ + key: "open", + frames: hatchFrameNames, + frameRate: 12 + }); + } + if (!(this.scene.anims.exists("close"))) { + this.scene.anims.create({ + key: "close", + frames: hatchFrameNames.reverse(), + frameRate: 12 + }); + } Utils.getEnumValues(GachaType).forEach((gachaType, g) => { const gachaTypeKey = GachaType[gachaType].toString().toLowerCase(); @@ -213,13 +217,13 @@ export default class EggGachaUiHandler extends MessageUiHandler { this.eggGachaOverlay = this.scene.add.rectangle(0, 0, bg.displayWidth, bg.displayHeight, 0x000000); this.eggGachaOverlay.setOrigin(0, 0); this.eggGachaOverlay.setAlpha(0); - + this.eggGachaContainer.add(this.eggGachaOverlay); this.eggGachaSummaryContainer = this.scene.add.container(0, 0); this.eggGachaSummaryContainer.setVisible(false); this.eggGachaContainer.add(this.eggGachaSummaryContainer); - + const gachaMessageBoxContainer = this.scene.add.container(0, 148); this.eggGachaContainer.add(gachaMessageBoxContainer); @@ -505,7 +509,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { if (!text) { text = this.defaultText; } - + if (text?.indexOf("\n") === -1) { this.eggGachaMessageBox.setSize(320, 32); this.eggGachaMessageBox.setY(0); @@ -545,7 +549,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { return false; } } else { - + if (this.eggGachaSummaryContainer.visible) { if (button === Button.ACTION || button === Button.CANCEL) { this.hideSummary(); @@ -646,7 +650,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { } } } - + if (success) { ui.playSelect(); } else if (error) { diff --git a/src/ui/egg-hatch-scene-handler.ts b/src/ui/egg-hatch-scene-handler.ts index 2277c3a4b64..5a4c984234c 100644 --- a/src/ui/egg-hatch-scene-handler.ts +++ b/src/ui/egg-hatch-scene-handler.ts @@ -16,11 +16,13 @@ export default class EggHatchSceneHandler extends UiHandler { this.scene.fieldUI.add(this.eggHatchContainer); const eggLightraysAnimFrames = this.scene.anims.generateFrameNames("egg_lightrays", { start: 0, end: 3 }); - this.scene.anims.create({ - key: "egg_lightrays", - frames: eggLightraysAnimFrames, - frameRate: 32 - }); + if (!(this.scene.anims.exists("egg_lightrays"))) { + this.scene.anims.create({ + key: "egg_lightrays", + frames: eggLightraysAnimFrames, + frameRate: 32 + }); + } } show(_args: any[]): boolean { diff --git a/src/ui/egg-list-ui-handler.ts b/src/ui/egg-list-ui-handler.ts index b2cbcb26769..92c7faf5477 100644 --- a/src/ui/egg-list-ui-handler.ts +++ b/src/ui/egg-list-ui-handler.ts @@ -49,7 +49,7 @@ export default class EggListUiHandler extends MessageUiHandler { this.iconAnimHandler = new PokemonIconAnimHandler(); this.iconAnimHandler.setup(this.scene); - this.eggNameText = addTextObject(this.scene, 8, 66, "", TextStyle.SUMMARY); + this.eggNameText = addTextObject(this.scene, 8, 68, "", TextStyle.SUMMARY); this.eggNameText.setOrigin(0, 0); this.eggListContainer.add(this.eggNameText); @@ -158,7 +158,7 @@ export default class EggListUiHandler extends MessageUiHandler { break; } } - + if (success) { ui.playSelect(); } else if (error) { diff --git a/src/ui/evolution-scene-handler.ts b/src/ui/evolution-scene-handler.ts index 368fca9238b..12b6ccc93d1 100644 --- a/src/ui/evolution-scene-handler.ts +++ b/src/ui/evolution-scene-handler.ts @@ -55,7 +55,7 @@ export default class EvolutionSceneHandler extends MessageUiHandler { show(_args: any[]): boolean { super.show(_args); - + this.scene.ui.bringToTop(this.evolutionContainer); this.scene.ui.bringToTop(this.messageBg); this.scene.ui.bringToTop(this.messageContainer); @@ -97,4 +97,4 @@ export default class EvolutionSceneHandler extends MessageUiHandler { this.messageContainer.setVisible(false); this.messageBg.setVisible(false); } -} +} diff --git a/src/ui/game-stats-ui-handler.ts b/src/ui/game-stats-ui-handler.ts index 75d4b6ab7eb..b4823010734 100644 --- a/src/ui/game-stats-ui-handler.ts +++ b/src/ui/game-stats-ui-handler.ts @@ -102,7 +102,7 @@ export default class GameStatsUiHandler extends UiHandler { setup() { const ui = this.getUi(); - + this.gameStatsContainer = this.scene.add.container(1, -(this.scene.game.canvas.height / 6) + 1); this.gameStatsContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6), Phaser.Geom.Rectangle.Contains); @@ -156,9 +156,9 @@ export default class GameStatsUiHandler extends UiHandler { super.show(args); this.setCursor(0); - + this.updateStats(); - + this.gameStatsContainer.setVisible(true); this.getUi().moveTo(this.gameStatsContainer, this.getUi().length - 1); @@ -230,7 +230,7 @@ export default class GameStatsUiHandler extends UiHandler { } } -(function () { +export function initStatsKeys() { const statKeys = Object.keys(displayStats); for (const key of statKeys) { @@ -256,4 +256,4 @@ export default class GameStatsUiHandler extends UiHandler { (displayStats[key] as DisplayStat).label = Utils.toReadableString(`${splittableKey[0].toUpperCase()}${splittableKey.slice(1)}`); } } -})(); +} diff --git a/src/ui/menu-ui-handler.ts b/src/ui/menu-ui-handler.ts index f02986b514b..a593779a798 100644 --- a/src/ui/menu-ui-handler.ts +++ b/src/ui/menu-ui-handler.ts @@ -54,7 +54,7 @@ export default class MenuUiHandler extends MessageUiHandler { setup() { const ui = this.getUi(); - + this.menuContainer = this.scene.add.container(1, -(this.scene.game.canvas.height / 6) + 1); this.menuContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6), Phaser.Geom.Rectangle.Contains); @@ -65,7 +65,7 @@ export default class MenuUiHandler extends MessageUiHandler { this.optionSelectText = addTextObject(this.scene, 0, 0, this.menuOptions.map(o => `${i18next.t(`menuUiHandler:${MenuOptions[o]}`)}`).join("\n"), TextStyle.WINDOW, { maxLines: this.menuOptions.length }); this.optionSelectText.setLineSpacing(12); - + this.menuBg = addWindow(this.scene, (this.scene.game.canvas.width / 6) - (this.optionSelectText.displayWidth + 25), 0, this.optionSelectText.displayWidth + 23, (this.scene.game.canvas.height / 6) - 2); this.menuBg.setOrigin(0, 0); diff --git a/src/ui/message-ui-handler.ts b/src/ui/message-ui-handler.ts index 21a650a92ea..05c91ca1643 100644 --- a/src/ui/message-ui-handler.ts +++ b/src/ui/message-ui-handler.ts @@ -56,7 +56,7 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { let newText = ""; for (let w = 0; w < textWords.length; w++) { const nextWordText = newText ? `${newText} ${textWords[w]}` : textWords[w]; - + if (textWords[w].includes("\n")) { newText = nextWordText; lastLineCount++; diff --git a/src/ui/modal-ui-handler.ts b/src/ui/modal-ui-handler.ts index ccc5d5650fb..b521ec43759 100644 --- a/src/ui/modal-ui-handler.ts +++ b/src/ui/modal-ui-handler.ts @@ -39,7 +39,7 @@ export abstract class ModalUiHandler extends UiHandler { setup() { const ui = this.getUi(); - + this.modalContainer = this.scene.add.container(0, 0); this.modalContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6), Phaser.Geom.Rectangle.Contains); @@ -106,7 +106,7 @@ export abstract class ModalUiHandler extends UiHandler { updateContainer(config?: ModalConfig): void { const [ marginTop, marginRight, marginBottom, marginLeft ] = this.getMargin(config); - + const [ width, height ] = [ this.getWidth(config), this.getHeight(config) ]; this.modalContainer.setPosition((((this.scene.game.canvas.width / 6) - (width + (marginRight - marginLeft))) / 2), (((-this.scene.game.canvas.height / 6) - (height + (marginBottom - marginTop))) / 2)); diff --git a/src/ui/modifier-select-ui-handler.ts b/src/ui/modifier-select-ui-handler.ts index bcd460dfab7..99a8546b52a 100644 --- a/src/ui/modifier-select-ui-handler.ts +++ b/src/ui/modifier-select-ui-handler.ts @@ -36,7 +36,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { setup() { const ui = this.getUi(); - + this.modifierContainer = this.scene.add.container(0, 0); ui.add(this.modifierContainer); @@ -112,7 +112,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { ? getPlayerShopModifierTypeOptionsForWave(this.scene.currentBattle.waveIndex, this.scene.getWaveMoneyAmount(1)) : []; const optionsYOffset = shopTypeOptions.length >= SHOP_OPTIONS_ROW_LIMIT ? -8 : -24; - + for (let m = 0; m < typeOptions.length; m++) { const sliceWidth = (this.scene.game.canvas.width / 6) / (typeOptions.length + 2); const option = new ModifierOption(this.scene, sliceWidth * (m + 1) + (sliceWidth * 0.5), -this.scene.game.canvas.height / 12 + optionsYOffset, typeOptions[m]); @@ -144,7 +144,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { this.scene.updateAndShowLuckText(750); let i = 0; - + this.scene.tweens.addCounter({ ease: "Sine.easeIn", duration: 1250, @@ -382,7 +382,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { const options = this.options.concat(this.shopOptionsRows.flat()); this.options.splice(0, this.options.length); this.shopOptionsRows.splice(0, this.shopOptionsRows.length); - + this.scene.tweens.add({ targets: options, scale: 0.01, @@ -390,7 +390,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { ease: "Cubic.easeIn", onComplete: () => options.forEach(o => o.destroy()) }); - + [ this.rerollButtonContainer, this.transferButtonContainer, this.lockRarityButtonContainer ].forEach(container => { if (container.visible) { this.scene.tweens.add({ @@ -479,7 +479,7 @@ class ModifierOption extends Phaser.GameObjects.Container { if (this.modifierTypeOption.cost) { this.itemCostText = addTextObject(this.scene, 0, 45, "", TextStyle.MONEY, { align: "center" }); - + this.itemCostText.setOrigin(0.5, 0); this.itemCostText.setAlpha(0); this.add(this.itemCostText); @@ -559,7 +559,7 @@ class ModifierOption extends Phaser.GameObjects.Container { if (!this.modifierTypeOption.cost) { this.pb.setTexture("pb", `${this.getPbAtlasKey(0)}_open`); (this.scene as BattleScene).playSound("pb_rel"); - + this.scene.tweens.add({ targets: this.pb, duration: 500, diff --git a/src/ui/party-exp-bar.ts b/src/ui/party-exp-bar.ts index 0d913f7074c..506b8b5c825 100644 --- a/src/ui/party-exp-bar.ts +++ b/src/ui/party-exp-bar.ts @@ -37,7 +37,7 @@ export default class PartyExpBar extends Phaser.GameObjects.Container { this.pokemonIcon = (this.scene as BattleScene).addPokemonIcon(pokemon, -8, 15, 0, 0.5); this.pokemonIcon.setScale(0.5); - + this.add(this.pokemonIcon); // if we want to only display the level in the small frame @@ -70,7 +70,7 @@ export default class PartyExpBar extends Phaser.GameObjects.Container { resolve(); } }); - + this.setVisible(true); this.shown = true; }); diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index 13461592b16..cc5fe54818b 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -87,7 +87,7 @@ export default class PartyUiHandler extends MessageUiHandler { private transferMode: boolean; private transferOptionCursor: integer; private transferCursor: integer; - + private lastCursor: integer = 0; private selectCallback: PartySelectCallback | PartyModifierTransferSelectCallback; private selectFilter: PokemonSelectFilter | PokemonModifierTransferSelectFilter; @@ -107,7 +107,7 @@ export default class PartyUiHandler extends MessageUiHandler { }; public static FilterFainted = (pokemon: PlayerPokemon) => { - if(!pokemon.isFainted()) { + if (!pokemon.isFainted()) { return `${pokemon.name} still has energy\nto battle!`; } return null; @@ -158,7 +158,7 @@ export default class PartyUiHandler extends MessageUiHandler { this.partyMessageBox = partyMessageBox; const partyMessageText = addTextObject(this.scene, 8, 10, defaultMessage, TextStyle.WINDOW, { maxLines: 2 }); - + partyMessageText.setOrigin(0, 0); partyMessageBoxContainer.add(partyMessageText); @@ -403,7 +403,7 @@ export default class PartyUiHandler extends MessageUiHandler { ui.playSelect(); } } - + return true; } @@ -423,13 +423,13 @@ export default class PartyUiHandler extends MessageUiHandler { } break; case Button.RIGHT: - if (slotCount === battlerCount){ + if (slotCount === battlerCount) { success = this.setCursor(6); break; - } else if (battlerCount >= 2 && slotCount > battlerCount && this.getCursor() === 0 && this.lastCursor === 1){ + } else if (battlerCount >= 2 && slotCount > battlerCount && this.getCursor() === 0 && this.lastCursor === 1) { success = this.setCursor(2); break; - } else if (slotCount > battlerCount && this.cursor < battlerCount){ + } else if (slotCount > battlerCount && this.cursor < battlerCount) { success = this.setCursor(this.lastCursor < 6 ? this.lastCursor || battlerCount : battlerCount); break; } @@ -463,10 +463,10 @@ export default class PartyUiHandler extends MessageUiHandler { } } } - + setCursor(cursor: integer): boolean { let changed: boolean; - + if (this.optionsMode) { changed = this.optionsCursor !== cursor; let isScroll = false; @@ -544,7 +544,7 @@ export default class PartyUiHandler extends MessageUiHandler { if (this.cursor === 6) { return; } - + this.optionsMode = true; let optionsMessage = "Do what with this Pokémon?"; @@ -717,7 +717,7 @@ export default class PartyUiHandler extends MessageUiHandler { case PartyOption.MOVE_3: case PartyOption.MOVE_4: const move = pokemon.moveset[option - PartyOption.MOVE_1]; - if(this.showMovePp) { + if (this.showMovePp) { const maxPP = move.getMovePp(); const currPP = maxPP - move.ppUsed; optionName = `${move.getName()} ${currPP}/${maxPP}`; @@ -880,7 +880,7 @@ class PartySlot extends Phaser.GameObjects.Container { this.slotIndex = slotIndex; this.pokemon = pokemon; this.iconAnimHandler = iconAnimHandler; - + this.setup(partyUiMode, tmMoveId); } @@ -989,7 +989,7 @@ class PartySlot extends Phaser.GameObjects.Container { fusionShinyStar.setOrigin(0, 0); fusionShinyStar.setPosition(shinyStar.x, shinyStar.y); fusionShinyStar.setTint(getVariantTint(this.pokemon.fusionVariant)); - + slotInfoContainer.add(fusionShinyStar); } } diff --git a/src/ui/pokeball-tray.ts b/src/ui/pokeball-tray.ts index 3ac41b9148e..00a8cdadc97 100644 --- a/src/ui/pokeball-tray.ts +++ b/src/ui/pokeball-tray.ts @@ -76,7 +76,7 @@ export default class PokeballTray extends Phaser.GameObjects.Container { }); } }); - + this.setVisible(true); this.shown = true; diff --git a/src/ui/pokemon-info-container.ts b/src/ui/pokemon-info-container.ts index a5d74fbd9aa..94884a6977c 100644 --- a/src/ui/pokemon-info-container.ts +++ b/src/ui/pokemon-info-container.ts @@ -13,7 +13,7 @@ import ConfirmUiHandler from "./confirm-ui-handler"; export default class PokemonInfoContainer extends Phaser.GameObjects.Container { private readonly infoWindowWidth = 104; - + private pokemonGenderLabelText: Phaser.GameObjects.Text; private pokemonGenderText: Phaser.GameObjects.Text; private pokemonAbilityLabelText: Phaser.GameObjects.Text; @@ -159,14 +159,14 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { this.pokemonShinyIcon.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip(null, `Shiny${shinyDescriptor ? ` (${shinyDescriptor})` : ""}`, true)); this.pokemonShinyIcon.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); } - + this.pokemonFusionShinyIcon.setPosition(this.pokemonShinyIcon.x, this.pokemonShinyIcon.y); this.pokemonFusionShinyIcon.setVisible(doubleShiny); if (isFusion) { this.pokemonFusionShinyIcon.setTint(getVariantTint(pokemon.fusionVariant)); } - const starterSpeciesId = pokemon.species.getRootSpeciesId(true); + const starterSpeciesId = pokemon.species.getRootSpeciesId(); const originalIvs: integer[] = this.scene.gameData.dexData[starterSpeciesId].caughtAttr ? this.scene.gameData.dexData[starterSpeciesId].ivs : null; @@ -245,7 +245,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { (this.scene as BattleScene).ui.hideTooltip(); resolve(); } - }); + }); this.shown = false; }); diff --git a/src/ui/save-slot-select-ui-handler.ts b/src/ui/save-slot-select-ui-handler.ts index 063ea6e1c84..d5dda05a519 100644 --- a/src/ui/save-slot-select-ui-handler.ts +++ b/src/ui/save-slot-select-ui-handler.ts @@ -189,10 +189,10 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { this.saveSlotSelectMessageBoxContainer.setVisible(!!text?.length); } - + setCursor(cursor: integer): boolean { const changed = super.setCursor(cursor); - + if (!this.cursorObj) { this.cursorObj = this.scene.add.nineslice(0, 0, "select_cursor_highlight_thick", null, 296, 44, 6, 6, 6, 6); this.cursorObj.setOrigin(0, 0); @@ -205,7 +205,7 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { setScrollCursor(scrollCursor: integer): boolean { const changed = scrollCursor !== this.scrollCursor; - + if (changed) { this.scrollCursor = scrollCursor; this.setCursor(this.cursor); @@ -250,7 +250,7 @@ class SessionSlot extends Phaser.GameObjects.Container { super(scene, 0, slotId * 56); this.slotId = slotId; - + this.setup(); } diff --git a/src/ui/saving-icon-handler.ts b/src/ui/saving-icon-handler.ts index a7c09ba490c..f62b0dc6162 100644 --- a/src/ui/saving-icon-handler.ts +++ b/src/ui/saving-icon-handler.ts @@ -47,7 +47,7 @@ export default class SavingIconHandler extends Phaser.GameObjects.Container { }); } }); - + this.setVisible(true); this.shown = true; } @@ -74,7 +74,7 @@ export default class SavingIconHandler extends Phaser.GameObjects.Container { } } }); - + this.shown = false; } } diff --git a/src/ui/settings-ui-handler.ts b/src/ui/settings-ui-handler.ts index bec98197dcf..ba6515ad0c4 100644 --- a/src/ui/settings-ui-handler.ts +++ b/src/ui/settings-ui-handler.ts @@ -34,7 +34,7 @@ export default class SettingsUiHandler extends UiHandler { setup() { const ui = this.getUi(); - + this.settingsContainer = this.scene.add.container(1, -(this.scene.game.canvas.height / 6) + 1); this.settingsContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6), Phaser.Geom.Rectangle.Contains); @@ -106,7 +106,7 @@ export default class SettingsUiHandler extends UiHandler { show(args: any[]): boolean { super.show(args); - + const settings: object = localStorage.hasOwnProperty("settings") ? JSON.parse(localStorage.getItem("settings")) : {}; Object.keys(settingDefaults).forEach((setting, s) => this.setOptionCursor(s, settings.hasOwnProperty(setting) ? settings[setting] : settingDefaults[setting])); @@ -278,7 +278,7 @@ export default class SettingsUiHandler extends UiHandler { if (this.reloadRequired) { this.reloadRequired = false; this.scene.reset(true, false, true); - } + } } eraseCursor() { diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 7fd8cce55e5..5b54152445e 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -276,7 +276,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonUncaughtText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonUncaughtText); - + // The position should be set per language const starterInfoXPos = textSettings?.starterInfoXPos || 31; const starterInfoYOffset = textSettings?.starterInfoYOffset || 0; @@ -1041,7 +1041,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { let newFormIndex = props.formIndex; do { newFormIndex = (newFormIndex + 1) % formCount; - if (this.speciesStarterDexEntry.caughtAttr & this.scene.gameData.getFormAttr(newFormIndex)) { + if (this.lastSpecies.forms[newFormIndex].isStarterSelectable && this.speciesStarterDexEntry.caughtAttr & this.scene.gameData.getFormAttr(newFormIndex)) { break; } } while (newFormIndex !== props.formIndex); @@ -1392,7 +1392,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { //Growth translate let growthReadable = Utils.toReadableString(GrowthRate[species.growthRate]); const growthAux = growthReadable.replace(" ", "_"); - if(i18next.exists("growth:" + growthAux)){ + if (i18next.exists("growth:" + growthAux)) { growthReadable = i18next.t("growth:"+ growthAux as any); } this.pokemonGrowthRateText.setText(growthReadable); @@ -1627,7 +1627,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { 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; - this.canCycleForm = species.forms.filter(f => !f.formKey || !pokemonFormChanges[species.speciesId]?.find(fc => fc.formKey)) + this.canCycleForm = species.forms.filter(f => f.isStarterSelectable || !pokemonFormChanges[species.speciesId]?.find(fc => fc.formKey)) .map((_, f) => dexEntry.caughtAttr & this.scene.gameData.getFormAttr(f)).filter(f => f).length > 1; this.canCycleNature = this.scene.gameData.getNaturesForAttr(dexEntry.natureAttr).length > 1; this.canCycleVariant = shiny && [ dexEntry.caughtAttr & DexAttr.DEFAULT_VARIANT, dexEntry.caughtAttr & DexAttr.VARIANT_2, dexEntry.caughtAttr & DexAttr.VARIANT_3].filter(v => v).length > 1; @@ -1684,12 +1684,12 @@ export default class StarterSelectUiHandler extends MessageUiHandler { if (this.starterMoveset.length < 4 && this.starterMoveset.length < availableStarterMoves.length) { this.starterMoveset.push(...availableStarterMoves.filter(sm => this.starterMoveset.indexOf(sm) === -1).slice(0, 4 - this.starterMoveset.length)); } - + // Remove duplicate moves this.starterMoveset = this.starterMoveset.filter( (move, i) => { return this.starterMoveset.indexOf(move) === i; - }) as StarterMoveset; + }) as StarterMoveset; const speciesForm = getPokemonSpeciesForm(species.speciesId, formIndex); diff --git a/src/ui/stats-container.ts b/src/ui/stats-container.ts index 283f79f01a8..54c10e0d9dc 100644 --- a/src/ui/stats-container.ts +++ b/src/ui/stats-container.ts @@ -66,7 +66,7 @@ export class StatsContainer extends Phaser.GameObjects.Container { const ivChartData = new Array(6).fill(null).map((_, i) => [ (ivs[ivChartStatIndexes[i]] / 31) * ivChartSize * ivChartStatCoordMultipliers[ivChartStatIndexes[i]][0], (ivs[ivChartStatIndexes[i]] / 31) * ivChartSize * ivChartStatCoordMultipliers[ivChartStatIndexes[i]][1] ] ).flat(); const lastIvChartData = this.statsIvsCache || defaultIvChartData; this.statsIvsCache = ivChartData.slice(0); - + this.ivStatValueTexts.map((t: BBCodeText, i: integer) => { let label = ivs[i].toString(); if (this.showDiff && originalIvs) { diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts index ba0c98b8941..a34de7d84f0 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -38,11 +38,11 @@ interface abilityContainer { /** An image displaying the summary label */ labelImage: Phaser.GameObjects.Image, /** The ability object */ - ability: Ability, + ability: Ability, /** The text object displaying the name of the ability */ nameText: Phaser.GameObjects.Text, - /** The text object displaying the description of the ability */ - descriptionText: Phaser.GameObjects.Text, + /** The text object displaying the description of the ability */ + descriptionText: Phaser.GameObjects.Text, } export default class SummaryUiHandler extends UiHandler { @@ -145,7 +145,7 @@ export default class SummaryUiHandler extends UiHandler { this.splicedIcon.setScale(0.75); this.splicedIcon.setInteractive(new Phaser.Geom.Rectangle(0, 0, 12, 15), Phaser.Geom.Rectangle.Contains); this.summaryContainer.add(this.splicedIcon); - + this.shinyIcon = this.scene.add.image(0, -54, "shiny_star"); this.shinyIcon.setVisible(false); this.shinyIcon.setOrigin(0, 0); @@ -203,7 +203,7 @@ export default class SummaryUiHandler extends UiHandler { statusBg.setOrigin(0, 0); this.statusContainer.add(statusBg); - + const statusLabel = addTextObject(this.scene, 3, 0, "Status", TextStyle.SUMMARY); statusLabel.setOrigin(0, 0); @@ -310,7 +310,7 @@ export default class SummaryUiHandler extends UiHandler { this.splicedIcon.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); } - if(this.scene.gameData.starterData[this.pokemon.species.getRootSpeciesId()].classicWinCount > 0 && this.scene.gameData.starterData[this.pokemon.species.getRootSpeciesId(true)].classicWinCount > 0) { + if (this.scene.gameData.starterData[this.pokemon.species.getRootSpeciesId()].classicWinCount > 0 && this.scene.gameData.starterData[this.pokemon.species.getRootSpeciesId(true)].classicWinCount > 0) { this.championRibbon.setVisible(true); } else { this.championRibbon.setVisible(false); @@ -335,7 +335,7 @@ export default class SummaryUiHandler extends UiHandler { const doubleShiny = isFusion && this.pokemon.shiny && this.pokemon.fusionShiny; const baseVariant = !doubleShiny ? this.pokemon.getVariant() : this.pokemon.variant; - + this.shinyIcon.setPositionRelative(this.nameText, this.nameText.displayWidth + (this.splicedIcon.visible ? this.splicedIcon.displayWidth + 1 : 0) + 1, 3); this.shinyIcon.setTexture(`shiny_star${doubleShiny ? "_1" : ""}`); this.shinyIcon.setVisible(this.pokemon.isShiny()); @@ -412,7 +412,7 @@ export default class SummaryUiHandler extends UiHandler { const tempMove = this.pokemon.moveset[this.selectedMoveIndex]; this.pokemon.moveset[this.selectedMoveIndex] = this.pokemon.moveset[this.moveCursor]; this.pokemon.moveset[this.moveCursor] = tempMove; - + const selectedMoveRow = this.moveRowsContainer.getAt(this.selectedMoveIndex) as Phaser.GameObjects.Container; const switchMoveRow = this.moveRowsContainer.getAt(this.moveCursor) as Phaser.GameObjects.Container; @@ -449,8 +449,8 @@ export default class SummaryUiHandler extends UiHandler { break; case Button.LEFT: this.moveSelect = false; - this.setCursor(Page.STATS); - if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE){ + this.setCursor(Page.STATS); + if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE) { this.hideMoveEffect(); this.destroyBlinkCursor(); success = true; @@ -469,7 +469,7 @@ export default class SummaryUiHandler extends UiHandler { success = true; } else if (this.cursor === Page.PROFILE && this.pokemon.hasPassive()) { // if we're on the PROFILE page and this pokemon has a passive unlocked.. - // Since abilities are displayed by default, all we need to do is toggle visibility on all elements to show passives + // Since abilities are displayed by default, all we need to do is toggle visibility on all elements to show passives this.abilityContainer.nameText.setVisible(!this.abilityContainer.descriptionText.visible); this.abilityContainer.descriptionText.setVisible(!this.abilityContainer.descriptionText.visible); this.abilityContainer.labelImage.setVisible(!this.abilityContainer.labelImage.visible); @@ -530,7 +530,7 @@ export default class SummaryUiHandler extends UiHandler { setCursor(cursor: integer, overrideChanged: boolean = false): boolean { let changed: boolean = overrideChanged || this.moveCursor !== cursor; - + if (this.moveSelect) { this.moveCursor = cursor; @@ -623,10 +623,10 @@ export default class SummaryUiHandler extends UiHandler { x: forward ? "-=214" : "+=214", duration: 250, onComplete: () => { - if (forward){ - this.populatePageContainer(this.summaryPageContainer); + if (forward) { + this.populatePageContainer(this.summaryPageContainer); if (this.cursor===Page.MOVES) { - this.moveCursorObj = null; + this.moveCursorObj = null; this.showMoveSelect(); this.showMoveEffect(); } @@ -668,7 +668,7 @@ export default class SummaryUiHandler extends UiHandler { this.descriptionScrollTween.remove(); this.descriptionScrollTween = null; } - + switch (page) { case Page.PROFILE: const profileContainer = this.scene.add.container(0, -pageBg.height); @@ -718,7 +718,7 @@ export default class SummaryUiHandler extends UiHandler { const luckLabelText = addTextObject(this.scene, 141, 28, "Luck:", TextStyle.SUMMARY_ALT); luckLabelText.setOrigin(0, 0); profileContainer.add(luckLabelText); - + const luckText = addTextObject(this.scene, 141 + luckLabelText.displayWidth + 2, 28, this.pokemon.getLuck().toString(), TextStyle.SUMMARY); luckText.setOrigin(0, 0); luckText.setTint(getVariantTint((Math.min(this.pokemon.getLuck() - 1, 2)) as Variant)); @@ -727,18 +727,18 @@ export default class SummaryUiHandler extends UiHandler { this.abilityContainer = { labelImage: this.scene.add.image(0, 0, "summary_profile_ability"), - ability: this.pokemon.getAbility(true), - nameText: null, + ability: this.pokemon.getAbility(true), + nameText: null, descriptionText: null}; - + const allAbilityInfo = [this.abilityContainer]; // Creates an array to iterate through // Only add to the array and set up displaying a passive if it's unlocked if (this.pokemon.hasPassive()) { this.passiveContainer = { labelImage: this.scene.add.image(0, 0, "summary_profile_passive"), - ability: this.pokemon.getPassiveAbility(), - nameText: null, - descriptionText: null}; + ability: this.pokemon.getPassiveAbility(), + nameText: null, + descriptionText: null}; allAbilityInfo.push(this.passiveContainer); // Sets up the pixel button prompt image @@ -749,7 +749,7 @@ export default class SummaryUiHandler extends UiHandler { profileContainer.add(this.abilityPrompt); } - allAbilityInfo.forEach(abilityInfo => { + allAbilityInfo.forEach(abilityInfo => { abilityInfo.labelImage.setPosition(17, 43); abilityInfo.labelImage.setVisible(true); abilityInfo.labelImage.setOrigin(0, 0); @@ -795,7 +795,7 @@ export default class SummaryUiHandler extends UiHandler { this.passiveContainer?.descriptionText.setVisible(false); const memoString = `${getBBCodeFrag(Utils.toReadableString(Nature[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 memoText = addBBCodeTextObject(this.scene, 7, 113, memoString, TextStyle.WINDOW_ALT); memoText.setOrigin(0, 0); profileContainer.add(memoText); @@ -830,13 +830,13 @@ 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[]; - + itemModifiers.forEach((item, i) => { const icon = item.getIcon(this.scene, true); icon.setPosition((i % 17) * 12 + 3, 14 * Math.floor(i / 17) + 15); statsContainer.add(icon); - + icon.setInteractive(new Phaser.Geom.Rectangle(0, 0, 32, 32), Phaser.Geom.Rectangle.Contains); icon.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip(item.type.name, item.type.getDescription(this.scene), true)); icon.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); @@ -1017,12 +1017,12 @@ export default class SummaryUiHandler extends UiHandler { this.moveSelect = false; this.extraMoveRowContainer.setVisible(false); this.moveDescriptionText.setText(""); - + this.destroyBlinkCursor(); this.hideMoveEffect(); } - destroyBlinkCursor(){ + destroyBlinkCursor() { if (this.moveCursorBlinkTimer) { this.moveCursorBlinkTimer.destroy(); this.moveCursorBlinkTimer = null; diff --git a/src/ui/target-select-ui-handler.ts b/src/ui/target-select-ui-handler.ts index 0f6fce3b274..c69284fe64e 100644 --- a/src/ui/target-select-ui-handler.ts +++ b/src/ui/target-select-ui-handler.ts @@ -16,6 +16,7 @@ export default class TargetSelectUiHandler extends UiHandler { private targets: BattlerIndex[]; private targetFlashTween: Phaser.Tweens.Tween; + private targetBattleInfoMoveTween: Phaser.Tweens.Tween; constructor(scene: BattleScene) { super(scene, Mode.TARGET_SELECT); @@ -116,6 +117,25 @@ export default class TargetSelectUiHandler extends UiHandler { } }); + if (this.targetBattleInfoMoveTween) { + this.targetBattleInfoMoveTween.stop(); + const lastTarget = this.scene.getField()[lastCursor]; + if (lastTarget) { + lastTarget.getBattleInfo().resetY(); + } + } + + const targetBattleInfo = 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 + }); + return ret; } @@ -128,6 +148,15 @@ export default class TargetSelectUiHandler extends UiHandler { if (target) { target.setAlpha(1); } + + const targetBattleInfo = target.getBattleInfo(); + if (this.targetBattleInfoMoveTween) { + this.targetBattleInfoMoveTween.stop(); + this.targetBattleInfoMoveTween = null; + } + if (targetBattleInfo) { + targetBattleInfo.resetY(); + } } clear() { diff --git a/src/ui/ui-theme.ts b/src/ui/ui-theme.ts index f7eaec9d483..3351efffa1d 100644 --- a/src/ui/ui-theme.ts +++ b/src/ui/ui-theme.ts @@ -42,7 +42,7 @@ export function addWindow(scene: BattleScene, x: number, y: number, width: numbe } const borderSize = scene.uiTheme ? 6 : 8; - + const window = scene.add.nineslice(x, y, `window_${scene.windowType}${getWindowVariantSuffix(windowVariant)}`, null, width, height, borderSize, borderSize, borderSize, borderSize); window.setOrigin(0, 0); diff --git a/src/ui/ui.ts b/src/ui/ui.ts index e5b74b33225..0643a6d6981 100644 --- a/src/ui/ui.ts +++ b/src/ui/ui.ts @@ -110,7 +110,7 @@ export default class UI extends Phaser.GameObjects.Container { private tooltipBg: Phaser.GameObjects.NineSlice; private tooltipTitle: Phaser.GameObjects.Text; private tooltipContent: Phaser.GameObjects.Text; - + private overlayActive: boolean; constructor(scene: BattleScene) { @@ -163,7 +163,7 @@ export default class UI extends Phaser.GameObjects.Container { this.achvBar = new AchvBar(this.scene as BattleScene); this.achvBar.setup(); - + (this.scene as BattleScene).uiContainer.add(this.achvBar); this.savingIcon = new SavingIconHandler(this.scene as BattleScene); diff --git a/src/ui/unavailable-modal-ui-handler.ts b/src/ui/unavailable-modal-ui-handler.ts index da2393f3b0d..96bf561003b 100644 --- a/src/ui/unavailable-modal-ui-handler.ts +++ b/src/ui/unavailable-modal-ui-handler.ts @@ -6,10 +6,17 @@ import { updateUserInfo } from "#app/account"; export default class UnavailableModalUiHandler extends ModalUiHandler { private reconnectTimer: number; + private reconnectDuration: number; private reconnectCallback: () => void; + private readonly minTime = 1000 * 5; + private readonly maxTime = 1000 * 60 * 5; + + private readonly randVarianceTime = 1000 * 10; + constructor(scene: BattleScene, mode?: Mode) { super(scene, mode); + this.reconnectDuration = this.minTime; } getModalTitle(): string { @@ -41,6 +48,24 @@ export default class UnavailableModalUiHandler extends ModalUiHandler { this.modalContainer.add(label); } + tryReconnect(): void { + updateUserInfo().then(response => { + if (response[0] || [200, 400].includes(response[1])) { + this.reconnectTimer = null; + this.reconnectDuration = this.minTime; + this.scene.playSound("pb_bounce_1"); + this.reconnectCallback(); + } else { + this.reconnectDuration = Math.min(this.reconnectDuration * 2, this.maxTime); // Set a max delay so it isn't infinite + this.reconnectTimer = + setTimeout( + () => this.tryReconnect(), + // Adds a random factor to avoid pendulum effect during long total breakdown + this.reconnectDuration + (Math.random() * this.randVarianceTime)); + } + }); + } + show(args: any[]): boolean { if (args.length >= 1 && args[0] instanceof Function) { const config: ModalConfig = { @@ -48,17 +73,8 @@ export default class UnavailableModalUiHandler extends ModalUiHandler { }; this.reconnectCallback = args[0]; - - this.reconnectTimer = setInterval(() => { - updateUserInfo().then(response => { - if (response[0] || [200, 400].includes(response[1])) { - clearInterval(this.reconnectTimer); - this.reconnectTimer = null; - this.scene.playSound("pb_bounce_1"); - this.reconnectCallback(); - } - }); - }, 5000); + this.reconnectDuration = this.minTime; + this.reconnectTimer = setTimeout(() => this.tryReconnect(), this.reconnectDuration); return super.show([ config ]); } diff --git a/src/ui/vouchers-ui-handler.ts b/src/ui/vouchers-ui-handler.ts index ddc09ee5f9e..5d45c1d82d2 100644 --- a/src/ui/vouchers-ui-handler.ts +++ b/src/ui/vouchers-ui-handler.ts @@ -26,14 +26,14 @@ export default class VouchersUiHandler extends MessageUiHandler { constructor(scene: BattleScene, mode?: Mode) { super(scene, mode); - + this.itemsTotal = Object.keys(vouchers).length; this.scrollCursor = 0; } setup() { const ui = this.getUi(); - + this.vouchersContainer = this.scene.add.container(1, -(this.scene.game.canvas.height / 6) + 1); this.vouchersContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6), Phaser.Geom.Rectangle.Contains); @@ -49,7 +49,7 @@ export default class VouchersUiHandler extends MessageUiHandler { this.voucherIconsBg.setOrigin(0, 0); this.voucherIconsContainer = this.scene.add.container(6, headerBg.height + 6); - + this.voucherIcons = []; for (let a = 0; a < itemRows * itemCols; a++) { diff --git a/src/utils.ts b/src/utils.ts index 1afa8e37eda..fb0668516d6 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -7,12 +7,12 @@ export function toReadableString(str: string): string { export function randomString(length: integer, seeded: boolean = false) { const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; let result = ""; - + for (let i = 0; i < length; i++) { const randomIndex = seeded ? randSeedInt(characters.length) : Math.floor(Math.random() * characters.length); result += characters[randomIndex]; } - + return result; } @@ -20,7 +20,7 @@ export function shiftCharCodes(str: string, shiftCount: integer) { if (!shiftCount) { shiftCount = 0; } - + let newStr = ""; for (let i = 0; i < str.length; i++) { @@ -146,11 +146,11 @@ export function getPlayTimeString(totalSeconds: integer): string { } export function binToDec(input: string): integer { - const place: integer[] = []; + const place: integer[] = []; const binary: string[] = []; - + let decimalNum = 0; - + for (let i = 0; i < input.length; i++) { binary.push(input[i]); place.push(Math.pow(2, i)); @@ -325,7 +325,7 @@ export function fixedInt(value: integer): integer { export function rgbToHsv(r: integer, g: integer, b: integer) { const v = Math.max(r, g, b); const c = v - Math.min(r, g, b); - const h = c && ((v === r) ? (g - b) / c : ((v === g) ? 2 + (b - r) / c : 4 + (r - g) / c)); + const h = c && ((v === r) ? (g - b) / c : ((v === g) ? 2 + (b - r) / c : 4 + (r - g) / c)); return [ 60 * (h < 0 ? h + 6 : h), v && c / v, v]; } diff --git a/vitest.config.js b/vitest.config.js index 5a7babd4232..c73476431dd 100644 --- a/vitest.config.js +++ b/vitest.config.js @@ -14,6 +14,7 @@ export default defineConfig(({ mode }) => { } }, threads: false, + trace: true, environmentOptions: { jsdom: { resources: 'usable',