diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000000..9bcccb9439d --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v20.13.1 diff --git a/eslint.config.js b/eslint.config.js index 1cea5563a78..0da9cc604bf 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -5,6 +5,7 @@ import importX from 'eslint-plugin-import-x'; export default [ { + name: "eslint-config", files: ["src/**/*.{ts,tsx,js,jsx}"], ignores: ["dist/*", "build/*", "coverage/*", "public/*", ".github/*", "node_modules/*", ".vscode/*"], languageOptions: { @@ -48,5 +49,22 @@ export default [ "no-multiple-empty-lines": ["error", { "max": 2, "maxEOF": 1, "maxBOF": 0 }], // Disallows multiple empty lines "@typescript-eslint/consistent-type-imports": "error", // Enforces type-only imports wherever possible } + }, + { + name: "eslint-tests", + files: ["src/test/**/**.test.ts"], + languageOptions: { + parser: parser, + parserOptions: { + "project": ["./tsconfig.json"] + } + }, + plugins: { + "@typescript-eslint": tseslint + }, + rules: { + "@typescript-eslint/no-floating-promises": "error", // Require Promise-like statements to be handled appropriately. - https://typescript-eslint.io/rules/no-floating-promises/ + "@typescript-eslint/no-misused-promises": "error", // Disallow Promises in places not designed to handle them. - https://typescript-eslint.io/rules/no-misused-promises/ + } } ] diff --git a/index.css b/index.css index 2ec106516d2..d32d9da9bb1 100644 --- a/index.css +++ b/index.css @@ -164,13 +164,13 @@ input:-internal-autofill-selected { } /* Show cycle buttons only on STARTER_SELECT and on touch configuration panel */ -#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadOpenFilters, -#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='RUN_INFO']) #apadCycleForm, -#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='RUN_INFO']) #apadCycleShiny, +#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX'], [data-ui-mode='POKEDEX_PAGE']) #apadOpenFilters, +#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX'], [data-ui-mode='POKEDEX_PAGE'], [data-ui-mode='RUN_INFO']) #apadCycleForm, +#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX'], [data-ui-mode='POKEDEX_PAGE'], [data-ui-mode='RUN_INFO']) #apadCycleShiny, #touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleNature, -#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='RUN_INFO']) #apadCycleAbility, -#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleGender, -#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleVariant { +#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX_PAGE'], [data-ui-mode='RUN_INFO']) #apadCycleAbility, +#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX_PAGE']) #apadCycleGender, +#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='POKEDEX']) #apadCycleVariant { display: none; } diff --git a/package-lock.json b/package-lock.json index 676539af79e..ce1feb7db41 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "pokemon-rogue-battle", - "version": "1.5.2", + "version": "1.6.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "pokemon-rogue-battle", - "version": "1.5.2", + "version": "1.6.4", "hasInstallScript": true, "dependencies": { "@material/material-color-utilities": "^0.2.7", @@ -28,7 +28,7 @@ "@types/node": "^20.12.13", "@typescript-eslint/eslint-plugin": "^8.0.0-alpha.54", "@typescript-eslint/parser": "^8.0.0-alpha.54", - "@vitest/coverage-istanbul": "^2.0.4", + "@vitest/coverage-istanbul": "^2.1.9", "dependency-cruiser": "^16.3.10", "eslint": "^9.7.0", "eslint-plugin-import-x": "^4.2.1", @@ -40,9 +40,9 @@ "typedoc": "^0.26.4", "typescript": "^5.5.3", "typescript-eslint": "^8.0.0-alpha.54", - "vite": "^5.4.8", + "vite": "^5.4.14", "vite-tsconfig-paths": "^4.3.2", - "vitest": "^2.0.4", + "vitest": "^2.1.9", "vitest-canvas-mock": "^0.3.3" }, "engines": { @@ -269,9 +269,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true, "license": "MIT", "engines": { @@ -279,9 +279,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, "license": "MIT", "engines": { @@ -406,11 +406,14 @@ } }, "node_modules/@babel/parser": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.0.tgz", - "integrity": "sha512-CzdIU9jdP0dg7HdyB+bHvDJGagUv+qtzZt5rYCWwW6tITNqV9odjp6Qu41gkG0ca5UfdDUWrKkiAnHHdGRnOrA==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.8.tgz", + "integrity": "sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.8" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -476,15 +479,14 @@ } }, "node_modules/@babel/types": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.0.tgz", - "integrity": "sha512-LcnxQSsd9aXOIgmmSpvZ/1yo46ra2ESYyqLcryaBZOghxy5qqOBjvCWP5JfkI8yl9rlxRgdLTTMCQQRcN2hdCg==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.8.tgz", + "integrity": "sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2145,20 +2147,20 @@ } }, "node_modules/@vitest/coverage-istanbul": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vitest/coverage-istanbul/-/coverage-istanbul-2.0.4.tgz", - "integrity": "sha512-6VibYMkXh8cJm5Bg8JYeOoR4oURlPf4YKP9kuVRE/NKasfYrXPnzSwuxrpgMbgOfPj13KUJXgMB3VAGukECtlQ==", + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/coverage-istanbul/-/coverage-istanbul-2.1.9.tgz", + "integrity": "sha512-vdYE4FkC/y2lxcN3Dcj54Bw+ericmDwiex0B8LV5F/YNYEYP1mgVwhPnHwWGAXu38qizkjOuyczKbFTALfzFKw==", "dev": true, "license": "MIT", "dependencies": { "@istanbuljs/schema": "^0.1.3", - "debug": "^4.3.5", + "debug": "^4.3.7", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-instrument": "^6.0.3", "istanbul-lib-report": "^3.0.1", "istanbul-lib-source-maps": "^5.0.6", "istanbul-reports": "^3.1.7", - "magicast": "^0.3.4", + "magicast": "^0.3.5", "test-exclude": "^7.0.1", "tinyrainbow": "^1.2.0" }, @@ -2166,29 +2168,56 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vitest": "2.0.4" + "vitest": "2.1.9" } }, "node_modules/@vitest/expect": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.4.tgz", - "integrity": "sha512-39jr5EguIoanChvBqe34I8m1hJFI4+jxvdOpD7gslZrVQBKhh8H9eD7J/LJX4zakrw23W+dITQTDqdt43xVcJw==", + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.9.tgz", + "integrity": "sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "2.0.4", - "@vitest/utils": "2.0.4", - "chai": "^5.1.1", + "@vitest/spy": "2.1.9", + "@vitest/utils": "2.1.9", + "chai": "^5.1.2", "tinyrainbow": "^1.2.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, + "node_modules/@vitest/mocker": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.9.tgz", + "integrity": "sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.9", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.12" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, "node_modules/@vitest/pretty-format": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.4.tgz", - "integrity": "sha512-RYZl31STbNGqf4l2eQM1nvKPXE0NhC6Eq0suTTePc4mtMQ1Fn8qZmjV4emZdEdG2NOWGKSCrHZjmTqDCDoeFBw==", + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.9.tgz", + "integrity": "sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2199,13 +2228,13 @@ } }, "node_modules/@vitest/runner": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.0.4.tgz", - "integrity": "sha512-Gk+9Su/2H2zNfNdeJR124gZckd5st4YoSuhF1Rebi37qTXKnqYyFCd9KP4vl2cQHbtuVKjfEKrNJxHHCW8thbQ==", + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.9.tgz", + "integrity": "sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "2.0.4", + "@vitest/utils": "2.1.9", "pathe": "^1.1.2" }, "funding": { @@ -2213,14 +2242,14 @@ } }, "node_modules/@vitest/snapshot": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.0.4.tgz", - "integrity": "sha512-or6Mzoz/pD7xTvuJMFYEtso1vJo1S5u6zBTinfl+7smGUhqybn6VjzCDMhmTyVOFWwkCMuNjmNNxnyXPgKDoPw==", + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.9.tgz", + "integrity": "sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "2.0.4", - "magic-string": "^0.30.10", + "@vitest/pretty-format": "2.1.9", + "magic-string": "^0.30.12", "pathe": "^1.1.2" }, "funding": { @@ -2228,28 +2257,27 @@ } }, "node_modules/@vitest/spy": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.4.tgz", - "integrity": "sha512-uTXU56TNoYrTohb+6CseP8IqNwlNdtPwEO0AWl+5j7NelS6x0xZZtP0bDWaLvOfUbaYwhhWp1guzXUxkC7mW7Q==", + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.9.tgz", + "integrity": "sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==", "dev": true, "license": "MIT", "dependencies": { - "tinyspy": "^3.0.0" + "tinyspy": "^3.0.2" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.4.tgz", - "integrity": "sha512-Zc75QuuoJhOBnlo99ZVUkJIuq4Oj0zAkrQ2VzCqNCx6wAwViHEh5Fnp4fiJTE9rA+sAoXRf00Z9xGgfEzV6fzQ==", + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.9.tgz", + "integrity": "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "2.0.4", - "estree-walker": "^3.0.3", - "loupe": "^3.1.1", + "@vitest/pretty-format": "2.1.9", + "loupe": "^3.1.2", "tinyrainbow": "^1.2.0" }, "funding": { @@ -2545,9 +2573,9 @@ "license": "CC-BY-4.0" }, "node_modules/chai": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", - "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", + "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", "dev": true, "license": "MIT", "dependencies": { @@ -2800,13 +2828,13 @@ } }, "node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3004,6 +3032,13 @@ "node": ">= 0.4" } }, + "node_modules/es-module-lexer": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "dev": true, + "license": "MIT" + }, "node_modules/esbuild": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", @@ -3450,28 +3485,14 @@ "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "license": "MIT" }, - "node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "node_modules/expect-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", + "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==", "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, + "license": "Apache-2.0", "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "node": ">=12.0.0" } }, "node_modules/external-editor": { @@ -3695,16 +3716,6 @@ "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/get-intrinsic": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", @@ -3724,19 +3735,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-tsconfig": { "version": "4.8.0", "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.0.tgz", @@ -3968,16 +3966,6 @@ "node": ">= 14" } }, - "node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=16.17.0" - } - }, "node_modules/i18next": { "version": "23.12.2", "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.12.2.tgz", @@ -4240,19 +4228,6 @@ "dev": true, "license": "MIT" }, - "node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", @@ -4716,14 +4691,11 @@ "license": "MIT" }, "node_modules/loupe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", - "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", + "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", "dev": true, - "license": "MIT", - "dependencies": { - "get-func-name": "^2.0.1" - } + "license": "MIT" }, "node_modules/lru-cache": { "version": "5.1.1", @@ -4743,9 +4715,9 @@ "license": "MIT" }, "node_modules/magic-string": { - "version": "0.30.11", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", - "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, "license": "MIT", "dependencies": { @@ -4753,14 +4725,14 @@ } }, "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==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", + "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.24.4", - "@babel/types": "^7.24.0", + "@babel/parser": "^7.25.4", + "@babel/types": "^7.25.4", "source-map-js": "^1.2.0" } }, @@ -4819,13 +4791,6 @@ "url": "https://github.com/sindresorhus/memoize?sponsor=1" } }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -4886,19 +4851,6 @@ "node": ">= 0.6" } }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/mimic-function": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", @@ -4959,9 +4911,9 @@ } }, "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==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, "license": "MIT" }, @@ -5138,35 +5090,6 @@ "integrity": "sha512-Ww6ZlOiEQfPfXM45v17oabk77Z7mg5bOt7AjDyzy7RjK9OrLrLC8dyZQoAPEOtFX9SaNf1Tdvr5gRJWdTJj7GA==", "dev": true }, - "node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/nwsapi": { "version": "2.2.12", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.12.tgz", @@ -5182,22 +5105,6 @@ "node": ">= 0.4" } }, - "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -5978,9 +5885,9 @@ } }, "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==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", + "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", "dev": true, "license": "MIT" }, @@ -6106,19 +6013,6 @@ "node": ">=4" } }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -6225,16 +6119,23 @@ "license": "MIT" }, "node_modules/tinybench": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.8.0.tgz", - "integrity": "sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", "dev": true, "license": "MIT" }, "node_modules/tinypool": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.0.tgz", - "integrity": "sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", + "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", "dev": true, "license": "MIT", "engines": { @@ -6252,9 +6153,9 @@ } }, "node_modules/tinyspy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.0.tgz", - "integrity": "sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", "dev": true, "license": "MIT", "engines": { @@ -6274,16 +6175,6 @@ "node": ">=0.6.0" } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -6561,10 +6452,11 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/vite": { - "version": "5.4.8", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz", - "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==", + "version": "5.4.14", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.14.tgz", + "integrity": "sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==", "dev": true, + "license": "MIT", "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", @@ -6620,16 +6512,16 @@ } }, "node_modules/vite-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.0.4.tgz", - "integrity": "sha512-ZpJVkxcakYtig5iakNeL7N3trufe3M6vGuzYAr4GsbCTwobDeyPJpE4cjDhhPluv8OvQCFzu2LWp6GkoKRITXA==", + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.9.tgz", + "integrity": "sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==", "dev": true, "license": "MIT", "dependencies": { "cac": "^6.7.14", - "debug": "^4.3.5", + "debug": "^4.3.7", + "es-module-lexer": "^1.5.4", "pathe": "^1.1.2", - "tinyrainbow": "^1.2.0", "vite": "^5.0.0" }, "bin": { @@ -6663,30 +6555,31 @@ } }, "node_modules/vitest": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.0.4.tgz", - "integrity": "sha512-luNLDpfsnxw5QSW4bISPe6tkxVvv5wn2BBs/PuDRkhXZ319doZyLOBr1sjfB5yCEpTiU7xCAdViM8TNVGPwoog==", + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.9.tgz", + "integrity": "sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==", "dev": true, "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.3.0", - "@vitest/expect": "2.0.4", - "@vitest/pretty-format": "^2.0.4", - "@vitest/runner": "2.0.4", - "@vitest/snapshot": "2.0.4", - "@vitest/spy": "2.0.4", - "@vitest/utils": "2.0.4", - "chai": "^5.1.1", - "debug": "^4.3.5", - "execa": "^8.0.1", - "magic-string": "^0.30.10", + "@vitest/expect": "2.1.9", + "@vitest/mocker": "2.1.9", + "@vitest/pretty-format": "^2.1.9", + "@vitest/runner": "2.1.9", + "@vitest/snapshot": "2.1.9", + "@vitest/spy": "2.1.9", + "@vitest/utils": "2.1.9", + "chai": "^5.1.2", + "debug": "^4.3.7", + "expect-type": "^1.1.0", + "magic-string": "^0.30.12", "pathe": "^1.1.2", - "std-env": "^3.7.0", - "tinybench": "^2.8.0", - "tinypool": "^1.0.0", + "std-env": "^3.8.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.1", + "tinypool": "^1.0.1", "tinyrainbow": "^1.2.0", "vite": "^5.0.0", - "vite-node": "2.0.4", + "vite-node": "2.1.9", "why-is-node-running": "^2.3.0" }, "bin": { @@ -6701,8 +6594,8 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "2.0.4", - "@vitest/ui": "2.0.4", + "@vitest/browser": "2.1.9", + "@vitest/ui": "2.1.9", "happy-dom": "*", "jsdom": "*" }, diff --git a/package.json b/package.json index 4c05571e55a..c9b5798af76 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "pokemon-rogue-battle", "private": true, - "version": "1.5.2", + "version": "1.6.4", "type": "module", "scripts": { "start": "vite", @@ -33,7 +33,7 @@ "@types/node": "^20.12.13", "@typescript-eslint/eslint-plugin": "^8.0.0-alpha.54", "@typescript-eslint/parser": "^8.0.0-alpha.54", - "@vitest/coverage-istanbul": "^2.0.4", + "@vitest/coverage-istanbul": "^2.1.9", "dependency-cruiser": "^16.3.10", "eslint": "^9.7.0", "eslint-plugin-import-x": "^4.2.1", @@ -45,9 +45,9 @@ "typedoc": "^0.26.4", "typescript": "^5.5.3", "typescript-eslint": "^8.0.0-alpha.54", - "vite": "^5.4.8", + "vite": "^5.4.14", "vite-tsconfig-paths": "^4.3.2", - "vitest": "^2.0.4", + "vitest": "^2.1.9", "vitest-canvas-mock": "^0.3.3" }, "dependencies": { diff --git a/public/audio/bgm/end.mp3 b/public/audio/bgm/end.mp3 index c37973fd9cc..fa33f890dc3 100644 Binary files a/public/audio/bgm/end.mp3 and b/public/audio/bgm/end.mp3 differ diff --git a/public/exp-sprites.json b/public/exp-sprites.json index 947bffd399d..6ee812d67be 100644 --- a/public/exp-sprites.json +++ b/public/exp-sprites.json @@ -201,6 +201,8 @@ "6211", "6215", "6215", + "6215f", + "6215f", "65-mega", "65-mega", "650", @@ -291,8 +293,8 @@ "666-tundra", "667", "667", - "668-female", - "668-female", + "668f", + "668f", "668", "668", "669-blue", @@ -1333,6 +1335,8 @@ "6211b", "6215b", "6215b", + "6215bf", + "6215bf", "65b-mega", "65b-mega", "650b", @@ -1423,8 +1427,8 @@ "666b-tundra", "667b", "667b", - "668b-female", - "668b-female", + "668bf", + "668bf", "668b", "668b", "669b-blue", @@ -2467,6 +2471,8 @@ "6211sb", "6215sb", "6215sb", + "6215sbf", + "6215sbf", "65sb-mega", "65sb-mega", "650sb", @@ -2559,6 +2565,8 @@ "667sb", "668sb", "668sb", + "668sbf", + "668sbf", "669sb-blue", "669sb-blue", "669sb-orange", @@ -3604,6 +3612,8 @@ "6211s", "6215s", "6215s", + "6215sf", + "6215sf", "65s-mega", "65s-mega", "650s", @@ -3694,8 +3704,8 @@ "666s-tundra", "667s", "667s", - "668s-female", - "668s-female", + "668sf", + "668sf", "668s", "668s", "669s-blue", @@ -4587,6 +4597,7 @@ "475-mega_3", "475-mega_3", "6215", + "6215f", "653", "654", "6549", @@ -4856,6 +4867,7 @@ "475b-mega_3", "475b-mega_3", "6215b", + "6215bf", "653b", "654b", "6549b", diff --git a/public/fonts/pokemon-emerald-pro.ttf b/public/fonts/pokemon-emerald-pro.ttf index 758130172c7..d63ff2d6470 100644 Binary files a/public/fonts/pokemon-emerald-pro.ttf and b/public/fonts/pokemon-emerald-pro.ttf differ diff --git a/public/images/events/valentines2025event-de.png b/public/images/events/valentines2025event-de.png new file mode 100644 index 00000000000..8dd41924a77 Binary files /dev/null and b/public/images/events/valentines2025event-de.png differ diff --git a/public/images/events/valentines2025event-en.png b/public/images/events/valentines2025event-en.png new file mode 100644 index 00000000000..dc36dad3394 Binary files /dev/null and b/public/images/events/valentines2025event-en.png differ diff --git a/public/images/events/valentines2025event-es-ES.png b/public/images/events/valentines2025event-es-ES.png new file mode 100644 index 00000000000..0915299b7bd Binary files /dev/null and b/public/images/events/valentines2025event-es-ES.png differ diff --git a/public/images/events/valentines2025event-fr.png b/public/images/events/valentines2025event-fr.png new file mode 100644 index 00000000000..dbaf23101ed Binary files /dev/null and b/public/images/events/valentines2025event-fr.png differ diff --git a/public/images/events/valentines2025event-it.png b/public/images/events/valentines2025event-it.png new file mode 100644 index 00000000000..b10eb8083be Binary files /dev/null and b/public/images/events/valentines2025event-it.png differ diff --git a/public/images/events/valentines2025event-ja.png b/public/images/events/valentines2025event-ja.png new file mode 100644 index 00000000000..7e9fe5ad3d4 Binary files /dev/null and b/public/images/events/valentines2025event-ja.png differ diff --git a/public/images/events/valentines2025event-ko.png b/public/images/events/valentines2025event-ko.png new file mode 100644 index 00000000000..558a402fc77 Binary files /dev/null and b/public/images/events/valentines2025event-ko.png differ diff --git a/public/images/events/valentines2025event-pt-BR.png b/public/images/events/valentines2025event-pt-BR.png new file mode 100644 index 00000000000..45fa40f30fc Binary files /dev/null and b/public/images/events/valentines2025event-pt-BR.png differ diff --git a/public/images/events/valentines2025event-zh-CN.png b/public/images/events/valentines2025event-zh-CN.png new file mode 100644 index 00000000000..13256da720c Binary files /dev/null and b/public/images/events/valentines2025event-zh-CN.png differ diff --git a/public/images/pokemon/335.json b/public/images/pokemon/335.json index 0279e0fba5a..a9313fcec5d 100644 --- a/public/images/pokemon/335.json +++ b/public/images/pokemon/335.json @@ -1,1910 +1,547 @@ -{ - "textures": [ - { - "image": "335.png", - "format": "RGBA8888", - "size": { - "w": 366, - "h": 366 - }, - "scale": 1, - "frames": [ - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 68, - "h": 63 - }, - "frame": { - "x": 0, - "y": 0, - "w": 68, - "h": 63 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 68, - "h": 63 - }, - "frame": { - "x": 0, - "y": 0, - "w": 68, - "h": 63 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 68, - "h": 63 - }, - "frame": { - "x": 0, - "y": 0, - "w": 68, - "h": 63 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 68, - "h": 63 - }, - "frame": { - "x": 0, - "y": 0, - "w": 68, - "h": 63 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 65, - "h": 66 - }, - "frame": { - "x": 0, - "y": 63, - "w": 65, - "h": 66 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 67, - "h": 63 - }, - "frame": { - "x": 68, - "y": 0, - "w": 67, - "h": 63 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 67, - "h": 63 - }, - "frame": { - "x": 68, - "y": 0, - "w": 67, - "h": 63 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 68, - "h": 61 - }, - "frame": { - "x": 65, - "y": 63, - "w": 68, - "h": 61 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 68, - "h": 61 - }, - "frame": { - "x": 65, - "y": 63, - "w": 68, - "h": 61 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 68, - "h": 61 - }, - "frame": { - "x": 65, - "y": 63, - "w": 68, - "h": 61 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 68, - "h": 61 - }, - "frame": { - "x": 65, - "y": 63, - "w": 68, - "h": 61 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 64, - "h": 63 - }, - "frame": { - "x": 0, - "y": 129, - "w": 64, - "h": 63 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 64, - "h": 63 - }, - "frame": { - "x": 0, - "y": 129, - "w": 64, - "h": 63 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 64, - "h": 63 - }, - "frame": { - "x": 0, - "y": 129, - "w": 64, - "h": 63 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 64, - "h": 63 - }, - "frame": { - "x": 0, - "y": 129, - "w": 64, - "h": 63 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 61, - "h": 66 - }, - "frame": { - "x": 0, - "y": 192, - "w": 61, - "h": 66 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 61, - "h": 66 - }, - "frame": { - "x": 0, - "y": 258, - "w": 61, - "h": 66 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 61, - "h": 66 - }, - "frame": { - "x": 0, - "y": 258, - "w": 61, - "h": 66 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 64, - "h": 62 - }, - "frame": { - "x": 135, - "y": 0, - "w": 64, - "h": 62 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 64, - "h": 62 - }, - "frame": { - "x": 135, - "y": 0, - "w": 64, - "h": 62 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 65, - "h": 61 - }, - "frame": { - "x": 199, - "y": 0, - "w": 65, - "h": 61 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 67, - "h": 58 - }, - "frame": { - "x": 264, - "y": 0, - "w": 67, - "h": 58 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 67, - "h": 58 - }, - "frame": { - "x": 264, - "y": 0, - "w": 67, - "h": 58 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 67, - "h": 58 - }, - "frame": { - "x": 264, - "y": 0, - "w": 67, - "h": 58 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 67, - "h": 58 - }, - "frame": { - "x": 264, - "y": 0, - "w": 67, - "h": 58 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 64, - "h": 59 - }, - "frame": { - "x": 65, - "y": 124, - "w": 64, - "h": 59 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 64, - "h": 59 - }, - "frame": { - "x": 65, - "y": 124, - "w": 64, - "h": 59 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 64, - "h": 59 - }, - "frame": { - "x": 65, - "y": 124, - "w": 64, - "h": 59 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 64, - "h": 59 - }, - "frame": { - "x": 65, - "y": 124, - "w": 64, - "h": 59 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 64, - "h": 61 - }, - "frame": { - "x": 64, - "y": 183, - "w": 64, - "h": 61 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 62, - "h": 65 - }, - "frame": { - "x": 61, - "y": 244, - "w": 62, - "h": 65 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 6, - "y": 9, - "w": 63, - "h": 57 - }, - "frame": { - "x": 61, - "y": 309, - "w": 63, - "h": 57 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 61, - "h": 64 - }, - "frame": { - "x": 123, - "y": 244, - "w": 61, - "h": 64 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 63, - "h": 58 - }, - "frame": { - "x": 124, - "y": 308, - "w": 63, - "h": 58 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 61, - "h": 61 - }, - "frame": { - "x": 128, - "y": 183, - "w": 61, - "h": 61 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 61, - "h": 61 - }, - "frame": { - "x": 128, - "y": 183, - "w": 61, - "h": 61 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 61, - "h": 61 - }, - "frame": { - "x": 128, - "y": 183, - "w": 61, - "h": 61 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 61, - "h": 61 - }, - "frame": { - "x": 128, - "y": 183, - "w": 61, - "h": 61 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 9, - "w": 62, - "h": 57 - }, - "frame": { - "x": 187, - "y": 307, - "w": 62, - "h": 57 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 9, - "w": 62, - "h": 57 - }, - "frame": { - "x": 187, - "y": 307, - "w": 62, - "h": 57 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 62, - "h": 63 - }, - "frame": { - "x": 264, - "y": 58, - "w": 62, - "h": 63 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 55, - "h": 63 - }, - "frame": { - "x": 133, - "y": 63, - "w": 55, - "h": 63 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 55, - "h": 63 - }, - "frame": { - "x": 133, - "y": 63, - "w": 55, - "h": 63 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 55, - "h": 63 - }, - "frame": { - "x": 133, - "y": 63, - "w": 55, - "h": 63 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 55, - "h": 63 - }, - "frame": { - "x": 133, - "y": 63, - "w": 55, - "h": 63 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 55, - "h": 66 - }, - "frame": { - "x": 188, - "y": 62, - "w": 55, - "h": 66 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 55, - "h": 66 - }, - "frame": { - "x": 188, - "y": 62, - "w": 55, - "h": 66 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 58, - "h": 66 - }, - "frame": { - "x": 189, - "y": 128, - "w": 58, - "h": 66 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 60, - "h": 66 - }, - "frame": { - "x": 247, - "y": 121, - "w": 60, - "h": 66 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 59, - "h": 63 - }, - "frame": { - "x": 307, - "y": 121, - "w": 59, - "h": 63 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 59, - "h": 63 - }, - "frame": { - "x": 307, - "y": 121, - "w": 59, - "h": 63 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 59, - "h": 63 - }, - "frame": { - "x": 307, - "y": 121, - "w": 59, - "h": 63 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 59, - "h": 63 - }, - "frame": { - "x": 307, - "y": 121, - "w": 59, - "h": 63 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 247, - "y": 187, - "w": 60, - "h": 63 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 247, - "y": 187, - "w": 60, - "h": 63 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 247, - "y": 187, - "w": 60, - "h": 63 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 247, - "y": 187, - "w": 60, - "h": 63 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 58, - "h": 63 - }, - "frame": { - "x": 307, - "y": 184, - "w": 58, - "h": 63 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 58, - "h": 63 - }, - "frame": { - "x": 307, - "y": 184, - "w": 58, - "h": 63 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 58, - "h": 63 - }, - "frame": { - "x": 307, - "y": 184, - "w": 58, - "h": 63 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 58, - "h": 63 - }, - "frame": { - "x": 307, - "y": 184, - "w": 58, - "h": 63 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 249, - "y": 250, - "w": 60, - "h": 63 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9c4e9647cd30b406386dcfa45795951c:b817a280fcd689ce74ea32e378a31e74:40bb9f4809624b12bf79bbfe664bea73$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0002.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0003.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0004.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0005.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 185, "w": 59, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 7, "w": 59, "h": 59 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0007.png", + "frame": { "x": 119, "y": 182, "w": 62, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 62, "h": 57 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0008.png", + "frame": { "x": 119, "y": 125, "w": 64, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 10, "w": 64, "h": 57 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0009.png", + "frame": { "x": 195, "y": 0, "w": 66, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 66, "h": 60 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0010.png", + "frame": { "x": 129, "y": 0, "w": 66, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 66, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0011.png", + "frame": { "x": 320, "y": 0, "w": 62, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 62, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0012.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 244, "w": 53, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 53, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0014.png", + "frame": { "x": 59, "y": 188, "w": 56, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 56, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0015.png", + "frame": { "x": 306, "y": 187, "w": 57, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 57, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0016.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0017.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0018.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0019.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0020.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 185, "w": 59, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 7, "w": 59, "h": 59 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0022.png", + "frame": { "x": 119, "y": 182, "w": 62, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 62, "h": 57 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0023.png", + "frame": { "x": 119, "y": 125, "w": 64, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 10, "w": 64, "h": 57 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0024.png", + "frame": { "x": 195, "y": 0, "w": 66, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 66, "h": 60 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0025.png", + "frame": { "x": 129, "y": 0, "w": 66, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 66, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0026.png", + "frame": { "x": 320, "y": 0, "w": 62, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 62, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0027.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 244, "w": 53, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 53, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0029.png", + "frame": { "x": 59, "y": 188, "w": 56, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 56, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0030.png", + "frame": { "x": 306, "y": 187, "w": 57, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 57, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0031.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0032.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0033.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0034.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0035.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 185, "w": 59, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 7, "w": 59, "h": 59 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0037.png", + "frame": { "x": 119, "y": 182, "w": 62, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 62, "h": 57 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0038.png", + "frame": { "x": 119, "y": 125, "w": 64, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 10, "w": 64, "h": 57 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0039.png", + "frame": { "x": 195, "y": 0, "w": 66, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 66, "h": 60 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0040.png", + "frame": { "x": 129, "y": 0, "w": 66, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 66, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0041.png", + "frame": { "x": 320, "y": 0, "w": 62, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 62, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0042.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 244, "w": 53, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 53, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0044.png", + "frame": { "x": 59, "y": 188, "w": 56, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 56, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0045.png", + "frame": { "x": 306, "y": 187, "w": 57, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 57, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0046.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0047.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0048.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0049.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0050.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0051.png", + "frame": { "x": 248, "y": 129, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0052.png", + "frame": { "x": 188, "y": 123, "w": 60, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 60, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 125, "w": 61, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 61, "h": 60 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 66, "w": 63, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 63, "h": 59 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0055.png", + "frame": { "x": 234, "y": 190, "w": 61, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 61, "h": 56 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0056.png", + "frame": { "x": 234, "y": 246, "w": 60, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 11, "w": 60, "h": 55 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0057.png", + "frame": { "x": 115, "y": 239, "w": 61, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 11, "w": 61, "h": 56 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0058.png", + "frame": { "x": 63, "y": 62, "w": 62, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 62, "h": 60 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0059.png", + "frame": { "x": 63, "y": 0, "w": 66, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 66, "h": 62 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0060.png", + "frame": { "x": 0, "y": 0, "w": 63, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 63, "h": 66 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0061.png", + "frame": { "x": 261, "y": 0, "w": 59, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 59, "h": 66 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0062.png", + "frame": { "x": 181, "y": 184, "w": 53, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 53, "h": 66 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0063.png", + "frame": { "x": 63, "y": 122, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 56, "h": 66 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0064.png", + "frame": { "x": 320, "y": 61, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 58, "h": 65 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0065.png", + "frame": { "x": 129, "y": 61, "w": 59, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 59, "h": 64 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0066.png", + "frame": { "x": 195, "y": 60, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 60, "h": 63 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0067.png", + "frame": { "x": 255, "y": 66, "w": 59, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 63 }, + "sourceSize": { "w": 74, "h": 67 } + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.9.2-x64", + "image": "335.png", + "format": "I8", + "size": { "w": 382, "h": 305 }, + "scale": "1" + } } diff --git a/public/images/pokemon/335.png b/public/images/pokemon/335.png index e5d051dd850..65b56582339 100644 Binary files a/public/images/pokemon/335.png and b/public/images/pokemon/335.png differ diff --git a/public/images/pokemon/668-female.json b/public/images/pokemon/668-female.json deleted file mode 100644 index 13d67c90194..00000000000 --- a/public/images/pokemon/668-female.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "668-female.png", - "format": "RGBA8888", - "size": { - "w": 72, - "h": 72 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 63, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 63, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 63, - "h": 72 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:3f88e039152d4a967a218cb721938610:e6991ce9c3bad348cbc05ebf9b440302:d99ed0e84a0695b54e479aa98271aba1$" - } -} diff --git a/public/images/pokemon/668-female.png b/public/images/pokemon/668-female.png deleted file mode 100644 index c8f4e205491..00000000000 Binary files a/public/images/pokemon/668-female.png and /dev/null differ diff --git a/public/images/pokemon/back/658.json b/public/images/pokemon/back/658.json index 050b63e3592..1d8893e2d5d 100644 --- a/public/images/pokemon/back/658.json +++ b/public/images/pokemon/back/658.json @@ -1,19 +1,19 @@ { "frames": [ { "filename": "0001.png", - "frame": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "frame": { "x": 0, "y": 0, "w": 77, "h": 65 }, "rotated": false, "trimmed": false, - "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, - "sourceSize": { "w": 77, "h": 77 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 65 }, + "sourceSize": { "w": 77, "h": 65 }, "duration": 100 } ], "meta": { "app": "https://www.aseprite.org/", - "version": "1.3.7-x64", + "version": "1.3.9.2-x64", "format": "I8", - "size": { "w": 77, "h": 77 }, + "size": { "w": 77, "h": 65 }, "scale": "1" } } diff --git a/public/images/pokemon/back/658.png b/public/images/pokemon/back/658.png index ea24d9a6336..be286b88666 100644 Binary files a/public/images/pokemon/back/658.png and b/public/images/pokemon/back/658.png differ diff --git a/public/images/pokemon/back/668-female.json b/public/images/pokemon/back/668-female.json deleted file mode 100644 index dc3fc99ba58..00000000000 --- a/public/images/pokemon/back/668-female.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "668-female.png", - "format": "RGBA8888", - "size": { - "w": 74, - "h": 74 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 74, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 74, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 72 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:3b22b1fc8fabd22888048f909287acba:10bec1e42fb1d39868a624d00345818d:d99ed0e84a0695b54e479aa98271aba1$" - } -} diff --git a/public/images/pokemon/back/668-female.png b/public/images/pokemon/back/668-female.png deleted file mode 100644 index 6f28278630a..00000000000 Binary files a/public/images/pokemon/back/668-female.png and /dev/null differ diff --git a/public/images/pokemon/back/shiny/658.json b/public/images/pokemon/back/shiny/658.json index 050b63e3592..867e1d2d3d2 100644 --- a/public/images/pokemon/back/shiny/658.json +++ b/public/images/pokemon/back/shiny/658.json @@ -1,11 +1,11 @@ { "frames": [ { "filename": "0001.png", - "frame": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "frame": { "x": 0, "y": 0, "w": 77, "h": 65 }, "rotated": false, "trimmed": false, - "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, - "sourceSize": { "w": 77, "h": 77 }, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 65 }, + "sourceSize": { "w": 77, "h": 65 }, "duration": 100 } ], @@ -13,7 +13,7 @@ "app": "https://www.aseprite.org/", "version": "1.3.7-x64", "format": "I8", - "size": { "w": 77, "h": 77 }, + "size": { "w": 77, "h": 65 }, "scale": "1" } } diff --git a/public/images/pokemon/back/shiny/658.png b/public/images/pokemon/back/shiny/658.png index 21519b6a145..239aaafb6ce 100644 Binary files a/public/images/pokemon/back/shiny/658.png and b/public/images/pokemon/back/shiny/658.png differ diff --git a/public/images/pokemon/back/shiny/668-female.json b/public/images/pokemon/back/shiny/668-female.json deleted file mode 100644 index 7b4adc1a94d..00000000000 --- a/public/images/pokemon/back/shiny/668-female.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "668-female.png", - "format": "RGBA8888", - "size": { - "w": 74, - "h": 74 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 74, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 74, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 74, - "h": 72 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a3f814ea1f5b062df0ecc4e7c343d89b:769178f31dc2505ae0e67b72b1319828:d99ed0e84a0695b54e479aa98271aba1$" - } -} diff --git a/public/images/pokemon/back/shiny/668-female.png b/public/images/pokemon/back/shiny/668-female.png deleted file mode 100644 index caf8bed99ac..00000000000 Binary files a/public/images/pokemon/back/shiny/668-female.png and /dev/null differ diff --git a/public/images/pokemon/exp/667.json b/public/images/pokemon/exp/667.json index 3667bc80aa0..3fba95afcf9 100644 --- a/public/images/pokemon/exp/667.json +++ b/public/images/pokemon/exp/667.json @@ -1,272 +1,659 @@ -{ - "textures": [ - { - "image": "667.png", - "format": "RGBA8888", - "size": { - "w": 160, - "h": 160 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 40, - "h": 46 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 40, - "h": 46 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 46 - }, - "frame": { - "x": 0, - "y": 46, - "w": 40, - "h": 46 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 46 - }, - "frame": { - "x": 0, - "y": 92, - "w": 40, - "h": 46 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 46 - }, - "frame": { - "x": 40, - "y": 0, - "w": 40, - "h": 46 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 46 - }, - "frame": { - "x": 80, - "y": 0, - "w": 40, - "h": 46 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 45 - }, - "frame": { - "x": 120, - "y": 0, - "w": 40, - "h": 45 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 45 - }, - "frame": { - "x": 120, - "y": 0, - "w": 40, - "h": 45 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 45 - }, - "frame": { - "x": 120, - "y": 45, - "w": 40, - "h": 45 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 45 - }, - "frame": { - "x": 40, - "y": 90, - "w": 40, - "h": 45 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 40, - "h": 44 - }, - "frame": { - "x": 40, - "y": 46, - "w": 40, - "h": 44 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 40, - "h": 44 - }, - "frame": { - "x": 80, - "y": 46, - "w": 40, - "h": 44 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:0c78c1973ebb266716d5a3a4557bca98:3ab4a906b1847f4048e828e5410eae40:02171d511e760c8a3e1b623ad6bf93f5$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 127, "y": 48, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 50, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 39, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 40, "y": 50, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 120, "y": 96, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 38, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 80, "y": 96, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 39, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 40, "y": 96, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 85, "y": 49, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 127, "y": 48, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 50, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 39, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0013.png", + "frame": { "x": 40, "y": 50, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0014.png", + "frame": { "x": 120, "y": 96, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 38, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0015.png", + "frame": { "x": 80, "y": 96, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 39, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0016.png", + "frame": { "x": 40, "y": 96, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0017.png", + "frame": { "x": 85, "y": 49, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0018.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0019.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0020.png", + "frame": { "x": 127, "y": 48, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 50, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 39, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0022.png", + "frame": { "x": 40, "y": 50, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0023.png", + "frame": { "x": 120, "y": 96, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 38, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0024.png", + "frame": { "x": 80, "y": 96, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 39, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0025.png", + "frame": { "x": 40, "y": 96, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0026.png", + "frame": { "x": 85, "y": 49, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0027.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0028.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0029.png", + "frame": { "x": 127, "y": 48, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 50, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 39, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0031.png", + "frame": { "x": 40, "y": 50, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0032.png", + "frame": { "x": 120, "y": 96, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 38, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0033.png", + "frame": { "x": 80, "y": 96, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 39, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0034.png", + "frame": { "x": 40, "y": 96, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0035.png", + "frame": { "x": 85, "y": 49, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0036.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0037.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0038.png", + "frame": { "x": 127, "y": 48, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 50, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 39, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0040.png", + "frame": { "x": 40, "y": 50, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0041.png", + "frame": { "x": 120, "y": 96, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 38, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0042.png", + "frame": { "x": 80, "y": 96, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 39, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0043.png", + "frame": { "x": 40, "y": 96, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0044.png", + "frame": { "x": 85, "y": 49, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0045.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0046.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0047.png", + "frame": { "x": 127, "y": 48, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0048.png", + "frame": { "x": 0, "y": 50, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 39, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0049.png", + "frame": { "x": 40, "y": 50, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0050.png", + "frame": { "x": 120, "y": 96, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 38, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0051.png", + "frame": { "x": 80, "y": 96, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 39, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0052.png", + "frame": { "x": 40, "y": 96, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0053.png", + "frame": { "x": 85, "y": 49, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0054.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0055.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0056.png", + "frame": { "x": 85, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 41, "h": 48 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0058.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0059.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0060.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0061.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0062.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0063.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0064.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0065.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0066.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0067.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0068.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0070.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0071.png", + "frame": { "x": 85, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 41, "h": 48 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0072.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "667.png", + "format": "I8", + "size": { "w": 167, "h": 141 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/667.png b/public/images/pokemon/exp/667.png index 21bbfcc0d68..3ae931300c5 100644 Binary files a/public/images/pokemon/exp/667.png and b/public/images/pokemon/exp/667.png differ diff --git a/public/images/pokemon/exp/668.json b/public/images/pokemon/exp/668.json index 083fdcfb598..63671a548a2 100644 --- a/public/images/pokemon/exp/668.json +++ b/public/images/pokemon/exp/668.json @@ -1,272 +1,821 @@ -{ - "textures": [ - { - "image": "668.png", - "format": "RGBA8888", - "size": { - "w": 205, - "h": 205 - }, - "scale": 1, - "frames": [ - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 70, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 70, - "h": 68 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 70, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 70, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 70, - "h": 69 - }, - "frame": { - "x": 70, - "y": 0, - "w": 70, - "h": 69 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 70, - "h": 69 - }, - "frame": { - "x": 70, - "y": 0, - "w": 70, - "h": 69 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 70, - "h": 69 - }, - "frame": { - "x": 70, - "y": 0, - "w": 70, - "h": 69 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 70, - "h": 69 - }, - "frame": { - "x": 70, - "y": 0, - "w": 70, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 0, - "y": 68, - "w": 67, - "h": 70 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 0, - "y": 68, - "w": 67, - "h": 70 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 67, - "y": 69, - "w": 69, - "h": 70 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 67, - "y": 69, - "w": 69, - "h": 70 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 67, - "y": 69, - "w": 69, - "h": 70 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 136, - "y": 69, - "w": 69, - "h": 70 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a0374d38386b4719d8b0a8fcc11d003d:7a4ba7ff9050ba3dee8c8340200f12c2:947bf84d1af493c62e2cef45bb6c19ad$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 67, "y": 222, "w": 70, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 70, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 295, "w": 68, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 68, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 414, "y": 297, "w": 67, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 67, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 196, "y": 367, "w": 65, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 65, "h": 71 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 414, "y": 369, "w": 62, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 62, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 320, "y": 372, "w": 60, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 60, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 380, "y": 441, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 196, "y": 438, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 61, "y": 370, "w": 60, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 60, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 350, "y": 296, "w": 64, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 64, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 151, "w": 67, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 67, "h": 77 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 283, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 434, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 214, "y": 149, "w": 69, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 69, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 282, "y": 225, "w": 68, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 68, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 67, "y": 222, "w": 70, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 70, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 295, "w": 68, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 68, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 414, "y": 297, "w": 67, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 67, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 196, "y": 367, "w": 65, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 65, "h": 71 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 414, "y": 369, "w": 62, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 62, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 320, "y": 372, "w": 60, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 60, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 380, "y": 441, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 196, "y": 438, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 61, "y": 370, "w": 60, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 60, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 350, "y": 296, "w": 64, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 64, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 151, "w": 67, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 67, "h": 77 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 283, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 434, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 214, "y": 149, "w": 69, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 69, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 282, "y": 225, "w": 68, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 68, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 67, "y": 222, "w": 70, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 70, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 295, "w": 68, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 68, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 414, "y": 297, "w": 67, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 67, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 196, "y": 367, "w": 65, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 65, "h": 71 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 414, "y": 369, "w": 62, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 62, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 320, "y": 372, "w": 60, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 60, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 380, "y": 441, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 196, "y": 438, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 61, "y": 370, "w": 60, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 60, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 350, "y": 296, "w": 64, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 64, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 151, "w": 67, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 67, "h": 77 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 283, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 434, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 214, "y": 149, "w": 69, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 69, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 282, "y": 225, "w": 68, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 68, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 67, "y": 222, "w": 70, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 70, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 295, "w": 68, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 68, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 414, "y": 297, "w": 67, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 67, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 196, "y": 367, "w": 65, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 65, "h": 71 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 414, "y": 369, "w": 62, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 62, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 320, "y": 372, "w": 60, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 60, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 380, "y": 441, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 196, "y": 438, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 61, "y": 370, "w": 60, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 60, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 350, "y": 296, "w": 64, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 64, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 151, "w": 67, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 67, "h": 77 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 283, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 434, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 214, "y": 149, "w": 69, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 69, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 282, "y": 225, "w": 68, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 68, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 351, "y": 151, "w": 70, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 70, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 142, "y": 221, "w": 70, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 70, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 351, "y": 224, "w": 70, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 70, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 421, "y": 225, "w": 69, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 69, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 205, "y": 296, "w": 69, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 69, "h": 71 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 212, "y": 224, "w": 70, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 70, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 137, "y": 294, "w": 68, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 68, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 274, "y": 299, "w": 64, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 64, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 368, "w": 61, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 61, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 442, "w": 55, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 55, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 438, "y": 441, "w": 55, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 55, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 261, "y": 372, "w": 59, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 134, "y": 367, "w": 62, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 62, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 68, "y": 295, "w": 66, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 66, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 365, "y": 75, "w": 69, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 69, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 0, "y": 75, "w": 71, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 71, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 442, "y": 74, "w": 72, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 72, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 221, "y": 74, "w": 72, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 72, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 369, "y": 0, "w": 73, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 73, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 296, "y": 0, "w": 73, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 73, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 74, "y": 0, "w": 74, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 74, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 0, "y": 0, "w": 74, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 74, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 148, "y": 0, "w": 74, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 74, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 148, "y": 74, "w": 73, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 73, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 222, "y": 0, "w": 74, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 74, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 442, "y": 0, "w": 73, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 73, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 293, "y": 75, "w": 72, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 72, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 71, "y": 75, "w": 72, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 72, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 71, "y": 149, "w": 71, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 71, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 143, "y": 148, "w": 71, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 71, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "668.png", + "format": "I8", + "size": { "w": 515, "h": 516 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/668.png b/public/images/pokemon/exp/668.png index 36acb70a20f..85be1a55032 100644 Binary files a/public/images/pokemon/exp/668.png and b/public/images/pokemon/exp/668.png differ diff --git a/public/images/pokemon/exp/back/667.json b/public/images/pokemon/exp/back/667.json index cfe6b109d70..db9918ea230 100644 --- a/public/images/pokemon/exp/back/667.json +++ b/public/images/pokemon/exp/back/667.json @@ -1,125 +1,659 @@ -{ - "textures": [ - { - "image": "667.png", - "format": "RGBA8888", - "size": { - "w": 115, - "h": 115 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 39, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 42 - }, - "frame": { - "x": 0, - "y": 0, - "w": 39, - "h": 42 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 39, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 39, - "h": 42 - }, - "frame": { - "x": 0, - "y": 42, - "w": 39, - "h": 42 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 39, - "h": 42 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 39, - "h": 41 - }, - "frame": { - "x": 39, - "y": 0, - "w": 39, - "h": 41 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 39, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 42 - }, - "frame": { - "x": 39, - "y": 41, - "w": 38, - "h": 42 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 39, - "h": 42 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 38, - "h": 42 - }, - "frame": { - "x": 77, - "y": 41, - "w": 38, - "h": 42 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:0515d906bdf1ec3ad533ac13c4e701ec:195a93073ecc7446c747c2e79ae07d54:02171d511e760c8a3e1b623ad6bf93f5$" - } -} \ No newline at end of file +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 127, "y": 47, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 85, "y": 48, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 40, "y": 94, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 38, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 79, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 118, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 40, "y": 49, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 39, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 49, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 127, "y": 47, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 85, "y": 48, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0013.png", + "frame": { "x": 40, "y": 94, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 38, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0014.png", + "frame": { "x": 79, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0015.png", + "frame": { "x": 118, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0016.png", + "frame": { "x": 40, "y": 49, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 39, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 49, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0018.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0019.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0020.png", + "frame": { "x": 127, "y": 47, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0021.png", + "frame": { "x": 85, "y": 48, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0022.png", + "frame": { "x": 40, "y": 94, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 38, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0023.png", + "frame": { "x": 79, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0024.png", + "frame": { "x": 118, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0025.png", + "frame": { "x": 40, "y": 49, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 39, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 49, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0027.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0028.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0029.png", + "frame": { "x": 127, "y": 47, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0030.png", + "frame": { "x": 85, "y": 48, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0031.png", + "frame": { "x": 40, "y": 94, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 38, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0032.png", + "frame": { "x": 79, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0033.png", + "frame": { "x": 118, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0034.png", + "frame": { "x": 40, "y": 49, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 39, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 49, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0036.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0037.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0038.png", + "frame": { "x": 127, "y": 47, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0039.png", + "frame": { "x": 85, "y": 48, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0040.png", + "frame": { "x": 40, "y": 94, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 38, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0041.png", + "frame": { "x": 79, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0042.png", + "frame": { "x": 118, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0043.png", + "frame": { "x": 40, "y": 49, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 39, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0044.png", + "frame": { "x": 0, "y": 49, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0045.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0046.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0047.png", + "frame": { "x": 127, "y": 47, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0048.png", + "frame": { "x": 85, "y": 48, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0049.png", + "frame": { "x": 40, "y": 94, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 38, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0050.png", + "frame": { "x": 79, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0051.png", + "frame": { "x": 118, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0052.png", + "frame": { "x": 40, "y": 49, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 39, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 49, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0054.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0055.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0056.png", + "frame": { "x": 85, "y": 0, "w": 41, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 41, "h": 47 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0058.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0059.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0060.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0061.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0062.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0063.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0064.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0065.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0066.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0067.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0068.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0070.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0071.png", + "frame": { "x": 85, "y": 0, "w": 41, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 41, "h": 47 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0072.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "667.png", + "format": "I8", + "size": { "w": 167, "h": 138 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/back/667.png b/public/images/pokemon/exp/back/667.png index ef7ea964737..f1209cf8e20 100644 Binary files a/public/images/pokemon/exp/back/667.png and b/public/images/pokemon/exp/back/667.png differ diff --git a/public/images/pokemon/exp/back/668.json b/public/images/pokemon/exp/back/668.json index 1e37573828e..594e69189dc 100644 --- a/public/images/pokemon/exp/back/668.json +++ b/public/images/pokemon/exp/back/668.json @@ -1,146 +1,821 @@ -{ - "textures": [ - { - "image": "668.png", - "format": "RGBA8888", - "size": { - "w": 146, - "h": 146 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 73, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 73, - "h": 61 - }, - "frame": { - "x": 0, - "y": 0, - "w": 73, - "h": 61 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 73, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 73, - "h": 61 - }, - "frame": { - "x": 73, - "y": 0, - "w": 73, - "h": 61 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 73, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 73, - "h": 61 - }, - "frame": { - "x": 73, - "y": 0, - "w": 73, - "h": 61 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 73, - "h": 60 - }, - "frame": { - "x": 0, - "y": 61, - "w": 73, - "h": 60 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 73, - "h": 60 - }, - "frame": { - "x": 0, - "y": 61, - "w": 73, - "h": 60 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 61 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 72, - "h": 59 - }, - "frame": { - "x": 73, - "y": 61, - "w": 72, - "h": 59 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:bc67ee0b37e5c8a13762178a52fad862:1ee199920770bc5797feb94424ff9f9a:947bf84d1af493c62e2cef45bb6c19ad$" - } -} \ No newline at end of file +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 152, "y": 292, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 303, "y": 221, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 383, "y": 147, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 233, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 459, "y": 147, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 315, "y": 0, "w": 76, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 76, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 387, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 392, "y": 0, "w": 75, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 75, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 237, "y": 0, "w": 77, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 77, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 0, "w": 78, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 78, "h": 74 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 79, "y": 0, "w": 78, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 158, "y": 0, "w": 78, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 75, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 458, "y": 220, "w": 75, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 75, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 150, "y": 364, "w": 73, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 73, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 152, "y": 292, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 303, "y": 221, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 383, "y": 147, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 233, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 459, "y": 147, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 315, "y": 0, "w": 76, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 76, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 387, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 392, "y": 0, "w": 75, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 75, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 237, "y": 0, "w": 77, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 77, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 0, "w": 78, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 78, "h": 74 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 79, "y": 0, "w": 78, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 158, "y": 0, "w": 78, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 75, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 458, "y": 220, "w": 75, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 75, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 150, "y": 364, "w": 73, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 73, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 152, "y": 292, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 303, "y": 221, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 383, "y": 147, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 233, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 459, "y": 147, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 315, "y": 0, "w": 76, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 76, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 387, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 392, "y": 0, "w": 75, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 75, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 237, "y": 0, "w": 77, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 77, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 0, "w": 78, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 78, "h": 74 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 79, "y": 0, "w": 78, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 158, "y": 0, "w": 78, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 75, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 458, "y": 220, "w": 75, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 75, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 150, "y": 364, "w": 73, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 73, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 152, "y": 292, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 303, "y": 221, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 383, "y": 147, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 233, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 459, "y": 147, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 315, "y": 0, "w": 76, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 76, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 387, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 392, "y": 0, "w": 75, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 75, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 237, "y": 0, "w": 77, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 77, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 0, "w": 78, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 78, "h": 74 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 79, "y": 0, "w": 78, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 158, "y": 0, "w": 78, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 75, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 458, "y": 220, "w": 75, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 75, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 150, "y": 364, "w": 73, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 73, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 152, "y": 292, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 458, "y": 292, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 303, "y": 364, "w": 74, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 74, "h": 70 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 227, "y": 294, "w": 75, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 75, "h": 70 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 378, "y": 364, "w": 75, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 75, "h": 69 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 303, "y": 293, "w": 75, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 75, "h": 70 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 379, "y": 293, "w": 75, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 75, "h": 70 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 454, "y": 364, "w": 72, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 72, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 70, "y": 365, "w": 68, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 68, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 291, "y": 435, "w": 62, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 2, "w": 62, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 378, "y": 434, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 2, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 224, "y": 365, "w": 66, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 66, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 0, "y": 365, "w": 69, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 69, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 229, "y": 220, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 73, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 468, "y": 0, "w": 75, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 75, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 308, "y": 147, "w": 74, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 74, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 0, "y": 148, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 383, "y": 220, "w": 74, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 74, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 231, "y": 147, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 79, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 156, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 310, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 464, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 77, "y": 147, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 154, "y": 147, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 76, "y": 220, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 152, "y": 220, "w": 76, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 76, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 0, "y": 221, "w": 75, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 75, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 0, "y": 293, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 75, "y": 293, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "668.png", + "format": "I8", + "size": { "w": 543, "h": 507 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/back/668.png b/public/images/pokemon/exp/back/668.png index a8384e5cf3c..e600e3e40e1 100644 Binary files a/public/images/pokemon/exp/back/668.png and b/public/images/pokemon/exp/back/668.png differ diff --git a/public/images/pokemon/exp/back/female/6215.json b/public/images/pokemon/exp/back/female/6215.json new file mode 100644 index 00000000000..4f58734d55e --- /dev/null +++ b/public/images/pokemon/exp/back/female/6215.json @@ -0,0 +1,1028 @@ +{ + "textures": [ + { + "image": "6215.png", + "format": "RGBA8888", + "size": { + "w": 155, + "h": 155 + }, + "scale": 1, + "frames": [ + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 54, + "h": 44 + }, + "frame": { + "x": 0, + "y": 49, + "w": 54, + "h": 44 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 54, + "h": 44 + }, + "frame": { + "x": 0, + "y": 49, + "w": 54, + "h": 44 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 54, + "h": 44 + }, + "frame": { + "x": 0, + "y": 49, + "w": 54, + "h": 44 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 54, + "h": 44 + }, + "frame": { + "x": 0, + "y": 49, + "w": 54, + "h": 44 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 51, + "h": 50 + }, + "frame": { + "x": 104, + "y": 93, + "w": 51, + "h": 50 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 51, + "h": 50 + }, + "frame": { + "x": 104, + "y": 93, + "w": 51, + "h": 50 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 51, + "h": 50 + }, + "frame": { + "x": 104, + "y": 93, + "w": 51, + "h": 50 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 51, + "h": 50 + }, + "frame": { + "x": 104, + "y": 93, + "w": 51, + "h": 50 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:29aeff74e785c73ae2261d8bb0459111:5709d3d72351f1424de632ebf8347c01:736cd88647e79ba7896fc74f9406c2fe$" + } +} diff --git a/public/images/pokemon/exp/back/female/6215.png b/public/images/pokemon/exp/back/female/6215.png new file mode 100644 index 00000000000..7dbdab7eb85 Binary files /dev/null and b/public/images/pokemon/exp/back/female/6215.png differ diff --git a/public/images/pokemon/exp/back/female/668.json b/public/images/pokemon/exp/back/female/668.json new file mode 100644 index 00000000000..4c493f84959 --- /dev/null +++ b/public/images/pokemon/exp/back/female/668.json @@ -0,0 +1,821 @@ +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 475, "y": 144, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 76, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 152, "y": 283, "w": 75, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 73, "y": 284, "w": 74, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 5, "w": 74, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 460, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 227, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 385, "y": 284, "w": 75, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 75, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 472, "y": 283, "w": 77, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 77, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 233, "y": 282, "w": 77, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 77, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 396, "y": 215, "w": 76, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 399, "y": 144, "w": 76, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 76, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 431, "y": 73, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 242, "y": 142, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 156, "y": 213, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 475, "y": 144, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 76, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 152, "y": 283, "w": 75, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 73, "y": 284, "w": 74, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 5, "w": 74, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 460, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 227, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 385, "y": 284, "w": 75, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 75, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 472, "y": 283, "w": 77, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 77, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 233, "y": 282, "w": 77, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 77, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 396, "y": 215, "w": 76, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 399, "y": 144, "w": 76, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 76, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 431, "y": 73, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 242, "y": 142, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 156, "y": 213, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 475, "y": 144, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 76, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 152, "y": 283, "w": 75, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 73, "y": 284, "w": 74, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 5, "w": 74, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 460, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 227, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 385, "y": 284, "w": 75, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 75, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 472, "y": 283, "w": 77, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 77, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 233, "y": 282, "w": 77, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 77, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 396, "y": 215, "w": 76, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 399, "y": 144, "w": 76, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 76, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 431, "y": 73, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 242, "y": 142, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 156, "y": 213, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 475, "y": 144, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 76, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 152, "y": 283, "w": 75, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 73, "y": 284, "w": 74, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 5, "w": 74, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 460, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 227, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 385, "y": 284, "w": 75, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 75, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 472, "y": 283, "w": 77, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 77, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 233, "y": 282, "w": 77, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 77, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 396, "y": 215, "w": 76, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 399, "y": 144, "w": 76, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 76, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 431, "y": 73, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 242, "y": 142, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 156, "y": 213, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 475, "y": 144, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 0, "y": 144, "w": 78, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 78, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 233, "y": 213, "w": 78, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 4, "w": 78, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 156, "y": 144, "w": 79, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 4, "w": 79, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 319, "y": 144, "w": 80, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 80, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 242, "y": 73, "w": 80, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 80, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 310, "y": 282, "w": 75, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 534, "y": 350, "w": 71, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 4, "w": 71, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 301, "y": 351, "w": 67, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 3, "w": 67, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 353, "w": 63, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 3, "w": 63, "h": 75 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 204, "y": 417, "w": 63, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 2, "w": 63, "h": 75 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 139, "y": 352, "w": 65, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 3, "w": 65, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 73, "y": 352, "w": 66, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 3, "w": 66, "h": 72 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 368, "y": 351, "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 69, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 0, "y": 284, "w": 73, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 4, "w": 73, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 475, "y": 214, "w": 76, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 319, "y": 212, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 82, "y": 73, "w": 80, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 80, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 519, "y": 72, "w": 83, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 83, "h": 72 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 434, "y": 0, "w": 85, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 85, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 261, "y": 0, "w": 86, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 86, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 174, "y": 0, "w": 87, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 87, "y": 0, "w": 87, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 87, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 0, "y": 0, "w": 87, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 87, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 347, "y": 0, "w": 87, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 87, "h": 72 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 519, "y": 0, "w": 85, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 85, "h": 72 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 347, "y": 72, "w": 84, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 84, "h": 72 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 0, "y": 73, "w": 82, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 82, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 162, "y": 73, "w": 80, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 80, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 78, "y": 144, "w": 78, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 78, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "668-female.png", + "format": "I8", + "size": { "w": 605, "h": 492 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/back/female/668.png b/public/images/pokemon/exp/back/female/668.png new file mode 100644 index 00000000000..e5b5ed2494e Binary files /dev/null and b/public/images/pokemon/exp/back/female/668.png differ diff --git a/public/images/pokemon/exp/back/shiny/667.json b/public/images/pokemon/exp/back/shiny/667.json index cf561f26e4f..db9918ea230 100644 --- a/public/images/pokemon/exp/back/shiny/667.json +++ b/public/images/pokemon/exp/back/shiny/667.json @@ -1,1532 +1,659 @@ -{ - "textures": [ - { - "image": "667.png", - "format": "RGBA8888", - "size": { - "w": 160, - "h": 160 - }, - "scale": 1, - "frames": [ - { - "filename": "0056.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 43, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 43, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 43, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 43, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 43, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 43, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 43, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 86, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 86, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 86, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 86, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 86, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 86, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 43, - "h": 48 - }, - "frame": { - "x": 86, - "y": 0, - "w": 43, - "h": 48 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 41, - "h": 47 - }, - "frame": { - "x": 0, - "y": 48, - "w": 41, - "h": 47 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 41, - "h": 47 - }, - "frame": { - "x": 0, - "y": 48, - "w": 41, - "h": 47 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 41, - "h": 47 - }, - "frame": { - "x": 0, - "y": 48, - "w": 41, - "h": 47 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 41, - "h": 47 - }, - "frame": { - "x": 0, - "y": 48, - "w": 41, - "h": 47 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 41, - "h": 47 - }, - "frame": { - "x": 0, - "y": 48, - "w": 41, - "h": 47 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 41, - "h": 47 - }, - "frame": { - "x": 0, - "y": 48, - "w": 41, - "h": 47 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 41, - "h": 47 - }, - "frame": { - "x": 0, - "y": 48, - "w": 41, - "h": 47 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 41, - "h": 47 - }, - "frame": { - "x": 0, - "y": 48, - "w": 41, - "h": 47 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 41, - "h": 47 - }, - "frame": { - "x": 0, - "y": 48, - "w": 41, - "h": 47 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 41, - "h": 47 - }, - "frame": { - "x": 0, - "y": 48, - "w": 41, - "h": 47 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 41, - "h": 47 - }, - "frame": { - "x": 0, - "y": 48, - "w": 41, - "h": 47 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 41, - "h": 47 - }, - "frame": { - "x": 0, - "y": 48, - "w": 41, - "h": 47 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 41, - "h": 47 - }, - "frame": { - "x": 0, - "y": 48, - "w": 41, - "h": 47 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 2, - "y": 1, - "w": 41, - "h": 47 - }, - "frame": { - "x": 0, - "y": 48, - "w": 41, - "h": 47 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 40, - "h": 47 - }, - "frame": { - "x": 41, - "y": 48, - "w": 40, - "h": 47 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 40, - "h": 47 - }, - "frame": { - "x": 41, - "y": 48, - "w": 40, - "h": 47 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 40, - "h": 47 - }, - "frame": { - "x": 41, - "y": 48, - "w": 40, - "h": 47 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 40, - "h": 47 - }, - "frame": { - "x": 41, - "y": 48, - "w": 40, - "h": 47 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 40, - "h": 47 - }, - "frame": { - "x": 41, - "y": 48, - "w": 40, - "h": 47 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 40, - "h": 47 - }, - "frame": { - "x": 41, - "y": 48, - "w": 40, - "h": 47 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 40, - "h": 46 - }, - "frame": { - "x": 81, - "y": 48, - "w": 40, - "h": 46 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 40, - "h": 46 - }, - "frame": { - "x": 81, - "y": 48, - "w": 40, - "h": 46 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 40, - "h": 46 - }, - "frame": { - "x": 81, - "y": 48, - "w": 40, - "h": 46 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 40, - "h": 46 - }, - "frame": { - "x": 81, - "y": 48, - "w": 40, - "h": 46 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 40, - "h": 46 - }, - "frame": { - "x": 81, - "y": 48, - "w": 40, - "h": 46 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 40, - "h": 46 - }, - "frame": { - "x": 81, - "y": 48, - "w": 40, - "h": 46 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 40, - "h": 46 - }, - "frame": { - "x": 81, - "y": 94, - "w": 40, - "h": 46 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 40, - "h": 46 - }, - "frame": { - "x": 81, - "y": 94, - "w": 40, - "h": 46 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 40, - "h": 46 - }, - "frame": { - "x": 81, - "y": 94, - "w": 40, - "h": 46 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 40, - "h": 46 - }, - "frame": { - "x": 81, - "y": 94, - "w": 40, - "h": 46 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 40, - "h": 46 - }, - "frame": { - "x": 81, - "y": 94, - "w": 40, - "h": 46 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 40, - "h": 46 - }, - "frame": { - "x": 81, - "y": 94, - "w": 40, - "h": 46 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 40, - "h": 45 - }, - "frame": { - "x": 0, - "y": 95, - "w": 40, - "h": 45 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 40, - "h": 45 - }, - "frame": { - "x": 0, - "y": 95, - "w": 40, - "h": 45 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 40, - "h": 45 - }, - "frame": { - "x": 0, - "y": 95, - "w": 40, - "h": 45 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 40, - "h": 45 - }, - "frame": { - "x": 0, - "y": 95, - "w": 40, - "h": 45 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 40, - "h": 45 - }, - "frame": { - "x": 0, - "y": 95, - "w": 40, - "h": 45 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 3, - "y": 3, - "w": 40, - "h": 45 - }, - "frame": { - "x": 0, - "y": 95, - "w": 40, - "h": 45 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 39, - "h": 45 - }, - "frame": { - "x": 40, - "y": 95, - "w": 39, - "h": 45 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 39, - "h": 45 - }, - "frame": { - "x": 40, - "y": 95, - "w": 39, - "h": 45 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 39, - "h": 45 - }, - "frame": { - "x": 40, - "y": 95, - "w": 39, - "h": 45 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 39, - "h": 45 - }, - "frame": { - "x": 40, - "y": 95, - "w": 39, - "h": 45 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 39, - "h": 45 - }, - "frame": { - "x": 40, - "y": 95, - "w": 39, - "h": 45 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 39, - "h": 45 - }, - "frame": { - "x": 40, - "y": 95, - "w": 39, - "h": 45 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 121, - "y": 48, - "w": 39, - "h": 44 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 121, - "y": 48, - "w": 39, - "h": 44 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 121, - "y": 48, - "w": 39, - "h": 44 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 121, - "y": 48, - "w": 39, - "h": 44 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 121, - "y": 48, - "w": 39, - "h": 44 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 121, - "y": 48, - "w": 39, - "h": 44 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 121, - "y": 92, - "w": 39, - "h": 44 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 121, - "y": 92, - "w": 39, - "h": 44 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 121, - "y": 92, - "w": 39, - "h": 44 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 121, - "y": 92, - "w": 39, - "h": 44 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 121, - "y": 92, - "w": 39, - "h": 44 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 43, - "h": 48 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 39, - "h": 44 - }, - "frame": { - "x": 121, - "y": 92, - "w": 39, - "h": 44 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4fbaee798794f5f6bc216941c6d420d9:a27205da0cc7ce20d4a4422df81b9109:02171d511e760c8a3e1b623ad6bf93f5$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 127, "y": 47, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 85, "y": 48, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 40, "y": 94, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 38, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 79, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 118, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 40, "y": 49, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 39, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 49, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 127, "y": 47, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 85, "y": 48, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0013.png", + "frame": { "x": 40, "y": 94, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 38, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0014.png", + "frame": { "x": 79, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0015.png", + "frame": { "x": 118, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0016.png", + "frame": { "x": 40, "y": 49, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 39, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 49, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0018.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0019.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0020.png", + "frame": { "x": 127, "y": 47, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0021.png", + "frame": { "x": 85, "y": 48, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0022.png", + "frame": { "x": 40, "y": 94, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 38, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0023.png", + "frame": { "x": 79, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0024.png", + "frame": { "x": 118, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0025.png", + "frame": { "x": 40, "y": 49, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 39, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 49, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0027.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0028.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0029.png", + "frame": { "x": 127, "y": 47, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0030.png", + "frame": { "x": 85, "y": 48, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0031.png", + "frame": { "x": 40, "y": 94, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 38, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0032.png", + "frame": { "x": 79, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0033.png", + "frame": { "x": 118, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0034.png", + "frame": { "x": 40, "y": 49, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 39, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0035.png", + "frame": { "x": 0, "y": 49, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0036.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0037.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0038.png", + "frame": { "x": 127, "y": 47, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0039.png", + "frame": { "x": 85, "y": 48, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0040.png", + "frame": { "x": 40, "y": 94, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 38, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0041.png", + "frame": { "x": 79, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0042.png", + "frame": { "x": 118, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0043.png", + "frame": { "x": 40, "y": 49, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 39, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0044.png", + "frame": { "x": 0, "y": 49, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0045.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0046.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0047.png", + "frame": { "x": 127, "y": 47, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 39, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0048.png", + "frame": { "x": 85, "y": 48, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0049.png", + "frame": { "x": 40, "y": 94, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 38, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0050.png", + "frame": { "x": 79, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0051.png", + "frame": { "x": 118, "y": 94, "w": 38, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 38, "h": 43 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0052.png", + "frame": { "x": 40, "y": 49, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 39, "h": 44 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 49, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 39, "h": 45 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0054.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0055.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0056.png", + "frame": { "x": 85, "y": 0, "w": 41, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 41, "h": 47 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0058.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0059.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0060.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0061.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0062.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0063.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0064.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0065.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0066.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0067.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0068.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0070.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 41, "h": 48 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0071.png", + "frame": { "x": 85, "y": 0, "w": 41, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 41, "h": 47 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + }, + { + "filename": "0072.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 40, "h": 46 }, + "sourceSize": { "w": 43, "h": 48 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "667.png", + "format": "I8", + "size": { "w": 167, "h": 138 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/667.png b/public/images/pokemon/exp/back/shiny/667.png index eb8b7eb756f..d44bed5ee65 100644 Binary files a/public/images/pokemon/exp/back/shiny/667.png and b/public/images/pokemon/exp/back/shiny/667.png differ diff --git a/public/images/pokemon/exp/back/shiny/668.json b/public/images/pokemon/exp/back/shiny/668.json index cd1665c7fe7..594e69189dc 100644 --- a/public/images/pokemon/exp/back/shiny/668.json +++ b/public/images/pokemon/exp/back/shiny/668.json @@ -1,146 +1,821 @@ -{ - "textures": [ - { - "image": "668.png", - "format": "RGBA8888", - "size": { - "w": 146, - "h": 146 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 73, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 73, - "h": 61 - }, - "frame": { - "x": 0, - "y": 0, - "w": 73, - "h": 61 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 73, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 73, - "h": 61 - }, - "frame": { - "x": 73, - "y": 0, - "w": 73, - "h": 61 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 73, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 73, - "h": 61 - }, - "frame": { - "x": 73, - "y": 0, - "w": 73, - "h": 61 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 73, - "h": 60 - }, - "frame": { - "x": 0, - "y": 61, - "w": 73, - "h": 60 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 61 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 73, - "h": 60 - }, - "frame": { - "x": 0, - "y": 61, - "w": 73, - "h": 60 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 61 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 72, - "h": 59 - }, - "frame": { - "x": 73, - "y": 61, - "w": 72, - "h": 59 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:0e20693ecfc704a58db8c8592fcdc9cc:659468d84f3cc98068a3454a7c68f1e4:947bf84d1af493c62e2cef45bb6c19ad$" - } -} \ No newline at end of file +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 152, "y": 292, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 303, "y": 221, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 383, "y": 147, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 233, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 459, "y": 147, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 315, "y": 0, "w": 76, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 76, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 387, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 392, "y": 0, "w": 75, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 75, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 237, "y": 0, "w": 77, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 77, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 0, "w": 78, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 78, "h": 74 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 79, "y": 0, "w": 78, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 158, "y": 0, "w": 78, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 75, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 458, "y": 220, "w": 75, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 75, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 150, "y": 364, "w": 73, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 73, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 152, "y": 292, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 303, "y": 221, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 383, "y": 147, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 233, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 459, "y": 147, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 315, "y": 0, "w": 76, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 76, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 387, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 392, "y": 0, "w": 75, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 75, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 237, "y": 0, "w": 77, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 77, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 0, "w": 78, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 78, "h": 74 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 79, "y": 0, "w": 78, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 158, "y": 0, "w": 78, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 75, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 458, "y": 220, "w": 75, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 75, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 150, "y": 364, "w": 73, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 73, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 152, "y": 292, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 303, "y": 221, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 383, "y": 147, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 233, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 459, "y": 147, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 315, "y": 0, "w": 76, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 76, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 387, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 392, "y": 0, "w": 75, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 75, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 237, "y": 0, "w": 77, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 77, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 0, "w": 78, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 78, "h": 74 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 79, "y": 0, "w": 78, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 158, "y": 0, "w": 78, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 75, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 458, "y": 220, "w": 75, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 75, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 150, "y": 364, "w": 73, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 73, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 152, "y": 292, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 303, "y": 221, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 383, "y": 147, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 233, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 459, "y": 147, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 315, "y": 0, "w": 76, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 76, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 387, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 392, "y": 0, "w": 75, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 75, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 237, "y": 0, "w": 77, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 77, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 0, "w": 78, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 78, "h": 74 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 79, "y": 0, "w": 78, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 158, "y": 0, "w": 78, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 78, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 75, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 458, "y": 220, "w": 75, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 75, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 150, "y": 364, "w": 73, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 73, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 152, "y": 292, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 458, "y": 292, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 303, "y": 364, "w": 74, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 74, "h": 70 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 227, "y": 294, "w": 75, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 75, "h": 70 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 378, "y": 364, "w": 75, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 75, "h": 69 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 303, "y": 293, "w": 75, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 75, "h": 70 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 379, "y": 293, "w": 75, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 75, "h": 70 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 454, "y": 364, "w": 72, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 72, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 70, "y": 365, "w": 68, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 68, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 291, "y": 435, "w": 62, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 2, "w": 62, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 378, "y": 434, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 2, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 224, "y": 365, "w": 66, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 66, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 0, "y": 365, "w": 69, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 69, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 229, "y": 220, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 73, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 468, "y": 0, "w": 75, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 75, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 308, "y": 147, "w": 74, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 74, "h": 73 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 0, "y": 148, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 383, "y": 220, "w": 74, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 74, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 231, "y": 147, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 79, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 156, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 310, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 464, "y": 74, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 77, "y": 147, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 154, "y": 147, "w": 76, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 76, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 76, "y": 220, "w": 75, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 75, "h": 72 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 152, "y": 220, "w": 76, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 76, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 0, "y": 221, "w": 75, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 3, "w": 75, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 0, "y": 293, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 75, "y": 293, "w": 74, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 74, "h": 71 }, + "sourceSize": { "w": 80, "h": 74 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "668.png", + "format": "I8", + "size": { "w": 543, "h": 507 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/back/shiny/668.png b/public/images/pokemon/exp/back/shiny/668.png index e2fa147e7fd..0ece333f235 100644 Binary files a/public/images/pokemon/exp/back/shiny/668.png and b/public/images/pokemon/exp/back/shiny/668.png differ diff --git a/public/images/pokemon/exp/back/shiny/female/6215.json b/public/images/pokemon/exp/back/shiny/female/6215.json new file mode 100644 index 00000000000..07510ceaa55 --- /dev/null +++ b/public/images/pokemon/exp/back/shiny/female/6215.json @@ -0,0 +1,1028 @@ +{ + "textures": [ + { + "image": "6215.png", + "format": "RGBA8888", + "size": { + "w": 155, + "h": 155 + }, + "scale": 1, + "frames": [ + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 49 + }, + "frame": { + "x": 0, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 54, + "h": 47 + }, + "frame": { + "x": 54, + "y": 0, + "w": 54, + "h": 47 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 54, + "h": 46 + }, + "frame": { + "x": 54, + "y": 47, + "w": 54, + "h": 46 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 54, + "h": 44 + }, + "frame": { + "x": 0, + "y": 49, + "w": 54, + "h": 44 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 54, + "h": 44 + }, + "frame": { + "x": 0, + "y": 49, + "w": 54, + "h": 44 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 54, + "h": 44 + }, + "frame": { + "x": 0, + "y": 49, + "w": 54, + "h": 44 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 54, + "h": 44 + }, + "frame": { + "x": 0, + "y": 49, + "w": 54, + "h": 44 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 0, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 50 + }, + "frame": { + "x": 52, + "y": 93, + "w": 52, + "h": 50 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 51, + "h": 50 + }, + "frame": { + "x": 104, + "y": 93, + "w": 51, + "h": 50 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 51, + "h": 50 + }, + "frame": { + "x": 104, + "y": 93, + "w": 51, + "h": 50 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 51, + "h": 50 + }, + "frame": { + "x": 104, + "y": 93, + "w": 51, + "h": 50 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 54, + "h": 50 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 51, + "h": 50 + }, + "frame": { + "x": 104, + "y": 93, + "w": 51, + "h": 50 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:7decf4c336c92bdacc5d43bc8590718f:30606c7130f3577df61a85f98b567a88:736cd88647e79ba7896fc74f9406c2fe$" + } +} diff --git a/public/images/pokemon/exp/back/shiny/female/6215.png b/public/images/pokemon/exp/back/shiny/female/6215.png new file mode 100644 index 00000000000..3af5e81148c Binary files /dev/null and b/public/images/pokemon/exp/back/shiny/female/6215.png differ diff --git a/public/images/pokemon/exp/back/shiny/female/668.json b/public/images/pokemon/exp/back/shiny/female/668.json new file mode 100644 index 00000000000..8e55af5a4de --- /dev/null +++ b/public/images/pokemon/exp/back/shiny/female/668.json @@ -0,0 +1,820 @@ +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 475, "y": 144, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 76, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 152, "y": 283, "w": 75, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 73, "y": 284, "w": 74, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 5, "w": 74, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 460, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 227, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 385, "y": 284, "w": 75, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 75, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 472, "y": 283, "w": 77, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 77, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 233, "y": 282, "w": 77, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 77, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 396, "y": 215, "w": 76, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 399, "y": 144, "w": 76, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 76, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 431, "y": 73, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 242, "y": 142, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 156, "y": 213, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 475, "y": 144, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 76, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 152, "y": 283, "w": 75, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 73, "y": 284, "w": 74, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 5, "w": 74, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 460, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 227, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 385, "y": 284, "w": 75, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 75, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 472, "y": 283, "w": 77, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 77, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 233, "y": 282, "w": 77, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 77, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 396, "y": 215, "w": 76, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 399, "y": 144, "w": 76, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 76, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 431, "y": 73, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 242, "y": 142, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 156, "y": 213, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 475, "y": 144, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 76, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 152, "y": 283, "w": 75, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 73, "y": 284, "w": 74, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 5, "w": 74, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 460, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 227, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 385, "y": 284, "w": 75, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 75, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 472, "y": 283, "w": 77, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 77, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 233, "y": 282, "w": 77, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 77, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 396, "y": 215, "w": 76, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 399, "y": 144, "w": 76, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 76, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 431, "y": 73, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 242, "y": 142, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 156, "y": 213, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 475, "y": 144, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 76, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 152, "y": 283, "w": 75, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 73, "y": 284, "w": 74, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 5, "w": 74, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 460, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 227, "y": 350, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 6, "w": 74, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 385, "y": 284, "w": 75, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 6, "w": 75, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 472, "y": 283, "w": 77, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 6, "w": 77, "h": 67 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 233, "y": 282, "w": 77, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 5, "w": 77, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 396, "y": 215, "w": 76, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 214, "w": 76, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 3, "w": 76, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 399, "y": 144, "w": 76, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 76, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 431, "y": 73, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 242, "y": 142, "w": 77, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 2, "w": 77, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 156, "y": 213, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 475, "y": 144, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 0, "y": 144, "w": 78, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 78, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 233, "y": 213, "w": 78, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 4, "w": 78, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 156, "y": 144, "w": 79, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 4, "w": 79, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 319, "y": 144, "w": 80, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 80, "h": 68 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 242, "y": 73, "w": 80, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 80, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 310, "y": 282, "w": 75, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 4, "w": 75, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 534, "y": 350, "w": 71, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 4, "w": 71, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 301, "y": 351, "w": 67, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 3, "w": 67, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 353, "w": 63, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 3, "w": 63, "h": 75 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 204, "y": 417, "w": 63, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 2, "w": 63, "h": 75 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 139, "y": 352, "w": 65, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 3, "w": 65, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 73, "y": 352, "w": 66, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 3, "w": 66, "h": 72 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 368, "y": 351, "w": 69, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 4, "w": 69, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 0, "y": 284, "w": 73, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 4, "w": 73, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 475, "y": 214, "w": 76, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 4, "w": 76, "h": 69 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 319, "y": 212, "w": 77, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 77, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 82, "y": 73, "w": 80, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 80, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 519, "y": 72, "w": 83, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 83, "h": 72 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 434, "y": 0, "w": 85, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 85, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 261, "y": 0, "w": 86, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 86, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 174, "y": 0, "w": 87, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 87, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 87, "y": 0, "w": 87, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 87, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 0, "y": 0, "w": 87, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 87, "h": 73 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 347, "y": 0, "w": 87, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 87, "h": 72 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 519, "y": 0, "w": 85, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 85, "h": 72 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 347, "y": 72, "w": 84, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 84, "h": 72 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 0, "y": 73, "w": 82, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 82, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 162, "y": 73, "w": 80, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 80, "h": 71 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 78, "y": 144, "w": 78, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 3, "w": 78, "h": 70 }, + "sourceSize": { "w": 89, "h": 78 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "format": "I8", + "size": { "w": 605, "h": 492 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/back/shiny/female/668.png b/public/images/pokemon/exp/back/shiny/female/668.png new file mode 100644 index 00000000000..cec15d8fcb7 Binary files /dev/null and b/public/images/pokemon/exp/back/shiny/female/668.png differ diff --git a/public/images/pokemon/exp/female/6215.json b/public/images/pokemon/exp/female/6215.json new file mode 100644 index 00000000000..8e010a77bb6 --- /dev/null +++ b/public/images/pokemon/exp/female/6215.json @@ -0,0 +1,2078 @@ +{ + "textures": [ + { + "image": "6215.png", + "format": "RGBA8888", + "size": { + "w": 230, + "h": 230 + }, + "scale": 1, + "frames": [ + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 50, + "w": 55, + "h": 50 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 50, + "w": 55, + "h": 50 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 150, + "w": 53, + "h": 50 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 150, + "w": 53, + "h": 50 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 55, + "y": 51, + "w": 53, + "h": 50 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 55, + "y": 51, + "w": 53, + "h": 50 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 54, + "h": 48 + }, + "frame": { + "x": 53, + "y": 101, + "w": 54, + "h": 48 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 54, + "h": 48 + }, + "frame": { + "x": 53, + "y": 101, + "w": 54, + "h": 48 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 54, + "h": 48 + }, + "frame": { + "x": 53, + "y": 101, + "w": 54, + "h": 48 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 54, + "h": 48 + }, + "frame": { + "x": 53, + "y": 101, + "w": 54, + "h": 48 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 54, + "h": 48 + }, + "frame": { + "x": 53, + "y": 101, + "w": 54, + "h": 48 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 54, + "h": 48 + }, + "frame": { + "x": 53, + "y": 101, + "w": 54, + "h": 48 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 50, + "h": 51 + }, + "frame": { + "x": 53, + "y": 149, + "w": 50, + "h": 51 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 50, + "h": 51 + }, + "frame": { + "x": 53, + "y": 149, + "w": 50, + "h": 51 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 50, + "h": 51 + }, + "frame": { + "x": 53, + "y": 149, + "w": 50, + "h": 51 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 50, + "h": 51 + }, + "frame": { + "x": 53, + "y": 149, + "w": 50, + "h": 51 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 50, + "h": 51 + }, + "frame": { + "x": 53, + "y": 149, + "w": 50, + "h": 51 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 50, + "h": 51 + }, + "frame": { + "x": 53, + "y": 149, + "w": 50, + "h": 51 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 50, + "h": 51 + }, + "frame": { + "x": 53, + "y": 149, + "w": 50, + "h": 51 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 50, + "h": 51 + }, + "frame": { + "x": 53, + "y": 149, + "w": 50, + "h": 51 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 47, + "h": 47 + }, + "frame": { + "x": 108, + "y": 49, + "w": 47, + "h": 47 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 47, + "h": 47 + }, + "frame": { + "x": 108, + "y": 49, + "w": 47, + "h": 47 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 47, + "h": 47 + }, + "frame": { + "x": 155, + "y": 49, + "w": 47, + "h": 47 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 47, + "h": 47 + }, + "frame": { + "x": 155, + "y": 49, + "w": 47, + "h": 47 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 0, + "y": 7, + "w": 47, + "h": 44 + }, + "frame": { + "x": 108, + "y": 96, + "w": 47, + "h": 44 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 0, + "y": 7, + "w": 47, + "h": 44 + }, + "frame": { + "x": 108, + "y": 96, + "w": 47, + "h": 44 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 45, + "h": 46 + }, + "frame": { + "x": 155, + "y": 96, + "w": 45, + "h": 46 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 45, + "h": 46 + }, + "frame": { + "x": 155, + "y": 96, + "w": 45, + "h": 46 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 8, + "w": 45, + "h": 44 + }, + "frame": { + "x": 107, + "y": 140, + "w": 45, + "h": 44 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 8, + "w": 45, + "h": 44 + }, + "frame": { + "x": 107, + "y": 140, + "w": 45, + "h": 44 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 39, + "h": 46 + }, + "frame": { + "x": 103, + "y": 184, + "w": 39, + "h": 46 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 39, + "h": 46 + }, + "frame": { + "x": 103, + "y": 184, + "w": 39, + "h": 46 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 38, + "h": 46 + }, + "frame": { + "x": 142, + "y": 184, + "w": 38, + "h": 46 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 38, + "h": 46 + }, + "frame": { + "x": 142, + "y": 184, + "w": 38, + "h": 46 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 5, + "y": 8, + "w": 41, + "h": 44 + }, + "frame": { + "x": 180, + "y": 142, + "w": 41, + "h": 44 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 5, + "y": 8, + "w": 41, + "h": 44 + }, + "frame": { + "x": 180, + "y": 142, + "w": 41, + "h": 44 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:a8930baf3a1083758adeeca87b28c6c7:3138fb5696691a4322b6805a44d3caa0:736cd88647e79ba7896fc74f9406c2fe$" + } +} diff --git a/public/images/pokemon/exp/female/6215.png b/public/images/pokemon/exp/female/6215.png new file mode 100644 index 00000000000..2d132090ae8 Binary files /dev/null and b/public/images/pokemon/exp/female/6215.png differ diff --git a/public/images/pokemon/exp/female/668.json b/public/images/pokemon/exp/female/668.json new file mode 100644 index 00000000000..443f13c0b54 --- /dev/null +++ b/public/images/pokemon/exp/female/668.json @@ -0,0 +1,820 @@ +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 219, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 291, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 453, "y": 289, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 441, "y": 360, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 309, "y": 359, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 380, "y": 358, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 317, "y": 289, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 390, "y": 288, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 254, "y": 220, "w": 63, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 63, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 63, "y": 220, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 399, "y": 216, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 64, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 138, "y": 74, "w": 63, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 63, "h": 78 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 201, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 264, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 219, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 291, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 453, "y": 289, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 441, "y": 360, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 309, "y": 359, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 380, "y": 358, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 317, "y": 289, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 390, "y": 288, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 254, "y": 220, "w": 63, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 63, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 63, "y": 220, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 399, "y": 216, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 64, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 138, "y": 74, "w": 63, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 63, "h": 78 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 201, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 264, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 0, "y": 219, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 291, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 453, "y": 289, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 441, "y": 360, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 309, "y": 359, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 380, "y": 358, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 317, "y": 289, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 390, "y": 288, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 254, "y": 220, "w": 63, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 63, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 63, "y": 220, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 399, "y": 216, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 64, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 138, "y": 74, "w": 63, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 63, "h": 78 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 201, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 264, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 0, "y": 219, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 291, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 453, "y": 289, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 441, "y": 360, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 309, "y": 359, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 380, "y": 358, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 317, "y": 289, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 390, "y": 288, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 254, "y": 220, "w": 63, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 63, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 63, "y": 220, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 399, "y": 216, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 64, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 138, "y": 74, "w": 63, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 63, "h": 78 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 201, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 264, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 0, "y": 219, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 0, "y": 147, "w": 64, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 64, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 127, "y": 152, "w": 64, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 64, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 465, "y": 146, "w": 65, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 65, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 399, "y": 146, "w": 66, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 66, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 334, "y": 74, "w": 66, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 66, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 191, "y": 220, "w": 63, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 63, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 126, "y": 223, "w": 62, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 62, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 462, "y": 217, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 188, "y": 291, "w": 61, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 61, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 249, "y": 291, "w": 60, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 60, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 62, "y": 292, "w": 60, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 60, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 122, "y": 295, "w": 60, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 60, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 182, "y": 363, "w": 59, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 6, "w": 59, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 60, "y": 364, "w": 59, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 59, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 0, "y": 362, "w": 60, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 60, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 327, "y": 217, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 268, "y": 74, "w": 66, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 66, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 0, "y": 74, "w": 69, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 69, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 376, "y": 0, "w": 73, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 73, "h": 74 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 227, "y": 0, "w": 75, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 75, "h": 74 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 76, "y": 0, "w": 76, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 76, "h": 74 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 0, "y": 0, "w": 76, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 76, "h": 74 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 152, "y": 0, "w": 75, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 75, "h": 74 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 302, "y": 0, "w": 74, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 74, "h": 74 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 449, "y": 0, "w": 72, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 72, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 449, "y": 73, "w": 71, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 71, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 69, "y": 74, "w": 69, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 69, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 201, "y": 74, "w": 67, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 67, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 334, "y": 145, "w": 65, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 65, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "format": "I8", + "size": { "w": 530, "h": 436 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/female/668.png b/public/images/pokemon/exp/female/668.png new file mode 100644 index 00000000000..fa0582a61f1 Binary files /dev/null and b/public/images/pokemon/exp/female/668.png differ diff --git a/public/images/pokemon/exp/shiny/667.json b/public/images/pokemon/exp/shiny/667.json index db076b1f465..3fba95afcf9 100644 --- a/public/images/pokemon/exp/shiny/667.json +++ b/public/images/pokemon/exp/shiny/667.json @@ -1,272 +1,659 @@ -{ - "textures": [ - { - "image": "667.png", - "format": "RGBA8888", - "size": { - "w": 160, - "h": 160 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 40, - "h": 46 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 40, - "h": 46 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 46 - }, - "frame": { - "x": 0, - "y": 46, - "w": 40, - "h": 46 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 46 - }, - "frame": { - "x": 0, - "y": 92, - "w": 40, - "h": 46 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 46 - }, - "frame": { - "x": 40, - "y": 0, - "w": 40, - "h": 46 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 40, - "h": 46 - }, - "frame": { - "x": 80, - "y": 0, - "w": 40, - "h": 46 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 45 - }, - "frame": { - "x": 120, - "y": 0, - "w": 40, - "h": 45 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 45 - }, - "frame": { - "x": 120, - "y": 0, - "w": 40, - "h": 45 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 45 - }, - "frame": { - "x": 120, - "y": 45, - "w": 40, - "h": 45 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 40, - "h": 45 - }, - "frame": { - "x": 40, - "y": 90, - "w": 40, - "h": 45 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 40, - "h": 44 - }, - "frame": { - "x": 40, - "y": 46, - "w": 40, - "h": 44 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 40, - "h": 44 - }, - "frame": { - "x": 80, - "y": 46, - "w": 40, - "h": 44 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:fb79c9185dd67d4776808c312f36f7a4:a6c3c7cc2402b26f23f5ac4e23929ba7:02171d511e760c8a3e1b623ad6bf93f5$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 127, "y": 48, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 50, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 39, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 40, "y": 50, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 120, "y": 96, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 38, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 80, "y": 96, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 39, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 40, "y": 96, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 85, "y": 49, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 127, "y": 48, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 50, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 39, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0013.png", + "frame": { "x": 40, "y": 50, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0014.png", + "frame": { "x": 120, "y": 96, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 38, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0015.png", + "frame": { "x": 80, "y": 96, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 39, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0016.png", + "frame": { "x": 40, "y": 96, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0017.png", + "frame": { "x": 85, "y": 49, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0018.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0019.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0020.png", + "frame": { "x": 127, "y": 48, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 50, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 39, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0022.png", + "frame": { "x": 40, "y": 50, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0023.png", + "frame": { "x": 120, "y": 96, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 38, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0024.png", + "frame": { "x": 80, "y": 96, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 39, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0025.png", + "frame": { "x": 40, "y": 96, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0026.png", + "frame": { "x": 85, "y": 49, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0027.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0028.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0029.png", + "frame": { "x": 127, "y": 48, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 50, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 39, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0031.png", + "frame": { "x": 40, "y": 50, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0032.png", + "frame": { "x": 120, "y": 96, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 38, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0033.png", + "frame": { "x": 80, "y": 96, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 39, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0034.png", + "frame": { "x": 40, "y": 96, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0035.png", + "frame": { "x": 85, "y": 49, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0036.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0037.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0038.png", + "frame": { "x": 127, "y": 48, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 50, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 39, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0040.png", + "frame": { "x": 40, "y": 50, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0041.png", + "frame": { "x": 120, "y": 96, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 38, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0042.png", + "frame": { "x": 80, "y": 96, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 39, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0043.png", + "frame": { "x": 40, "y": 96, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0044.png", + "frame": { "x": 85, "y": 49, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0045.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0046.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0047.png", + "frame": { "x": 127, "y": 48, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0048.png", + "frame": { "x": 0, "y": 50, "w": 39, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 39, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0049.png", + "frame": { "x": 40, "y": 50, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0050.png", + "frame": { "x": 120, "y": 96, "w": 38, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 38, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0051.png", + "frame": { "x": 80, "y": 96, "w": 39, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 5, "w": 39, "h": 44 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0052.png", + "frame": { "x": 40, "y": 96, "w": 39, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 39, "h": 45 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0053.png", + "frame": { "x": 85, "y": 49, "w": 40, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 40, "h": 46 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0054.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0055.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0056.png", + "frame": { "x": 85, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 41, "h": 48 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0058.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0059.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0060.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0061.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0062.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0063.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0064.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0065.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0066.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0067.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0068.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 42, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0070.png", + "frame": { "x": 43, "y": 0, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 41, "h": 49 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0071.png", + "frame": { "x": 85, "y": 0, "w": 41, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 41, "h": 48 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + }, + { + "filename": "0072.png", + "frame": { "x": 127, "y": 0, "w": 40, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 47 }, + "sourceSize": { "w": 42, "h": 49 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "667.png", + "format": "I8", + "size": { "w": 167, "h": 141 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/667.png b/public/images/pokemon/exp/shiny/667.png index a0704b502c9..589f219c472 100644 Binary files a/public/images/pokemon/exp/shiny/667.png and b/public/images/pokemon/exp/shiny/667.png differ diff --git a/public/images/pokemon/exp/shiny/668.json b/public/images/pokemon/exp/shiny/668.json index 7e3f88c2276..63671a548a2 100644 --- a/public/images/pokemon/exp/shiny/668.json +++ b/public/images/pokemon/exp/shiny/668.json @@ -1,272 +1,821 @@ -{ - "textures": [ - { - "image": "668.png", - "format": "RGBA8888", - "size": { - "w": 205, - "h": 205 - }, - "scale": 1, - "frames": [ - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 70, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 70, - "h": 68 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 70, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 70, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 70, - "h": 69 - }, - "frame": { - "x": 70, - "y": 0, - "w": 70, - "h": 69 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 70, - "h": 69 - }, - "frame": { - "x": 70, - "y": 0, - "w": 70, - "h": 69 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 70, - "h": 69 - }, - "frame": { - "x": 70, - "y": 0, - "w": 70, - "h": 69 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 70, - "h": 69 - }, - "frame": { - "x": 70, - "y": 0, - "w": 70, - "h": 69 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 0, - "y": 68, - "w": 67, - "h": 70 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 67, - "h": 70 - }, - "frame": { - "x": 0, - "y": 68, - "w": 67, - "h": 70 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 67, - "y": 69, - "w": 69, - "h": 70 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 67, - "y": 69, - "w": 69, - "h": 70 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 67, - "y": 69, - "w": 69, - "h": 70 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 70, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 69, - "h": 70 - }, - "frame": { - "x": 136, - "y": 69, - "w": 69, - "h": 70 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:fe9d35bc9a00c019cb84acf0c89b22a5:7d23425606ae8471a81a61d8fdec2fc9:947bf84d1af493c62e2cef45bb6c19ad$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 67, "y": 222, "w": 70, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 70, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 295, "w": 68, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 68, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 414, "y": 297, "w": 67, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 67, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 196, "y": 367, "w": 65, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 65, "h": 71 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 414, "y": 369, "w": 62, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 62, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 320, "y": 372, "w": 60, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 60, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 380, "y": 441, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 196, "y": 438, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 61, "y": 370, "w": 60, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 60, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 350, "y": 296, "w": 64, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 64, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 151, "w": 67, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 67, "h": 77 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 283, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 434, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 214, "y": 149, "w": 69, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 69, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 282, "y": 225, "w": 68, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 68, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 67, "y": 222, "w": 70, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 70, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 295, "w": 68, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 68, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 414, "y": 297, "w": 67, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 67, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 196, "y": 367, "w": 65, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 65, "h": 71 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 414, "y": 369, "w": 62, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 62, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 320, "y": 372, "w": 60, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 60, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 380, "y": 441, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 196, "y": 438, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 61, "y": 370, "w": 60, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 60, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 350, "y": 296, "w": 64, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 64, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 151, "w": 67, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 67, "h": 77 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 283, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 434, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 214, "y": 149, "w": 69, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 69, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 282, "y": 225, "w": 68, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 68, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 67, "y": 222, "w": 70, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 70, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 295, "w": 68, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 68, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 414, "y": 297, "w": 67, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 67, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 196, "y": 367, "w": 65, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 65, "h": 71 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 414, "y": 369, "w": 62, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 62, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 320, "y": 372, "w": 60, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 60, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 380, "y": 441, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 196, "y": 438, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 61, "y": 370, "w": 60, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 60, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 350, "y": 296, "w": 64, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 64, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 151, "w": 67, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 67, "h": 77 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 283, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 434, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 214, "y": 149, "w": 69, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 69, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 282, "y": 225, "w": 68, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 68, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 67, "y": 222, "w": 70, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 70, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 295, "w": 68, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 68, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 414, "y": 297, "w": 67, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 67, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 196, "y": 367, "w": 65, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 65, "h": 71 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 414, "y": 369, "w": 62, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 5, "w": 62, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 320, "y": 372, "w": 60, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 60, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 380, "y": 441, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 196, "y": 438, "w": 58, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 4, "w": 58, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 61, "y": 370, "w": 60, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 60, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 350, "y": 296, "w": 64, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 64, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 151, "w": 67, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 67, "h": 77 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 283, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 434, "y": 149, "w": 68, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 68, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 214, "y": 149, "w": 69, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 69, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 282, "y": 225, "w": 68, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 68, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 351, "y": 151, "w": 70, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 70, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 142, "y": 221, "w": 70, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 70, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 351, "y": 224, "w": 70, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 70, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 421, "y": 225, "w": 69, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 69, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 205, "y": 296, "w": 69, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 69, "h": 71 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 212, "y": 224, "w": 70, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 70, "h": 72 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 137, "y": 294, "w": 68, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 68, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 274, "y": 299, "w": 64, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 64, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 368, "w": 61, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 3, "w": 61, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 0, "y": 442, "w": 55, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 55, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 438, "y": 441, "w": 55, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 55, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 261, "y": 372, "w": 59, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 134, "y": 367, "w": 62, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 62, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 68, "y": 295, "w": 66, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 2, "w": 66, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 365, "y": 75, "w": 69, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 69, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 0, "y": 75, "w": 71, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 71, "h": 76 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 442, "y": 74, "w": 72, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 72, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 221, "y": 74, "w": 72, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 72, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 369, "y": 0, "w": 73, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 73, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 296, "y": 0, "w": 73, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 73, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 74, "y": 0, "w": 74, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 74, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 0, "y": 0, "w": 74, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 74, "h": 75 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 148, "y": 0, "w": 74, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 74, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 148, "y": 74, "w": 73, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 73, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 222, "y": 0, "w": 74, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 74, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 442, "y": 0, "w": 73, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 73, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 293, "y": 75, "w": 72, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 72, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 71, "y": 75, "w": 72, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 72, "h": 74 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 71, "y": 149, "w": 71, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 71, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 143, "y": 148, "w": 71, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 71, "h": 73 }, + "sourceSize": { "w": 79, "h": 77 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "668.png", + "format": "I8", + "size": { "w": 515, "h": 516 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/668.png b/public/images/pokemon/exp/shiny/668.png index eaf8428625f..4cac3d1d582 100644 Binary files a/public/images/pokemon/exp/shiny/668.png and b/public/images/pokemon/exp/shiny/668.png differ diff --git a/public/images/pokemon/exp/shiny/female/6215.json b/public/images/pokemon/exp/shiny/female/6215.json new file mode 100644 index 00000000000..8c8b4e0cf73 --- /dev/null +++ b/public/images/pokemon/exp/shiny/female/6215.json @@ -0,0 +1,2078 @@ +{ + "textures": [ + { + "image": "6215.png", + "format": "RGBA8888", + "size": { + "w": 230, + "h": 230 + }, + "scale": 1, + "frames": [ + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 50 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 50, + "w": 55, + "h": 50 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 55, + "h": 50 + }, + "frame": { + "x": 0, + "y": 50, + "w": 55, + "h": 50 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 52, + "h": 51 + }, + "frame": { + "x": 55, + "y": 0, + "w": 52, + "h": 51 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 100, + "w": 53, + "h": 50 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 107, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 2, + "w": 54, + "h": 49 + }, + "frame": { + "x": 161, + "y": 0, + "w": 54, + "h": 49 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 150, + "w": 53, + "h": 50 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 0, + "y": 150, + "w": 53, + "h": 50 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 55, + "y": 51, + "w": 53, + "h": 50 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 53, + "h": 50 + }, + "frame": { + "x": 55, + "y": 51, + "w": 53, + "h": 50 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 54, + "h": 48 + }, + "frame": { + "x": 53, + "y": 101, + "w": 54, + "h": 48 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 54, + "h": 48 + }, + "frame": { + "x": 53, + "y": 101, + "w": 54, + "h": 48 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 54, + "h": 48 + }, + "frame": { + "x": 53, + "y": 101, + "w": 54, + "h": 48 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 54, + "h": 48 + }, + "frame": { + "x": 53, + "y": 101, + "w": 54, + "h": 48 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 54, + "h": 48 + }, + "frame": { + "x": 53, + "y": 101, + "w": 54, + "h": 48 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 54, + "h": 48 + }, + "frame": { + "x": 53, + "y": 101, + "w": 54, + "h": 48 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 50, + "h": 51 + }, + "frame": { + "x": 53, + "y": 149, + "w": 50, + "h": 51 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 50, + "h": 51 + }, + "frame": { + "x": 53, + "y": 149, + "w": 50, + "h": 51 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 50, + "h": 51 + }, + "frame": { + "x": 53, + "y": 149, + "w": 50, + "h": 51 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 50, + "h": 51 + }, + "frame": { + "x": 53, + "y": 149, + "w": 50, + "h": 51 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 50, + "h": 51 + }, + "frame": { + "x": 53, + "y": 149, + "w": 50, + "h": 51 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 50, + "h": 51 + }, + "frame": { + "x": 53, + "y": 149, + "w": 50, + "h": 51 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 50, + "h": 51 + }, + "frame": { + "x": 53, + "y": 149, + "w": 50, + "h": 51 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 50, + "h": 51 + }, + "frame": { + "x": 53, + "y": 149, + "w": 50, + "h": 51 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 47, + "h": 47 + }, + "frame": { + "x": 108, + "y": 49, + "w": 47, + "h": 47 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 47, + "h": 47 + }, + "frame": { + "x": 108, + "y": 49, + "w": 47, + "h": 47 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 47, + "h": 47 + }, + "frame": { + "x": 155, + "y": 49, + "w": 47, + "h": 47 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 47, + "h": 47 + }, + "frame": { + "x": 155, + "y": 49, + "w": 47, + "h": 47 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 0, + "y": 7, + "w": 47, + "h": 44 + }, + "frame": { + "x": 108, + "y": 96, + "w": 47, + "h": 44 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 0, + "y": 7, + "w": 47, + "h": 44 + }, + "frame": { + "x": 108, + "y": 96, + "w": 47, + "h": 44 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 45, + "h": 46 + }, + "frame": { + "x": 155, + "y": 96, + "w": 45, + "h": 46 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 45, + "h": 46 + }, + "frame": { + "x": 155, + "y": 96, + "w": 45, + "h": 46 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 8, + "w": 45, + "h": 44 + }, + "frame": { + "x": 107, + "y": 140, + "w": 45, + "h": 44 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 1, + "y": 8, + "w": 45, + "h": 44 + }, + "frame": { + "x": 107, + "y": 140, + "w": 45, + "h": 44 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 39, + "h": 46 + }, + "frame": { + "x": 103, + "y": 184, + "w": 39, + "h": 46 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 39, + "h": 46 + }, + "frame": { + "x": 103, + "y": 184, + "w": 39, + "h": 46 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 38, + "h": 46 + }, + "frame": { + "x": 142, + "y": 184, + "w": 38, + "h": 46 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 38, + "h": 46 + }, + "frame": { + "x": 142, + "y": 184, + "w": 38, + "h": 46 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 5, + "y": 8, + "w": 41, + "h": 44 + }, + "frame": { + "x": 180, + "y": 142, + "w": 41, + "h": 44 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 56, + "h": 54 + }, + "spriteSourceSize": { + "x": 5, + "y": 8, + "w": 41, + "h": 44 + }, + "frame": { + "x": 180, + "y": 142, + "w": 41, + "h": 44 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:edaed3da1123a782356b1ac83d1afd7c:cb0e0681f4dbf68283437f5581a20bb3:736cd88647e79ba7896fc74f9406c2fe$" + } +} diff --git a/public/images/pokemon/exp/shiny/female/6215.png b/public/images/pokemon/exp/shiny/female/6215.png new file mode 100644 index 00000000000..4e7ea06c60a Binary files /dev/null and b/public/images/pokemon/exp/shiny/female/6215.png differ diff --git a/public/images/pokemon/exp/shiny/female/668.json b/public/images/pokemon/exp/shiny/female/668.json new file mode 100644 index 00000000000..443f13c0b54 --- /dev/null +++ b/public/images/pokemon/exp/shiny/female/668.json @@ -0,0 +1,820 @@ +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 219, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 291, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 453, "y": 289, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 441, "y": 360, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 309, "y": 359, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 380, "y": 358, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 317, "y": 289, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 390, "y": 288, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 254, "y": 220, "w": 63, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 63, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 63, "y": 220, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 399, "y": 216, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 64, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 138, "y": 74, "w": 63, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 63, "h": 78 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 201, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 264, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 219, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 291, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 453, "y": 289, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 441, "y": 360, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 309, "y": 359, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 380, "y": 358, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 317, "y": 289, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 390, "y": 288, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 254, "y": 220, "w": 63, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 63, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 63, "y": 220, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 399, "y": 216, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 64, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 138, "y": 74, "w": 63, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 63, "h": 78 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 201, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 264, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 0, "y": 219, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 291, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 453, "y": 289, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 441, "y": 360, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 309, "y": 359, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 380, "y": 358, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 317, "y": 289, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 390, "y": 288, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 254, "y": 220, "w": 63, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 63, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 63, "y": 220, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 399, "y": 216, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 64, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 138, "y": 74, "w": 63, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 63, "h": 78 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 201, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 264, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 0, "y": 219, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 291, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 453, "y": 289, "w": 62, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 62, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 441, "y": 360, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 309, "y": 359, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 380, "y": 358, "w": 61, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 61, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 317, "y": 289, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 390, "y": 288, "w": 63, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 63, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 254, "y": 220, "w": 63, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 63, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 63, "y": 220, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 399, "y": 216, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 64, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 138, "y": 74, "w": 63, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 63, "h": 78 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 201, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 264, "y": 147, "w": 63, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 63, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 0, "y": 219, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 0, "y": 147, "w": 64, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 64, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 127, "y": 152, "w": 64, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 64, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 465, "y": 146, "w": 65, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 65, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 399, "y": 146, "w": 66, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 8, "w": 66, "h": 70 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 334, "y": 74, "w": 66, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 7, "w": 66, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 191, "y": 220, "w": 63, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 63, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 126, "y": 223, "w": 62, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 62, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 462, "y": 217, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 188, "y": 291, "w": 61, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 6, "w": 61, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 249, "y": 291, "w": 60, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 5, "w": 60, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 62, "y": 292, "w": 60, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 60, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 122, "y": 295, "w": 60, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 60, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 182, "y": 363, "w": 59, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 6, "w": 59, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 60, "y": 364, "w": 59, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 59, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 0, "y": 362, "w": 60, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 7, "w": 60, "h": 71 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 327, "y": 217, "w": 63, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 6, "w": 63, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 268, "y": 74, "w": 66, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 66, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 0, "y": 74, "w": 69, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 69, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 376, "y": 0, "w": 73, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 73, "h": 74 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 227, "y": 0, "w": 75, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 75, "h": 74 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 76, "y": 0, "w": 76, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 76, "h": 74 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 0, "y": 0, "w": 76, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 76, "h": 74 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 152, "y": 0, "w": 75, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 75, "h": 74 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 302, "y": 0, "w": 74, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 74, "h": 74 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 449, "y": 0, "w": 72, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 5, "w": 72, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 449, "y": 73, "w": 71, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 71, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 69, "y": 74, "w": 69, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 69, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 201, "y": 74, "w": 67, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 67, "h": 73 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 334, "y": 145, "w": 65, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 65, "h": 72 }, + "sourceSize": { "w": 80, "h": 78 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "format": "I8", + "size": { "w": 530, "h": 436 }, + "scale": "1" + } +} diff --git a/public/images/pokemon/exp/shiny/female/668.png b/public/images/pokemon/exp/shiny/female/668.png new file mode 100644 index 00000000000..ad84dc50460 Binary files /dev/null and b/public/images/pokemon/exp/shiny/female/668.png differ diff --git a/public/images/pokemon/icons/7/802-zenith.png b/public/images/pokemon/icons/7/802-zenith.png new file mode 100644 index 00000000000..7e0fee2d609 Binary files /dev/null and b/public/images/pokemon/icons/7/802-zenith.png differ diff --git a/public/images/pokemon/icons/7/802s-zenith.png b/public/images/pokemon/icons/7/802s-zenith.png new file mode 100644 index 00000000000..7e0fee2d609 Binary files /dev/null and b/public/images/pokemon/icons/7/802s-zenith.png differ diff --git a/public/images/pokemon/shiny/335.json b/public/images/pokemon/shiny/335.json index ca797f1d7a4..80c43b41c12 100644 --- a/public/images/pokemon/shiny/335.json +++ b/public/images/pokemon/shiny/335.json @@ -1,1910 +1,523 @@ -{ - "textures": [ - { - "image": "335.png", - "format": "RGBA8888", - "size": { - "w": 366, - "h": 366 - }, - "scale": 1, - "frames": [ - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 68, - "h": 63 - }, - "frame": { - "x": 0, - "y": 0, - "w": 68, - "h": 63 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 68, - "h": 63 - }, - "frame": { - "x": 0, - "y": 0, - "w": 68, - "h": 63 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 68, - "h": 63 - }, - "frame": { - "x": 0, - "y": 0, - "w": 68, - "h": 63 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 68, - "h": 63 - }, - "frame": { - "x": 0, - "y": 0, - "w": 68, - "h": 63 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 65, - "h": 66 - }, - "frame": { - "x": 0, - "y": 63, - "w": 65, - "h": 66 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 67, - "h": 63 - }, - "frame": { - "x": 68, - "y": 0, - "w": 67, - "h": 63 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 67, - "h": 63 - }, - "frame": { - "x": 68, - "y": 0, - "w": 67, - "h": 63 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 68, - "h": 61 - }, - "frame": { - "x": 65, - "y": 63, - "w": 68, - "h": 61 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 68, - "h": 61 - }, - "frame": { - "x": 65, - "y": 63, - "w": 68, - "h": 61 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 68, - "h": 61 - }, - "frame": { - "x": 65, - "y": 63, - "w": 68, - "h": 61 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 68, - "h": 61 - }, - "frame": { - "x": 65, - "y": 63, - "w": 68, - "h": 61 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 64, - "h": 63 - }, - "frame": { - "x": 0, - "y": 129, - "w": 64, - "h": 63 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 64, - "h": 63 - }, - "frame": { - "x": 0, - "y": 129, - "w": 64, - "h": 63 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 64, - "h": 63 - }, - "frame": { - "x": 0, - "y": 129, - "w": 64, - "h": 63 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 64, - "h": 63 - }, - "frame": { - "x": 0, - "y": 129, - "w": 64, - "h": 63 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 61, - "h": 66 - }, - "frame": { - "x": 0, - "y": 192, - "w": 61, - "h": 66 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 61, - "h": 66 - }, - "frame": { - "x": 0, - "y": 258, - "w": 61, - "h": 66 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 61, - "h": 66 - }, - "frame": { - "x": 0, - "y": 258, - "w": 61, - "h": 66 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 64, - "h": 62 - }, - "frame": { - "x": 135, - "y": 0, - "w": 64, - "h": 62 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 64, - "h": 62 - }, - "frame": { - "x": 135, - "y": 0, - "w": 64, - "h": 62 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 65, - "h": 61 - }, - "frame": { - "x": 199, - "y": 0, - "w": 65, - "h": 61 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 67, - "h": 58 - }, - "frame": { - "x": 264, - "y": 0, - "w": 67, - "h": 58 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 67, - "h": 58 - }, - "frame": { - "x": 264, - "y": 0, - "w": 67, - "h": 58 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 67, - "h": 58 - }, - "frame": { - "x": 264, - "y": 0, - "w": 67, - "h": 58 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 67, - "h": 58 - }, - "frame": { - "x": 264, - "y": 0, - "w": 67, - "h": 58 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 64, - "h": 59 - }, - "frame": { - "x": 65, - "y": 124, - "w": 64, - "h": 59 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 64, - "h": 59 - }, - "frame": { - "x": 65, - "y": 124, - "w": 64, - "h": 59 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 64, - "h": 59 - }, - "frame": { - "x": 65, - "y": 124, - "w": 64, - "h": 59 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 64, - "h": 59 - }, - "frame": { - "x": 65, - "y": 124, - "w": 64, - "h": 59 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 64, - "h": 61 - }, - "frame": { - "x": 64, - "y": 183, - "w": 64, - "h": 61 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 62, - "h": 65 - }, - "frame": { - "x": 61, - "y": 244, - "w": 62, - "h": 65 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 6, - "y": 9, - "w": 63, - "h": 57 - }, - "frame": { - "x": 61, - "y": 309, - "w": 63, - "h": 57 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 2, - "w": 61, - "h": 64 - }, - "frame": { - "x": 123, - "y": 244, - "w": 61, - "h": 64 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 1, - "y": 8, - "w": 63, - "h": 58 - }, - "frame": { - "x": 124, - "y": 308, - "w": 63, - "h": 58 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 61, - "h": 61 - }, - "frame": { - "x": 128, - "y": 183, - "w": 61, - "h": 61 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 61, - "h": 61 - }, - "frame": { - "x": 128, - "y": 183, - "w": 61, - "h": 61 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 61, - "h": 61 - }, - "frame": { - "x": 128, - "y": 183, - "w": 61, - "h": 61 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 3, - "y": 5, - "w": 61, - "h": 61 - }, - "frame": { - "x": 128, - "y": 183, - "w": 61, - "h": 61 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 184, - "y": 244, - "w": 60, - "h": 63 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 9, - "w": 62, - "h": 57 - }, - "frame": { - "x": 187, - "y": 307, - "w": 62, - "h": 57 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 9, - "w": 62, - "h": 57 - }, - "frame": { - "x": 187, - "y": 307, - "w": 62, - "h": 57 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 62, - "h": 63 - }, - "frame": { - "x": 264, - "y": 58, - "w": 62, - "h": 63 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 55, - "h": 63 - }, - "frame": { - "x": 133, - "y": 63, - "w": 55, - "h": 63 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 55, - "h": 63 - }, - "frame": { - "x": 133, - "y": 63, - "w": 55, - "h": 63 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 55, - "h": 63 - }, - "frame": { - "x": 133, - "y": 63, - "w": 55, - "h": 63 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 55, - "h": 63 - }, - "frame": { - "x": 133, - "y": 63, - "w": 55, - "h": 63 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 55, - "h": 66 - }, - "frame": { - "x": 188, - "y": 62, - "w": 55, - "h": 66 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 55, - "h": 66 - }, - "frame": { - "x": 188, - "y": 62, - "w": 55, - "h": 66 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 58, - "h": 66 - }, - "frame": { - "x": 189, - "y": 128, - "w": 58, - "h": 66 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 60, - "h": 66 - }, - "frame": { - "x": 247, - "y": 121, - "w": 60, - "h": 66 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 59, - "h": 63 - }, - "frame": { - "x": 307, - "y": 121, - "w": 59, - "h": 63 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 59, - "h": 63 - }, - "frame": { - "x": 307, - "y": 121, - "w": 59, - "h": 63 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 59, - "h": 63 - }, - "frame": { - "x": 307, - "y": 121, - "w": 59, - "h": 63 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 59, - "h": 63 - }, - "frame": { - "x": 307, - "y": 121, - "w": 59, - "h": 63 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 247, - "y": 187, - "w": 60, - "h": 63 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 247, - "y": 187, - "w": 60, - "h": 63 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 247, - "y": 187, - "w": 60, - "h": 63 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 247, - "y": 187, - "w": 60, - "h": 63 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 58, - "h": 63 - }, - "frame": { - "x": 307, - "y": 184, - "w": 58, - "h": 63 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 58, - "h": 63 - }, - "frame": { - "x": 307, - "y": 184, - "w": 58, - "h": 63 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 58, - "h": 63 - }, - "frame": { - "x": 307, - "y": 184, - "w": 58, - "h": 63 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 58, - "h": 63 - }, - "frame": { - "x": 307, - "y": 184, - "w": 58, - "h": 63 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 74, - "h": 66 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 60, - "h": 63 - }, - "frame": { - "x": 249, - "y": 250, - "w": 60, - "h": 63 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:0df67af080306e793f3e63687a642a63:bd66cef8682173381b002070c3411214:40bb9f4809624b12bf79bbfe664bea73$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0002.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0003.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0004.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0005.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 185, "w": 59, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 7, "w": 59, "h": 59 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0007.png", + "frame": { "x": 119, "y": 182, "w": 62, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 62, "h": 57 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0008.png", + "frame": { "x": 119, "y": 125, "w": 64, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 10, "w": 64, "h": 57 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0009.png", + "frame": { "x": 195, "y": 0, "w": 66, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 66, "h": 60 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0010.png", + "frame": { "x": 129, "y": 0, "w": 66, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 66, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0011.png", + "frame": { "x": 320, "y": 0, "w": 62, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 62, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0012.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 244, "w": 53, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 53, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0014.png", + "frame": { "x": 59, "y": 188, "w": 56, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 56, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0015.png", + "frame": { "x": 306, "y": 187, "w": 57, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 57, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0016.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0017.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0018.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0019.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0020.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 185, "w": 59, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 7, "w": 59, "h": 59 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0022.png", + "frame": { "x": 119, "y": 182, "w": 62, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 62, "h": 57 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0023.png", + "frame": { "x": 119, "y": 125, "w": 64, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 10, "w": 64, "h": 57 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0024.png", + "frame": { "x": 195, "y": 0, "w": 66, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 66, "h": 60 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0025.png", + "frame": { "x": 129, "y": 0, "w": 66, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 66, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0026.png", + "frame": { "x": 320, "y": 0, "w": 62, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 62, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0027.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 244, "w": 53, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 53, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0029.png", + "frame": { "x": 59, "y": 188, "w": 56, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 56, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0030.png", + "frame": { "x": 306, "y": 187, "w": 57, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 57, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0031.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0032.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0033.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0034.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0035.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 185, "w": 59, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 7, "w": 59, "h": 59 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0037.png", + "frame": { "x": 119, "y": 182, "w": 62, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 9, "w": 62, "h": 57 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0038.png", + "frame": { "x": 119, "y": 125, "w": 64, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 10, "w": 64, "h": 57 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0039.png", + "frame": { "x": 195, "y": 0, "w": 66, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 7, "w": 66, "h": 60 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0040.png", + "frame": { "x": 129, "y": 0, "w": 66, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 66, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0041.png", + "frame": { "x": 320, "y": 0, "w": 62, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 62, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0042.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 244, "w": 53, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 53, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0044.png", + "frame": { "x": 59, "y": 188, "w": 56, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 56, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0045.png", + "frame": { "x": 306, "y": 187, "w": 57, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 57, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0046.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0047.png", + "frame": { "x": 314, "y": 126, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0048.png", + "frame": { "x": 248, "y": 129, "w": 58, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 5, "w": 58, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0049.png", + "frame": { "x": 188, "y": 123, "w": 60, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 5, "w": 60, "h": 61 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0050.png", + "frame": { "x": 0, "y": 125, "w": 61, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 6, "w": 61, "h": 60 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0051.png", + "frame": { "x": 0, "y": 66, "w": 63, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 7, "w": 63, "h": 59 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0052.png", + "frame": { "x": 234, "y": 190, "w": 61, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 61, "h": 56 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0053.png", + "frame": { "x": 234, "y": 246, "w": 60, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 11, "w": 60, "h": 55 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0054.png", + "frame": { "x": 115, "y": 239, "w": 61, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 11, "w": 61, "h": 56 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0055.png", + "frame": { "x": 63, "y": 62, "w": 62, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 7, "w": 62, "h": 60 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0056.png", + "frame": { "x": 63, "y": 0, "w": 66, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 66, "h": 62 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 0, "w": 63, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 63, "h": 66 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0058.png", + "frame": { "x": 261, "y": 0, "w": 59, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 59, "h": 66 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0059.png", + "frame": { "x": 181, "y": 184, "w": 53, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 53, "h": 66 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0060.png", + "frame": { "x": 63, "y": 122, "w": 56, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 0, "w": 56, "h": 66 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0061.png", + "frame": { "x": 320, "y": 61, "w": 58, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 58, "h": 65 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0062.png", + "frame": { "x": 129, "y": 61, "w": 59, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 59, "h": 64 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0063.png", + "frame": { "x": 195, "y": 60, "w": 60, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 60, "h": 63 }, + "sourceSize": { "w": 74, "h": 67 } + }, + { + "filename": "0064.png", + "frame": { "x": 255, "y": 66, "w": 59, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 63 }, + "sourceSize": { "w": 74, "h": 67 } + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.9.2-x64", + "image": "335.png", + "format": "I8", + "size": { "w": 382, "h": 305 }, + "scale": "1" + } } diff --git a/public/images/pokemon/shiny/335.png b/public/images/pokemon/shiny/335.png index 765344af6fd..fc7c325a469 100644 Binary files a/public/images/pokemon/shiny/335.png and b/public/images/pokemon/shiny/335.png differ diff --git a/public/images/pokemon/shiny/668-female.json b/public/images/pokemon/shiny/668-female.json deleted file mode 100644 index ce08b281a62..00000000000 --- a/public/images/pokemon/shiny/668-female.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "668-female.png", - "format": "RGBA8888", - "size": { - "w": 72, - "h": 72 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 63, - "h": 72 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 63, - "h": 72 - }, - "frame": { - "x": 0, - "y": 0, - "w": 63, - "h": 72 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:bf61792d4b290b767953cfbbc5b6234f:c16e73a6866720618f3b4f8e3e0a0877:d99ed0e84a0695b54e479aa98271aba1$" - } -} diff --git a/public/images/pokemon/shiny/668-female.png b/public/images/pokemon/shiny/668-female.png deleted file mode 100644 index 1f56d13bc4c..00000000000 Binary files a/public/images/pokemon/shiny/668-female.png and /dev/null differ diff --git a/public/images/pokemon/shiny/668.png b/public/images/pokemon/shiny/668.png index c8ec7c9caf9..73c11b9a7c7 100644 Binary files a/public/images/pokemon/shiny/668.png and b/public/images/pokemon/shiny/668.png differ diff --git a/public/images/pokemon/shiny/female/668.png b/public/images/pokemon/shiny/female/668.png index 1f56d13bc4c..ec0d2338fac 100644 Binary files a/public/images/pokemon/shiny/female/668.png and b/public/images/pokemon/shiny/female/668.png differ diff --git a/public/images/pokemon/variant/_masterlist.json b/public/images/pokemon/variant/_masterlist.json index 87c9816b8cb..14b3198c22d 100644 --- a/public/images/pokemon/variant/_masterlist.json +++ b/public/images/pokemon/variant/_masterlist.json @@ -1397,7 +1397,7 @@ "612": [0, 1, 1], "616": [0, 1, 1], "617": [0, 1, 1], - "618": [0, 2, 2], + "618": [0, 1, 1], "619": [0, 1, 1], "620": [0, 1, 1], "621": [0, 1, 1], @@ -2143,7 +2143,9 @@ "6705": [0, 1, 1], "6706": [0, 1, 1], "6713": [0, 1, 1], - "female": {}, + "female": { + "6215": [0, 1, 1] + }, "back": { "3-mega": [0, 2, 2], "6-mega-x": [0, 2, 2], @@ -2470,7 +2472,10 @@ "6571": [0, 1, 1], "6705": [0, 1, 1], "6706": [0, 1, 1], - "6713": [0, 1, 1] + "6713": [0, 1, 1], + "female": { + "6215": [0, 1, 1] + } } } } diff --git a/public/images/pokemon/variant/back/618.json b/public/images/pokemon/variant/back/618.json new file mode 100644 index 00000000000..d4db4967946 --- /dev/null +++ b/public/images/pokemon/variant/back/618.json @@ -0,0 +1,40 @@ +{ + "1": { + "cebd00": "bdac99", + "ffff00": "f3e6dd", + "6b6319": "987b6d", + "081019": "081019", + "52423a": "312118", + "6b524a": "4a342a", + "bd846b": "8c3841", + "846b63": "6b3838", + "d69c84": "ad4c4c", + "efce42": "eac2bd", + "d6cec5": "d6cec5", + "ffffff": "ffffff", + "081018": "081018", + "735a52": "564038", + "735a53": "564038", + "9c8473": "a08773", + "bda59c": "e6dbd6" + }, + "2": { + "cebd00": "58536b", + "ffff00": "707488", + "6b6319": "39314a", + "081019": "081019", + "52423a": "5a2e2e", + "6b524a": "804e48", + "bd846b": "cec9b1", + "846b63": "9c7765", + "d69c84": "f0ead6", + "efce42": "9fadb9", + "d6cec5": "4c8c4c", + "ffffff": "79a962", + "081018": "204a29", + "735a52": "885011", + "735a53": "735555", + "9c8473": "c18a2c", + "bda59c": "efc44b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/618_2.json b/public/images/pokemon/variant/back/618_2.json deleted file mode 100644 index d82c52e26e2..00000000000 --- a/public/images/pokemon/variant/back/618_2.json +++ /dev/null @@ -1,2750 +0,0 @@ -{ - "textures": [ - { - "image": "618_2.png", - "format": "RGBA8888", - "size": { - "w": 221, - "h": 221 - }, - "scale": 1, - "frames": [ - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 76, - "h": 27 - }, - "frame": { - "x": 0, - "y": 61, - "w": 76, - "h": 27 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 76, - "h": 27 - }, - "frame": { - "x": 0, - "y": 61, - "w": 76, - "h": 27 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 76, - "h": 27 - }, - "frame": { - "x": 0, - "y": 61, - "w": 76, - "h": 27 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 76, - "h": 27 - }, - "frame": { - "x": 0, - "y": 61, - "w": 76, - "h": 27 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 76, - "h": 26 - }, - "frame": { - "x": 76, - "y": 87, - "w": 76, - "h": 26 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 76, - "h": 26 - }, - "frame": { - "x": 76, - "y": 87, - "w": 76, - "h": 26 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 76, - "h": 26 - }, - "frame": { - "x": 76, - "y": 87, - "w": 76, - "h": 26 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 76, - "h": 26 - }, - "frame": { - "x": 76, - "y": 87, - "w": 76, - "h": 26 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:7ed241f9d4e0679b62ab26da17057d65:739de537da7171a9caf5769b4458f68f:22e585907b89e90c4fc3ab2512d175fd$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/618_2.png b/public/images/pokemon/variant/back/618_2.png deleted file mode 100644 index a0077a1f023..00000000000 Binary files a/public/images/pokemon/variant/back/618_2.png and /dev/null differ diff --git a/public/images/pokemon/variant/back/618_3.json b/public/images/pokemon/variant/back/618_3.json deleted file mode 100644 index 17c49c5e59b..00000000000 --- a/public/images/pokemon/variant/back/618_3.json +++ /dev/null @@ -1,2750 +0,0 @@ -{ - "textures": [ - { - "image": "618_3.png", - "format": "RGBA8888", - "size": { - "w": 221, - "h": 221 - }, - "scale": 1, - "frames": [ - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0123.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0124.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 77, - "h": 30 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 30 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 77, - "h": 26 - }, - "frame": { - "x": 77, - "y": 0, - "w": 77, - "h": 26 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 32 - }, - "frame": { - "x": 77, - "y": 26, - "w": 76, - "h": 32 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 31 - }, - "frame": { - "x": 0, - "y": 30, - "w": 76, - "h": 31 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0125.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0126.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 3, - "w": 76, - "h": 29 - }, - "frame": { - "x": 76, - "y": 58, - "w": 76, - "h": 29 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 76, - "h": 27 - }, - "frame": { - "x": 0, - "y": 61, - "w": 76, - "h": 27 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 76, - "h": 27 - }, - "frame": { - "x": 0, - "y": 61, - "w": 76, - "h": 27 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 76, - "h": 27 - }, - "frame": { - "x": 0, - "y": 61, - "w": 76, - "h": 27 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 76, - "h": 27 - }, - "frame": { - "x": 0, - "y": 61, - "w": 76, - "h": 27 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 76, - "h": 26 - }, - "frame": { - "x": 76, - "y": 87, - "w": 76, - "h": 26 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 76, - "h": 26 - }, - "frame": { - "x": 76, - "y": 87, - "w": 76, - "h": 26 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 76, - "h": 26 - }, - "frame": { - "x": 76, - "y": 87, - "w": 76, - "h": 26 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 6, - "w": 76, - "h": 26 - }, - "frame": { - "x": 76, - "y": 87, - "w": 76, - "h": 26 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 88, - "w": 75, - "h": 32 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 32 - }, - "frame": { - "x": 0, - "y": 120, - "w": 75, - "h": 32 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 73, - "h": 32 - }, - "frame": { - "x": 0, - "y": 152, - "w": 73, - "h": 32 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 73, - "h": 31 - }, - "frame": { - "x": 0, - "y": 184, - "w": 73, - "h": 31 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 73, - "h": 30 - }, - "frame": { - "x": 73, - "y": 152, - "w": 73, - "h": 30 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 2, - "y": 4, - "w": 75, - "h": 27 - }, - "frame": { - "x": 146, - "y": 113, - "w": 75, - "h": 27 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0127.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0128.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 74, - "h": 28 - }, - "frame": { - "x": 146, - "y": 140, - "w": 74, - "h": 28 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 29 - }, - "frame": { - "x": 146, - "y": 168, - "w": 73, - "h": 29 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0129.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - }, - { - "filename": "0130.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 77, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 3, - "w": 73, - "h": 28 - }, - "frame": { - "x": 73, - "y": 182, - "w": 73, - "h": 28 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:7ed241f9d4e0679b62ab26da17057d65:739de537da7171a9caf5769b4458f68f:22e585907b89e90c4fc3ab2512d175fd$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/618_3.png b/public/images/pokemon/variant/back/618_3.png deleted file mode 100644 index aaba24cfc58..00000000000 Binary files a/public/images/pokemon/variant/back/618_3.png and /dev/null differ diff --git a/public/images/pokemon/variant/exp/back/female/6215.json b/public/images/pokemon/variant/exp/back/female/6215.json new file mode 100644 index 00000000000..a66e3780d12 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/female/6215.json @@ -0,0 +1,32 @@ +{ + "1": { + "724ca2": "12968b", + "9c9bce": "ae8976", + "503678": "0f5d6d", + "956cbe": "31dabb", + "514a80": "402010", + "dcdbf7": "d0b3a4", + "080808": "080808", + "28234b": "220d0a", + "7d6ca4": "672e26", + "584d80": "401914", + "f6f6ff": "f6f6ff", + "bdbdc5": "bdbdc5", + "c52973": "ea903f" + }, + "2": { + "724ca2": "982e33", + "9c9bce": "3c8775", + "503678": "601522", + "956cbe": "cc5427", + "514a80": "14273a", + "dcdbf7": "60ae7e", + "080808": "080808", + "28234b": "0a191e", + "7d6ca4": "395962", + "584d80": "1c3942", + "f6f6ff": "f6f6ff", + "bdbdc5": "bdbdc5", + "c52973": "f49633" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/female/6215.json b/public/images/pokemon/variant/exp/female/6215.json new file mode 100644 index 00000000000..3198424563b --- /dev/null +++ b/public/images/pokemon/variant/exp/female/6215.json @@ -0,0 +1,38 @@ +{ + "1": { + "503678": "0f5d6d", + "080808": "080808", + "514a80": "402010", + "956cbe": "31dabb", + "9c9bce": "ae8976", + "724ca2": "12968b", + "dcdbf7": "d0b3a4", + "7d6ca4": "853a36", + "c58b08": "6e6f6f", + "ffde7b": "a7a7a7", + "584d80": "562627", + "28234b": "220d0a", + "c52973": "ea903f", + "bdbdc5": "bdbdc5", + "f6f6ff": "f6f6ff", + "000000": "000000" + }, + "2": { + "503678": "601522", + "080808": "080808", + "514a80": "14273a", + "956cbe": "cc5427", + "9c9bce": "3c8775", + "724ca2": "982e33", + "dcdbf7": "60ae7e", + "7d6ca4": "395962", + "c58b08": "ffa341", + "ffde7b": "ffe07e", + "584d80": "1c3942", + "28234b": "0a191e", + "c52973": "f49633", + "bdbdc5": "bdbdc5", + "f6f6ff": "f6f6ff", + "000000": "000000" + } +} \ No newline at end of file diff --git a/public/images/pokemon_icons_7.json b/public/images/pokemon_icons_7.json index 0523a232d79..03eeba88a70 100644 --- a/public/images/pokemon_icons_7.json +++ b/public/images/pokemon_icons_7.json @@ -5,7 +5,7 @@ "format": "RGBA8888", "size": { "w": 502, - "h": 323 + "h": 325 }, "scale": 1, "frames": [ @@ -324,48 +324,6 @@ "h": 29 } }, - { - "filename": "795", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 28, - "h": 30 - }, - "frame": { - "x": 0, - "y": 293, - "w": 28, - "h": 30 - } - }, - { - "filename": "795s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 28, - "h": 30 - }, - "frame": { - "x": 28, - "y": 293, - "w": 28, - "h": 30 - } - }, { "filename": "798s", "rotated": false, @@ -381,8 +339,8 @@ "h": 29 }, "frame": { - "x": 112, - "y": 0, + "x": 0, + "y": 293, "w": 31, "h": 29 } @@ -402,7 +360,7 @@ "h": 28 }, "frame": { - "x": 143, + "x": 112, "y": 0, "w": 30, "h": 28 @@ -423,8 +381,8 @@ "h": 28 }, "frame": { - "x": 173, - "y": 0, + "x": 108, + "y": 28, "w": 30, "h": 28 } @@ -444,7 +402,7 @@ "h": 28 }, "frame": { - "x": 203, + "x": 142, "y": 0, "w": 29, "h": 28 @@ -465,8 +423,8 @@ "h": 28 }, "frame": { - "x": 232, - "y": 0, + "x": 138, + "y": 28, "w": 29, "h": 28 } @@ -486,7 +444,7 @@ "h": 27 }, "frame": { - "x": 261, + "x": 171, "y": 0, "w": 29, "h": 27 @@ -507,7 +465,7 @@ "h": 27 }, "frame": { - "x": 290, + "x": 200, "y": 0, "w": 29, "h": 27 @@ -528,7 +486,7 @@ "h": 27 }, "frame": { - "x": 319, + "x": 229, "y": 0, "w": 28, "h": 27 @@ -549,7 +507,7 @@ "h": 27 }, "frame": { - "x": 347, + "x": 257, "y": 0, "w": 28, "h": 27 @@ -570,7 +528,7 @@ "h": 23 }, "frame": { - "x": 375, + "x": 285, "y": 0, "w": 32, "h": 23 @@ -591,14 +549,14 @@ "h": 23 }, "frame": { - "x": 407, + "x": 317, "y": 0, "w": 32, "h": 23 } }, { - "filename": "800", + "filename": "795", "rotated": false, "trimmed": true, "sourceSize": { @@ -619,7 +577,7 @@ } }, { - "filename": "800s", + "filename": "795s", "rotated": false, "trimmed": true, "sourceSize": { @@ -639,6 +597,48 @@ "h": 30 } }, + { + "filename": "800", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 28, + "h": 30 + }, + "frame": { + "x": 32, + "y": 145, + "w": 28, + "h": 30 + } + }, + { + "filename": "800s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 0, + "w": 28, + "h": 30 + }, + "frame": { + "x": 32, + "y": 175, + "w": 28, + "h": 30 + } + }, { "filename": "805", "rotated": false, @@ -654,8 +654,8 @@ "h": 30 }, "frame": { - "x": 32, - "y": 145, + "x": 31, + "y": 205, "w": 28, "h": 30 } @@ -674,31 +674,10 @@ "w": 28, "h": 30 }, - "frame": { - "x": 32, - "y": 175, - "w": 28, - "h": 30 - } - }, - { - "filename": "773", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 26, - "h": 30 - }, "frame": { "x": 31, - "y": 205, - "w": 26, + "y": 235, + "w": 28, "h": 30 } }, @@ -718,32 +697,11 @@ }, "frame": { "x": 31, - "y": 235, + "y": 265, "w": 26, "h": 30 } }, - { - "filename": "792", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 28, - "h": 28 - }, - "frame": { - "x": 31, - "y": 265, - "w": 28, - "h": 28 - } - }, { "filename": "773-dark", "rotated": false, @@ -759,8 +717,8 @@ "h": 30 }, "frame": { - "x": 56, - "y": 293, + "x": 31, + "y": 295, "w": 26, "h": 30 } @@ -780,7 +738,7 @@ "h": 25 }, "frame": { - "x": 439, + "x": 349, "y": 0, "w": 30, "h": 25 @@ -801,12 +759,75 @@ "h": 25 }, "frame": { - "x": 469, + "x": 379, "y": 0, "w": 30, "h": 25 } }, + { + "filename": "785", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 3, + "w": 28, + "h": 26 + }, + "frame": { + "x": 409, + "y": 0, + "w": 28, + "h": 26 + } + }, + { + "filename": "785s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 3, + "w": 28, + "h": 26 + }, + "frame": { + "x": 437, + "y": 0, + "w": 28, + "h": 26 + } + }, + { + "filename": "792", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 6, + "y": 1, + "w": 28, + "h": 28 + }, + "frame": { + "x": 465, + "y": 0, + "w": 28, + "h": 28 + } + }, { "filename": "792s", "rotated": false, @@ -822,8 +843,8 @@ "h": 28 }, "frame": { - "x": 108, - "y": 29, + "x": 70, + "y": 57, "w": 28, "h": 28 } @@ -843,8 +864,8 @@ "h": 30 }, "frame": { - "x": 70, - "y": 57, + "x": 62, + "y": 85, "w": 26, "h": 30 } @@ -864,8 +885,8 @@ "h": 30 }, "frame": { - "x": 96, - "y": 57, + "x": 62, + "y": 115, "w": 26, "h": 30 } @@ -885,8 +906,8 @@ "h": 30 }, "frame": { - "x": 62, - "y": 87, + "x": 60, + "y": 145, "w": 26, "h": 30 } @@ -906,8 +927,8 @@ "h": 30 }, "frame": { - "x": 88, - "y": 87, + "x": 60, + "y": 175, "w": 26, "h": 30 } @@ -927,8 +948,8 @@ "h": 30 }, "frame": { - "x": 62, - "y": 117, + "x": 59, + "y": 205, "w": 26, "h": 30 } @@ -948,8 +969,8 @@ "h": 30 }, "frame": { - "x": 88, - "y": 117, + "x": 59, + "y": 235, "w": 26, "h": 30 } @@ -969,8 +990,8 @@ "h": 30 }, "frame": { - "x": 60, - "y": 147, + "x": 57, + "y": 265, "w": 26, "h": 30 } @@ -990,12 +1011,54 @@ "h": 30 }, "frame": { - "x": 86, - "y": 147, + "x": 57, + "y": 295, "w": 26, "h": 30 } }, + { + "filename": "764", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 25, + "h": 30 + }, + "frame": { + "x": 88, + "y": 85, + "w": 25, + "h": 30 + } + }, + { + "filename": "764s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 25, + "h": 30 + }, + "frame": { + "x": 88, + "y": 115, + "w": 25, + "h": 30 + } + }, { "filename": "773-ground", "rotated": false, @@ -1011,8 +1074,8 @@ "h": 30 }, "frame": { - "x": 60, - "y": 177, + "x": 86, + "y": 145, "w": 26, "h": 30 } @@ -1033,7 +1096,7 @@ }, "frame": { "x": 86, - "y": 177, + "y": 175, "w": 26, "h": 30 } @@ -1053,8 +1116,8 @@ "h": 30 }, "frame": { - "x": 57, - "y": 207, + "x": 85, + "y": 205, "w": 26, "h": 30 } @@ -1074,54 +1137,12 @@ "h": 30 }, "frame": { - "x": 83, - "y": 207, + "x": 85, + "y": 235, "w": 26, "h": 30 } }, - { - "filename": "2026", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 26, - "h": 28 - }, - "frame": { - "x": 57, - "y": 237, - "w": 26, - "h": 28 - } - }, - { - "filename": "772", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 25, - "h": 28 - }, - "frame": { - "x": 59, - "y": 265, - "w": 25, - "h": 28 - } - }, { "filename": "773-rock", "rotated": false, @@ -1136,53 +1157,11 @@ "w": 26, "h": 30 }, - "frame": { - "x": 82, - "y": 293, - "w": 26, - "h": 30 - } - }, - { - "filename": "2026s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 26, - "h": 28 - }, "frame": { "x": 83, - "y": 237, - "w": 26, - "h": 28 - } - }, - { - "filename": "772s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 2, - "w": 25, - "h": 28 - }, - "frame": { - "x": 84, "y": 265, - "w": 25, - "h": 28 + "w": 26, + "h": 30 } }, { @@ -1200,14 +1179,14 @@ "h": 30 }, "frame": { - "x": 108, - "y": 293, + "x": 83, + "y": 295, "w": 26, "h": 30 } }, { - "filename": "764", + "filename": "772", "rotated": false, "trimmed": true, "sourceSize": { @@ -1215,16 +1194,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 0, + "x": 8, + "y": 2, "w": 25, - "h": 30 + "h": 28 }, "frame": { - "x": 122, + "x": 98, "y": 57, "w": 25, - "h": 30 + "h": 28 } }, { @@ -1242,14 +1221,14 @@ "h": 30 }, "frame": { - "x": 114, - "y": 87, + "x": 123, + "y": 56, "w": 26, "h": 30 } }, { - "filename": "773s", + "filename": "773", "rotated": false, "trimmed": true, "sourceSize": { @@ -1263,8 +1242,8 @@ "h": 30 }, "frame": { - "x": 114, - "y": 117, + "x": 149, + "y": 56, "w": 26, "h": 30 } @@ -1284,8 +1263,8 @@ "h": 30 }, "frame": { - "x": 112, - "y": 147, + "x": 113, + "y": 86, "w": 26, "h": 30 } @@ -1305,8 +1284,8 @@ "h": 30 }, "frame": { - "x": 112, - "y": 177, + "x": 139, + "y": 86, "w": 26, "h": 30 } @@ -1326,8 +1305,8 @@ "h": 30 }, "frame": { - "x": 109, - "y": 207, + "x": 113, + "y": 116, "w": 26, "h": 30 } @@ -1347,33 +1326,12 @@ "h": 30 }, "frame": { - "x": 109, - "y": 237, + "x": 139, + "y": 116, "w": 26, "h": 30 } }, - { - "filename": "785", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 28, - "h": 26 - }, - "frame": { - "x": 109, - "y": 267, - "w": 28, - "h": 26 - } - }, { "filename": "773s-fairy", "rotated": false, @@ -1389,33 +1347,12 @@ "h": 30 }, "frame": { - "x": 134, - "y": 293, + "x": 112, + "y": 146, "w": 26, "h": 30 } }, - { - "filename": "801", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 20, - "h": 28 - }, - "frame": { - "x": 136, - "y": 29, - "w": 20, - "h": 28 - } - }, { "filename": "773s-fighting", "rotated": false, @@ -1431,8 +1368,8 @@ "h": 30 }, "frame": { - "x": 156, - "y": 28, + "x": 138, + "y": 146, "w": 26, "h": 30 } @@ -1452,8 +1389,8 @@ "h": 30 }, "frame": { - "x": 182, - "y": 28, + "x": 112, + "y": 176, "w": 26, "h": 30 } @@ -1473,8 +1410,8 @@ "h": 30 }, "frame": { - "x": 208, - "y": 28, + "x": 138, + "y": 176, "w": 26, "h": 30 } @@ -1494,8 +1431,8 @@ "h": 30 }, "frame": { - "x": 234, - "y": 28, + "x": 111, + "y": 206, "w": 26, "h": 30 } @@ -1515,8 +1452,8 @@ "h": 30 }, "frame": { - "x": 147, - "y": 58, + "x": 137, + "y": 206, "w": 26, "h": 30 } @@ -1536,8 +1473,8 @@ "h": 30 }, "frame": { - "x": 173, - "y": 58, + "x": 111, + "y": 236, "w": 26, "h": 30 } @@ -1557,8 +1494,8 @@ "h": 30 }, "frame": { - "x": 199, - "y": 58, + "x": 137, + "y": 236, "w": 26, "h": 30 } @@ -1578,12 +1515,33 @@ "h": 30 }, "frame": { - "x": 225, - "y": 58, + "x": 109, + "y": 266, "w": 26, "h": 30 } }, + { + "filename": "794", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 1, + "w": 25, + "h": 29 + }, + "frame": { + "x": 109, + "y": 296, + "w": 25, + "h": 29 + } + }, { "filename": "773s-psychic", "rotated": false, @@ -1599,12 +1557,54 @@ "h": 30 }, "frame": { - "x": 140, - "y": 88, + "x": 135, + "y": 266, "w": 26, "h": 30 } }, + { + "filename": "794s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 1, + "w": 25, + "h": 29 + }, + "frame": { + "x": 134, + "y": 296, + "w": 25, + "h": 29 + } + }, + { + "filename": "796", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 1, + "w": 18, + "h": 29 + }, + "frame": { + "x": 159, + "y": 296, + "w": 18, + "h": 29 + } + }, { "filename": "773s-rock", "rotated": false, @@ -1620,12 +1620,54 @@ "h": 30 }, "frame": { - "x": 166, - "y": 88, + "x": 161, + "y": 266, "w": 26, "h": 30 } }, + { + "filename": "796s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 1, + "w": 18, + "h": 29 + }, + "frame": { + "x": 177, + "y": 296, + "w": 18, + "h": 29 + } + }, + { + "filename": "772s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 2, + "w": 25, + "h": 28 + }, + "frame": { + "x": 167, + "y": 28, + "w": 25, + "h": 28 + } + }, { "filename": "773s-steel", "rotated": false, @@ -1642,7 +1684,7 @@ }, "frame": { "x": 192, - "y": 88, + "y": 27, "w": 26, "h": 30 } @@ -1663,13 +1705,13 @@ }, "frame": { "x": 218, - "y": 88, + "y": 27, "w": 26, "h": 30 } }, { - "filename": "764s", + "filename": "773s", "rotated": false, "trimmed": true, "sourceSize": { @@ -1677,123 +1719,18 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, + "x": 7, "y": 0, - "w": 25, + "w": 26, "h": 30 }, "frame": { - "x": 140, - "y": 118, - "w": 25, + "x": 244, + "y": 27, + "w": 26, "h": 30 } }, - { - "filename": "785s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 3, - "w": 28, - "h": 26 - }, - "frame": { - "x": 165, - "y": 118, - "w": 28, - "h": 26 - } - }, - { - "filename": "2075", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 29, - "h": 24 - }, - "frame": { - "x": 193, - "y": 118, - "w": 29, - "h": 24 - } - }, - { - "filename": "794", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 1, - "w": 25, - "h": 29 - }, - "frame": { - "x": 138, - "y": 148, - "w": 25, - "h": 29 - } - }, - { - "filename": "794s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 1, - "w": 25, - "h": 29 - }, - "frame": { - "x": 138, - "y": 177, - "w": 25, - "h": 29 - } - }, - { - "filename": "726", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 222, - "y": 118, - "w": 23, - "h": 24 - } - }, { "filename": "2103", "rotated": false, @@ -1809,12 +1746,75 @@ "h": 30 }, "frame": { - "x": 251, - "y": 58, + "x": 270, + "y": 27, "w": 21, "h": 30 } }, + { + "filename": "2026", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 1, + "w": 26, + "h": 28 + }, + "frame": { + "x": 291, + "y": 23, + "w": 26, + "h": 28 + } + }, + { + "filename": "2026s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 1, + "w": 26, + "h": 28 + }, + "frame": { + "x": 317, + "y": 23, + "w": 26, + "h": 28 + } + }, + { + "filename": "2075", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 29, + "h": 24 + }, + "frame": { + "x": 343, + "y": 25, + "w": 29, + "h": 24 + } + }, { "filename": "2075s", "rotated": false, @@ -1830,180 +1830,12 @@ "h": 24 }, "frame": { - "x": 244, - "y": 88, + "x": 372, + "y": 25, "w": 29, "h": 24 } }, - { - "filename": "748", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 26, - "h": 25 - }, - "frame": { - "x": 245, - "y": 112, - "w": 26, - "h": 25 - } - }, - { - "filename": "2103s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 21, - "h": 30 - }, - "frame": { - "x": 260, - "y": 28, - "w": 21, - "h": 30 - } - }, - { - "filename": "748s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 26, - "h": 25 - }, - "frame": { - "x": 281, - "y": 27, - "w": 26, - "h": 25 - } - }, - { - "filename": "2089", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 3, - "w": 26, - "h": 25 - }, - "frame": { - "x": 307, - "y": 27, - "w": 26, - "h": 25 - } - }, - { - "filename": "2089s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 3, - "w": 26, - "h": 25 - }, - "frame": { - "x": 333, - "y": 27, - "w": 26, - "h": 25 - } - }, - { - "filename": "724", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 19, - "h": 25 - }, - "frame": { - "x": 359, - "y": 27, - "w": 19, - "h": 25 - } - }, - { - "filename": "745-dusk", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 25, - "h": 25 - }, - "frame": { - "x": 378, - "y": 23, - "w": 25, - "h": 25 - } - }, - { - "filename": "745s-dusk", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 25, - "h": 25 - }, - "frame": { - "x": 403, - "y": 23, - "w": 25, - "h": 25 - } - }, { "filename": "746-school", "rotated": false, @@ -2019,8 +1851,8 @@ "h": 22 }, "frame": { - "x": 428, - "y": 25, + "x": 401, + "y": 26, "w": 28, "h": 22 } @@ -2040,14 +1872,14 @@ "h": 22 }, "frame": { - "x": 456, - "y": 25, + "x": 429, + "y": 26, "w": 28, "h": 22 } }, { - "filename": "796", + "filename": "760", "rotated": false, "trimmed": true, "sourceSize": { @@ -2055,20 +1887,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 1, - "w": 18, - "h": 29 + "x": 13, + "y": 4, + "w": 17, + "h": 24 }, "frame": { - "x": 484, - "y": 25, - "w": 18, - "h": 29 + "x": 175, + "y": 56, + "w": 17, + "h": 24 } }, { - "filename": "796s", + "filename": "748", "rotated": false, "trimmed": true, "sourceSize": { @@ -2076,16 +1908,121 @@ "h": 30 }, "spriteSourceSize": { - "x": 10, - "y": 1, - "w": 18, - "h": 29 + "x": 7, + "y": 5, + "w": 26, + "h": 25 }, "frame": { - "x": 272, - "y": 58, - "w": 18, - "h": 29 + "x": 192, + "y": 57, + "w": 26, + "h": 25 + } + }, + { + "filename": "748s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 26, + "h": 25 + }, + "frame": { + "x": 218, + "y": 57, + "w": 26, + "h": 25 + } + }, + { + "filename": "2089", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 3, + "w": 26, + "h": 25 + }, + "frame": { + "x": 244, + "y": 57, + "w": 26, + "h": 25 + } + }, + { + "filename": "745-dusk", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 25, + "h": 25 + }, + "frame": { + "x": 270, + "y": 57, + "w": 25, + "h": 25 + } + }, + { + "filename": "2089s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 3, + "w": 26, + "h": 25 + }, + "frame": { + "x": 295, + "y": 51, + "w": 26, + "h": 25 + } + }, + { + "filename": "745s-dusk", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 25, + "h": 25 + }, + "frame": { + "x": 321, + "y": 51, + "w": 25, + "h": 25 } }, { @@ -2103,8 +2040,8 @@ "h": 26 }, "frame": { - "x": 290, - "y": 52, + "x": 346, + "y": 49, "w": 24, "h": 26 } @@ -2124,159 +2061,12 @@ "h": 26 }, "frame": { - "x": 314, - "y": 52, + "x": 370, + "y": 49, "w": 24, "h": 26 } }, - { - "filename": "750", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 25, - "h": 24 - }, - "frame": { - "x": 338, - "y": 52, - "w": 25, - "h": 24 - } - }, - { - "filename": "724s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 19, - "h": 25 - }, - "frame": { - "x": 273, - "y": 87, - "w": 19, - "h": 25 - } - }, - { - "filename": "776", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 23, - "h": 26 - }, - "frame": { - "x": 271, - "y": 112, - "w": 23, - "h": 26 - } - }, - { - "filename": "750s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 25, - "h": 24 - }, - "frame": { - "x": 292, - "y": 78, - "w": 25, - "h": 24 - } - }, - { - "filename": "726s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 317, - "y": 78, - "w": 23, - "h": 24 - } - }, - { - "filename": "776s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 23, - "h": 26 - }, - "frame": { - "x": 340, - "y": 76, - "w": 23, - "h": 26 - } - }, - { - "filename": "801-original", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 20, - "h": 28 - }, - "frame": { - "x": 363, - "y": 52, - "w": 20, - "h": 28 - } - }, { "filename": "765", "rotated": false, @@ -2292,14 +2082,56 @@ "h": 21 }, "frame": { - "x": 383, - "y": 48, + "x": 457, + "y": 28, "w": 28, "h": 21 } }, { - "filename": "727", + "filename": "760s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 4, + "w": 17, + "h": 24 + }, + "frame": { + "x": 485, + "y": 28, + "w": 17, + "h": 24 + } + }, + { + "filename": "2103s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 21, + "h": 30 + }, + "frame": { + "x": 165, + "y": 86, + "w": 21, + "h": 30 + } + }, + { + "filename": "783", "rotated": false, "trimmed": true, "sourceSize": { @@ -2308,14 +2140,56 @@ }, "spriteSourceSize": { "x": 9, + "y": 3, + "w": 21, + "h": 27 + }, + "frame": { + "x": 165, + "y": 116, + "w": 21, + "h": 27 + } + }, + { + "filename": "750", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, "y": 4, - "w": 23, + "w": 25, "h": 24 }, "frame": { - "x": 363, - "y": 80, - "w": 23, + "x": 186, + "y": 82, + "w": 25, + "h": 24 + } + }, + { + "filename": "750s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 25, + "h": 24 + }, + "frame": { + "x": 211, + "y": 82, + "w": 25, "h": 24 } }, @@ -2334,159 +2208,12 @@ "h": 21 }, "frame": { - "x": 294, - "y": 102, + "x": 186, + "y": 106, "w": 28, "h": 21 } }, - { - "filename": "725", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 25, - "h": 21 - }, - "frame": { - "x": 322, - "y": 102, - "w": 25, - "h": 21 - } - }, - { - "filename": "780", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 27, - "h": 19 - }, - "frame": { - "x": 294, - "y": 123, - "w": 27, - "h": 19 - } - }, - { - "filename": "780s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 27, - "h": 19 - }, - "frame": { - "x": 321, - "y": 123, - "w": 27, - "h": 19 - } - }, - { - "filename": "723", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 411, - "y": 48, - "w": 17, - "h": 22 - } - }, - { - "filename": "745", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 23 - }, - "frame": { - "x": 428, - "y": 47, - "w": 25, - "h": 23 - } - }, - { - "filename": "745s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 23 - }, - "frame": { - "x": 453, - "y": 47, - "w": 25, - "h": 23 - } - }, - { - "filename": "768", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 478, - "y": 54, - "w": 24, - "h": 23 - } - }, { "filename": "2028", "rotated": false, @@ -2502,8 +2229,8 @@ "h": 24 }, "frame": { - "x": 386, - "y": 69, + "x": 236, + "y": 82, "w": 25, "h": 24 } @@ -2523,56 +2250,14 @@ "h": 24 }, "frame": { - "x": 411, - "y": 70, + "x": 261, + "y": 82, "w": 25, "h": 24 } }, { - "filename": "727s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 436, - "y": 70, - "w": 23, - "h": 24 - } - }, - { - "filename": "781", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 3, - "w": 19, - "h": 25 - }, - "frame": { - "x": 459, - "y": 70, - "w": 19, - "h": 25 - } - }, - { - "filename": "768s", + "filename": "725", "rotated": false, "trimmed": true, "sourceSize": { @@ -2581,15 +2266,15 @@ }, "spriteSourceSize": { "x": 8, - "y": 5, - "w": 24, - "h": 23 + "y": 7, + "w": 25, + "h": 21 }, "frame": { - "x": 478, - "y": 77, - "w": 24, - "h": 23 + "x": 214, + "y": 106, + "w": 25, + "h": 21 } }, { @@ -2607,14 +2292,14 @@ "h": 21 }, "frame": { - "x": 386, - "y": 93, + "x": 239, + "y": 106, "w": 25, "h": 21 } }, { - "filename": "2020", + "filename": "726", "rotated": false, "trimmed": true, "sourceSize": { @@ -2623,40 +2308,19 @@ }, "spriteSourceSize": { "x": 8, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 411, - "y": 94, - "w": 25, - "h": 22 - } - }, - { - "filename": "729", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 5, + "y": 4, "w": 23, "h": 24 }, "frame": { - "x": 436, - "y": 94, + "x": 264, + "y": 106, "w": 23, "h": 24 } }, { - "filename": "781s", + "filename": "780", "rotated": false, "trimmed": true, "sourceSize": { @@ -2664,62 +2328,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, - "y": 3, - "w": 19, - "h": 25 - }, - "frame": { - "x": 459, - "y": 95, - "w": 19, - "h": 25 - } - }, - { - "filename": "2105", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 478, - "y": 100, - "w": 24, - "h": 23 - } - }, - { - "filename": "761", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 16, + "x": 7, + "y": 7, + "w": 27, "h": 19 }, "frame": { - "x": 347, - "y": 102, - "w": 16, + "x": 186, + "y": 127, + "w": 27, "h": 19 } }, { - "filename": "729s", + "filename": "780s", "rotated": false, "trimmed": true, "sourceSize": { @@ -2727,184 +2349,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, - "y": 5, - "w": 23, - "h": 24 - }, - "frame": { - "x": 363, - "y": 104, - "w": 23, - "h": 24 - } - }, - { - "filename": "734", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 10, - "w": 25, - "h": 16 - }, - "frame": { - "x": 386, - "y": 114, - "w": 25, - "h": 16 - } - }, - { - "filename": "734s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 10, - "w": 25, - "h": 16 - }, - "frame": { - "x": 411, - "y": 116, - "w": 25, - "h": 16 - } - }, - { - "filename": "733", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, + "x": 7, "y": 7, - "w": 23, - "h": 21 + "w": 27, + "h": 19 }, "frame": { - "x": 436, - "y": 118, - "w": 23, - "h": 21 - } - }, - { - "filename": "732", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 19, - "h": 22 - }, - "frame": { - "x": 459, - "y": 120, - "w": 19, - "h": 22 - } - }, - { - "filename": "2105s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 478, - "y": 123, - "w": 24, - "h": 23 - } - }, - { - "filename": "2050", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 10, - "w": 15, - "h": 18 - }, - "frame": { - "x": 348, - "y": 121, - "w": 15, - "h": 18 - } - }, - { - "filename": "733s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 7, - "w": 23, - "h": 21 - }, - "frame": { - "x": 363, - "y": 128, - "w": 23, - "h": 21 - } - }, - { - "filename": "2020s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 25, - "h": 22 - }, - "frame": { - "x": 386, - "y": 130, - "w": 25, - "h": 22 + "x": 213, + "y": 127, + "w": 27, + "h": 19 } }, { @@ -2922,14 +2376,14 @@ "h": 22 }, "frame": { - "x": 411, - "y": 132, + "x": 240, + "y": 127, "w": 24, "h": 22 } }, { - "filename": "758s", + "filename": "726s", "rotated": false, "trimmed": true, "sourceSize": { @@ -2937,104 +2391,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 24, - "h": 22 + "x": 8, + "y": 4, + "w": 23, + "h": 24 }, "frame": { - "x": 435, - "y": 139, - "w": 24, - "h": 22 + "x": 264, + "y": 130, + "w": 23, + "h": 24 } }, { - "filename": "732s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 19, - "h": 22 - }, - "frame": { - "x": 459, - "y": 142, - "w": 19, - "h": 22 - } - }, - { - "filename": "2053", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 24, - "h": 22 - }, - "frame": { - "x": 478, - "y": 146, - "w": 24, - "h": 22 - } - }, - { - "filename": "801s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 20, - "h": 28 - }, - "frame": { - "x": 135, - "y": 207, - "w": 20, - "h": 28 - } - }, - { - "filename": "801s-original", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 2, - "w": 20, - "h": 28 - }, - "frame": { - "x": 135, - "y": 235, - "w": 20, - "h": 28 - } - }, - { - "filename": "783", + "filename": "727", "rotated": false, "trimmed": true, "sourceSize": { @@ -3043,15 +2413,78 @@ }, "spriteSourceSize": { "x": 9, - "y": 3, - "w": 21, - "h": 27 + "y": 4, + "w": 23, + "h": 24 }, "frame": { - "x": 137, - "y": 263, - "w": 21, - "h": 27 + "x": 286, + "y": 82, + "w": 23, + "h": 24 + } + }, + { + "filename": "776", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 23, + "h": 26 + }, + "frame": { + "x": 287, + "y": 106, + "w": 23, + "h": 26 + } + }, + { + "filename": "727s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 287, + "y": 132, + "w": 23, + "h": 24 + } + }, + { + "filename": "776s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 23, + "h": 26 + }, + "frame": { + "x": 309, + "y": 76, + "w": 23, + "h": 26 } }, { @@ -3069,8 +2502,8 @@ "h": 27 }, "frame": { - "x": 155, - "y": 206, + "x": 310, + "y": 102, "w": 21, "h": 27 } @@ -3090,8 +2523,8 @@ "h": 26 }, "frame": { - "x": 155, - "y": 233, + "x": 310, + "y": 129, "w": 22, "h": 26 } @@ -3111,8 +2544,8 @@ "h": 26 }, "frame": { - "x": 158, - "y": 259, + "x": 332, + "y": 76, "w": 22, "h": 26 } @@ -3132,12 +2565,306 @@ "h": 26 }, "frame": { - "x": 160, - "y": 285, + "x": 331, + "y": 102, "w": 22, "h": 26 } }, + { + "filename": "745", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 25, + "h": 23 + }, + "frame": { + "x": 354, + "y": 75, + "w": 25, + "h": 23 + } + }, + { + "filename": "788s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 2, + "w": 22, + "h": 26 + }, + "frame": { + "x": 332, + "y": 128, + "w": 22, + "h": 26 + } + }, + { + "filename": "724", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 19, + "h": 25 + }, + "frame": { + "x": 379, + "y": 75, + "w": 19, + "h": 25 + } + }, + { + "filename": "724s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 19, + "h": 25 + }, + "frame": { + "x": 394, + "y": 49, + "w": 19, + "h": 25 + } + }, + { + "filename": "745s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 25, + "h": 23 + }, + "frame": { + "x": 413, + "y": 48, + "w": 25, + "h": 23 + } + }, + { + "filename": "781", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 3, + "w": 19, + "h": 25 + }, + "frame": { + "x": 438, + "y": 48, + "w": 19, + "h": 25 + } + }, + { + "filename": "729", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 23, + "h": 24 + }, + "frame": { + "x": 457, + "y": 49, + "w": 23, + "h": 24 + } + }, + { + "filename": "806", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 3, + "w": 22, + "h": 25 + }, + "frame": { + "x": 480, + "y": 52, + "w": 22, + "h": 25 + } + }, + { + "filename": "801-original", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 2, + "w": 20, + "h": 28 + }, + "frame": { + "x": 398, + "y": 74, + "w": 20, + "h": 28 + } + }, + { + "filename": "801", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 2, + "w": 20, + "h": 28 + }, + "frame": { + "x": 418, + "y": 71, + "w": 20, + "h": 28 + } + }, + { + "filename": "803", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 3, + "w": 23, + "h": 25 + }, + "frame": { + "x": 438, + "y": 73, + "w": 23, + "h": 25 + } + }, + { + "filename": "781s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 3, + "w": 19, + "h": 25 + }, + "frame": { + "x": 461, + "y": 73, + "w": 19, + "h": 25 + } + }, + { + "filename": "806s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 3, + "w": 22, + "h": 25 + }, + "frame": { + "x": 480, + "y": 77, + "w": 22, + "h": 25 + } + }, + { + "filename": "734", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 10, + "w": 25, + "h": 16 + }, + "frame": { + "x": 354, + "y": 98, + "w": 25, + "h": 16 + } + }, { "filename": "767", "rotated": false, @@ -3153,14 +2880,35 @@ "h": 14 }, "frame": { - "x": 245, - "y": 137, + "x": 353, + "y": 114, "w": 24, "h": 14 } }, { - "filename": "767s", + "filename": "803s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 3, + "w": 23, + "h": 25 + }, + "frame": { + "x": 354, + "y": 128, + "w": 23, + "h": 25 + } + }, + { + "filename": "732", "rotated": false, "trimmed": true, "sourceSize": { @@ -3169,15 +2917,603 @@ }, "spriteSourceSize": { "x": 10, - "y": 11, - "w": 24, - "h": 14 + "y": 6, + "w": 19, + "h": 22 }, "frame": { - "x": 269, - "y": 138, + "x": 379, + "y": 100, + "w": 19, + "h": 22 + } + }, + { + "filename": "801s-original", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 2, + "w": 20, + "h": 28 + }, + "frame": { + "x": 377, + "y": 122, + "w": 20, + "h": 28 + } + }, + { + "filename": "729s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 23, + "h": 24 + }, + "frame": { + "x": 398, + "y": 102, + "w": 23, + "h": 24 + } + }, + { + "filename": "768", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, "w": 24, - "h": 14 + "h": 23 + }, + "frame": { + "x": 397, + "y": 126, + "w": 24, + "h": 23 + } + }, + { + "filename": "801s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 2, + "w": 20, + "h": 28 + }, + "frame": { + "x": 421, + "y": 99, + "w": 20, + "h": 28 + } + }, + { + "filename": "768s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 441, + "y": 98, + "w": 24, + "h": 23 + } + }, + { + "filename": "735", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 20, + "h": 24 + }, + "frame": { + "x": 421, + "y": 127, + "w": 20, + "h": 24 + } + }, + { + "filename": "770", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 441, + "y": 121, + "w": 23, + "h": 24 + } + }, + { + "filename": "2050", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 10, + "w": 15, + "h": 18 + }, + "frame": { + "x": 465, + "y": 98, + "w": 15, + "h": 18 + } + }, + { + "filename": "756", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 22, + "h": 24 + }, + "frame": { + "x": 480, + "y": 102, + "w": 22, + "h": 24 + } + }, + { + "filename": "2050s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 10, + "w": 15, + "h": 18 + }, + "frame": { + "x": 465, + "y": 116, + "w": 15, + "h": 18 + } + }, + { + "filename": "756s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 5, + "w": 22, + "h": 24 + }, + "frame": { + "x": 480, + "y": 126, + "w": 22, + "h": 24 + } + }, + { + "filename": "761", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 16, + "h": 19 + }, + "frame": { + "x": 464, + "y": 134, + "w": 16, + "h": 19 + } + }, + { + "filename": "802-zenith", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 4, + "w": 22, + "h": 24 + }, + "frame": { + "x": 480, + "y": 150, + "w": 22, + "h": 24 + } + }, + { + "filename": "733", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 23, + "h": 21 + }, + "frame": { + "x": 441, + "y": 145, + "w": 23, + "h": 21 + } + }, + { + "filename": "761s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 16, + "h": 19 + }, + "frame": { + "x": 464, + "y": 153, + "w": 16, + "h": 19 + } + }, + { + "filename": "745-midnight", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 165, + "y": 143, + "w": 21, + "h": 24 + } + }, + { + "filename": "2020", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 25, + "h": 22 + }, + "frame": { + "x": 186, + "y": 146, + "w": 25, + "h": 22 + } + }, + { + "filename": "2020s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 25, + "h": 22 + }, + "frame": { + "x": 211, + "y": 146, + "w": 25, + "h": 22 + } + }, + { + "filename": "802", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 4, + "w": 22, + "h": 24 + }, + "frame": { + "x": 164, + "y": 167, + "w": 22, + "h": 24 + } + }, + { + "filename": "2105", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 186, + "y": 168, + "w": 24, + "h": 23 + } + }, + { + "filename": "2105s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 210, + "y": 168, + "w": 24, + "h": 23 + } + }, + { + "filename": "734s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 10, + "w": 25, + "h": 16 + }, + "frame": { + "x": 164, + "y": 191, + "w": 25, + "h": 16 + } + }, + { + "filename": "770s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 163, + "y": 207, + "w": 23, + "h": 24 + } + }, + { + "filename": "2051", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 163, + "y": 231, + "w": 23, + "h": 24 + } + }, + { + "filename": "758s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 24, + "h": 22 + }, + "frame": { + "x": 189, + "y": 191, + "w": 24, + "h": 22 + } + }, + { + "filename": "2051s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 186, + "y": 213, + "w": 23, + "h": 24 + } + }, + { + "filename": "745s-midnight", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 213, + "y": 191, + "w": 21, + "h": 24 + } + }, + { + "filename": "2053", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 24, + "h": 22 + }, + "frame": { + "x": 209, + "y": 215, + "w": 24, + "h": 22 } }, { @@ -3195,8 +3531,8 @@ "h": 22 }, "frame": { - "x": 293, - "y": 142, + "x": 186, + "y": 237, "w": 24, "h": 22 } @@ -3216,14 +3552,14 @@ "h": 22 }, "frame": { - "x": 317, - "y": 142, + "x": 210, + "y": 237, "w": 23, "h": 22 } }, { - "filename": "769s", + "filename": "802s-zenith", "rotated": false, "trimmed": true, "sourceSize": { @@ -3231,125 +3567,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 8, - "y": 6, - "w": 23, - "h": 22 - }, - "frame": { - "x": 340, - "y": 142, - "w": 23, - "h": 22 - } - }, - { - "filename": "752", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 23, - "h": 18 - }, - "frame": { - "x": 363, - "y": 149, - "w": 23, - "h": 18 - } - }, - { - "filename": "2074", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 24, - "h": 15 - }, - "frame": { - "x": 386, - "y": 152, - "w": 24, - "h": 15 - } - }, - { - "filename": "2074s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 8, - "y": 13, - "w": 24, - "h": 15 - }, - "frame": { - "x": 410, - "y": 154, - "w": 24, - "h": 15 - } - }, - { - "filename": "752s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 23, - "h": 18 - }, - "frame": { - "x": 434, - "y": 161, - "w": 23, - "h": 18 - } - }, - { - "filename": "745-midnight", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, + "x": 13, "y": 4, - "w": 21, + "w": 22, "h": 24 }, "frame": { - "x": 457, - "y": 164, - "w": 21, + "x": 187, + "y": 259, + "w": 22, "h": 24 } }, { - "filename": "770", + "filename": "802s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3357,20 +3588,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 9, + "x": 13, "y": 4, - "w": 23, + "w": 22, "h": 24 }, "frame": { - "x": 478, - "y": 168, - "w": 23, + "x": 209, + "y": 259, + "w": 22, "h": 24 } }, { - "filename": "722", + "filename": "746", "rotated": false, "trimmed": true, "sourceSize": { @@ -3379,19 +3610,40 @@ }, "spriteSourceSize": { "x": 12, - "y": 8, - "w": 17, - "h": 18 + "y": 11, + "w": 18, + "h": 13 }, "frame": { - "x": 163, - "y": 188, - "w": 17, - "h": 18 + "x": 187, + "y": 283, + "w": 18, + "h": 13 } }, { - "filename": "735", + "filename": "733s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 7, + "w": 23, + "h": 21 + }, + "frame": { + "x": 236, + "y": 149, + "w": 23, + "h": 21 + } + }, + { + "filename": "807", "rotated": false, "trimmed": true, "sourceSize": { @@ -3401,308 +3653,14 @@ "spriteSourceSize": { "x": 11, "y": 4, - "w": 20, - "h": 24 - }, - "frame": { - "x": 163, - "y": 164, - "w": 20, - "h": 24 - } - }, - { - "filename": "789", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 23, - "h": 20 - }, - "frame": { - "x": 165, - "y": 144, - "w": 23, - "h": 20 - } - }, - { - "filename": "788s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 2, "w": 22, - "h": 26 + "h": 24 }, "frame": { - "x": 176, - "y": 206, + "x": 234, + "y": 170, "w": 22, - "h": 26 - } - }, - { - "filename": "803", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 3, - "w": 23, - "h": 25 - }, - "frame": { - "x": 177, - "y": 232, - "w": 23, - "h": 25 - } - }, - { - "filename": "786", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 3, - "w": 20, - "h": 25 - }, - "frame": { - "x": 180, - "y": 257, - "w": 20, - "h": 25 - } - }, - { - "filename": "786s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 3, - "w": 20, - "h": 25 - }, - "frame": { - "x": 182, - "y": 282, - "w": 20, - "h": 25 - } - }, - { - "filename": "778-busted", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 12, - "w": 21, - "h": 16 - }, - "frame": { - "x": 182, - "y": 307, - "w": 21, - "h": 16 - } - }, - { - "filename": "757", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 9, - "w": 19, - "h": 18 - }, - "frame": { - "x": 180, - "y": 188, - "w": 19, - "h": 18 - } - }, - { - "filename": "735s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 20, "h": 24 - }, - "frame": { - "x": 183, - "y": 164, - "w": 20, - "h": 24 - } - }, - { - "filename": "728", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 17, - "h": 20 - }, - "frame": { - "x": 188, - "y": 144, - "w": 17, - "h": 20 - } - }, - { - "filename": "770s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 205, - "y": 142, - "w": 23, - "h": 24 - } - }, - { - "filename": "760", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 228, - "y": 142, - "w": 17, - "h": 24 - } - }, - { - "filename": "803s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 3, - "w": 23, - "h": 25 - }, - "frame": { - "x": 203, - "y": 166, - "w": 23, - "h": 25 - } - }, - { - "filename": "806", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 3, - "w": 22, - "h": 25 - }, - "frame": { - "x": 226, - "y": 166, - "w": 22, - "h": 25 - } - }, - { - "filename": "789s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 23, - "h": 20 - }, - "frame": { - "x": 199, - "y": 191, - "w": 23, - "h": 20 } }, { @@ -3720,14 +3678,14 @@ "h": 21 }, "frame": { - "x": 198, - "y": 211, + "x": 234, + "y": 194, "w": 22, "h": 21 } }, { - "filename": "806s", + "filename": "807s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3735,125 +3693,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 9, - "y": 3, - "w": 22, - "h": 25 - }, - "frame": { - "x": 200, - "y": 232, - "w": 22, - "h": 25 - } - }, - { - "filename": "756", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 5, - "w": 22, - "h": 24 - }, - "frame": { - "x": 200, - "y": 257, - "w": 22, - "h": 24 - } - }, - { - "filename": "745s-midnight", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, + "x": 11, "y": 4, - "w": 21, + "w": 22, "h": 24 }, "frame": { - "x": 202, - "y": 281, - "w": 21, - "h": 24 - } - }, - { - "filename": "2027", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 10, - "w": 21, - "h": 18 - }, - "frame": { - "x": 203, - "y": 305, - "w": 21, - "h": 18 - } - }, - { - "filename": "2051", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 222, - "y": 191, - "w": 23, - "h": 24 - } - }, - { - "filename": "778s-busted", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 12, - "w": 21, - "h": 16 - }, - "frame": { - "x": 220, + "x": 233, "y": 215, - "w": 21, - "h": 16 + "w": 22, + "h": 24 } }, { - "filename": "756s", + "filename": "738s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3862,19 +3715,19 @@ }, "spriteSourceSize": { "x": 9, - "y": 5, + "y": 6, "w": 22, - "h": 24 + "h": 21 }, "frame": { - "x": 222, - "y": 231, + "x": 233, + "y": 239, "w": 22, - "h": 24 + "h": 21 } }, { - "filename": "802", + "filename": "769s", "rotated": false, "trimmed": true, "sourceSize": { @@ -3882,16 +3735,37 @@ "h": 30 }, "spriteSourceSize": { - "x": 13, - "y": 4, - "w": 22, - "h": 24 + "x": 8, + "y": 6, + "w": 23, + "h": 22 }, "frame": { - "x": 222, - "y": 255, - "w": 22, - "h": 24 + "x": 231, + "y": 260, + "w": 23, + "h": 22 + } + }, + { + "filename": "767s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 11, + "w": 24, + "h": 14 + }, + "frame": { + "x": 205, + "y": 283, + "w": 24, + "h": 14 } }, { @@ -3909,8 +3783,71 @@ "h": 24 }, "frame": { - "x": 223, - "y": 279, + "x": 195, + "y": 297, + "w": 21, + "h": 24 + } + }, + { + "filename": "735s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 20, + "h": 24 + }, + "frame": { + "x": 216, + "y": 297, + "w": 20, + "h": 24 + } + }, + { + "filename": "752", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 23, + "h": 18 + }, + "frame": { + "x": 259, + "y": 154, + "w": 23, + "h": 18 + } + }, + { + "filename": "763s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 256, + "y": 172, "w": 21, "h": 24 } @@ -3930,134 +3867,8 @@ "h": 20 }, "frame": { - "x": 224, - "y": 303, - "w": 22, - "h": 20 - } - }, - { - "filename": "746", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 18, - "h": 13 - }, - "frame": { - "x": 245, - "y": 151, - "w": 18, - "h": 13 - } - }, - { - "filename": "760s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 248, - "y": 164, - "w": 17, - "h": 24 - } - }, - { - "filename": "2051s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 265, - "y": 152, - "w": 23, - "h": 24 - } - }, - { - "filename": "738s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 9, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 265, - "y": 176, - "w": 22, - "h": 21 - } - }, - { - "filename": "743", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 20, - "h": 22 - }, - "frame": { - "x": 245, - "y": 191, - "w": 20, - "h": 22 - } - }, - { - "filename": "747s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 22, - "h": 20 - }, - "frame": { - "x": 265, - "y": 197, + "x": 256, + "y": 196, "w": 22, "h": 20 } @@ -4077,8 +3888,8 @@ "h": 23 }, "frame": { - "x": 288, - "y": 164, + "x": 255, + "y": 216, "w": 22, "h": 23 } @@ -4098,77 +3909,14 @@ "h": 23 }, "frame": { - "x": 310, - "y": 164, + "x": 255, + "y": 239, "w": 22, "h": 23 } }, { - "filename": "802s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 287, - "y": 187, - "w": 22, - "h": 24 - } - }, - { - "filename": "807", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 309, - "y": 187, - "w": 22, - "h": 24 - } - }, - { - "filename": "807s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 332, - "y": 164, - "w": 22, - "h": 24 - } - }, - { - "filename": "749", + "filename": "789", "rotated": false, "trimmed": true, "sourceSize": { @@ -4177,19 +3925,61 @@ }, "spriteSourceSize": { "x": 10, + "y": 6, + "w": 23, + "h": 20 + }, + "frame": { + "x": 254, + "y": 262, + "w": 23, + "h": 20 + } + }, + { + "filename": "752s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 23, + "h": 18 + }, + "frame": { + "x": 282, + "y": 156, + "w": 23, + "h": 18 + } + }, + { + "filename": "743", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, "y": 5, - "w": 21, - "h": 23 + "w": 20, + "h": 22 }, "frame": { - "x": 331, - "y": 188, - "w": 21, - "h": 23 + "x": 277, + "y": 174, + "w": 20, + "h": 22 } }, { - "filename": "2037", + "filename": "732s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4198,61 +3988,19 @@ }, "spriteSourceSize": { "x": 10, - "y": 7, - "w": 22, - "h": 21 + "y": 6, + "w": 19, + "h": 22 }, "frame": { - "x": 354, - "y": 167, - "w": 22, - "h": 21 + "x": 278, + "y": 196, + "w": 19, + "h": 22 } }, { - "filename": "749s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 352, - "y": 188, - "w": 21, - "h": 23 - } - }, - { - "filename": "2037s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 22, - "h": 21 - }, - "frame": { - "x": 376, - "y": 167, - "w": 22, - "h": 21 - } - }, - { - "filename": "763s", + "filename": "786", "rotated": false, "trimmed": true, "sourceSize": { @@ -4261,15 +4009,57 @@ }, "spriteSourceSize": { "x": 11, - "y": 4, - "w": 21, - "h": 24 + "y": 3, + "w": 20, + "h": 25 }, "frame": { - "x": 373, - "y": 188, - "w": 21, - "h": 24 + "x": 277, + "y": 218, + "w": 20, + "h": 25 + } + }, + { + "filename": "786s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 3, + "w": 20, + "h": 25 + }, + "frame": { + "x": 277, + "y": 243, + "w": 20, + "h": 25 + } + }, + { + "filename": "739", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 20, + "h": 21 + }, + "frame": { + "x": 277, + "y": 268, + "w": 20, + "h": 21 } }, { @@ -4287,54 +4077,12 @@ "h": 24 }, "frame": { - "x": 394, - "y": 188, + "x": 297, + "y": 174, "w": 13, "h": 24 } }, - { - "filename": "790", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 19 - }, - "frame": { - "x": 398, - "y": 169, - "w": 21, - "h": 19 - } - }, - { - "filename": "2050s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 10, - "w": 15, - "h": 18 - }, - "frame": { - "x": 419, - "y": 169, - "w": 15, - "h": 18 - } - }, { "filename": "755s", "rotated": false, @@ -4350,8 +4098,8 @@ "h": 24 }, "frame": { - "x": 407, - "y": 188, + "x": 297, + "y": 198, "w": 13, "h": 24 } @@ -4371,180 +4119,12 @@ "h": 24 }, "frame": { - "x": 420, - "y": 187, + "x": 297, + "y": 222, "w": 21, "h": 24 } }, - { - "filename": "761s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 16, - "h": 19 - }, - "frame": { - "x": 441, - "y": 179, - "w": 16, - "h": 19 - } - }, - { - "filename": "775", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 21, - "h": 20 - }, - "frame": { - "x": 457, - "y": 188, - "w": 21, - "h": 20 - } - }, - { - "filename": "775s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 21, - "h": 20 - }, - "frame": { - "x": 478, - "y": 192, - "w": 21, - "h": 20 - } - }, - { - "filename": "751", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 14, - "h": 20 - }, - "frame": { - "x": 441, - "y": 198, - "w": 14, - "h": 20 - } - }, - { - "filename": "779", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 20 - }, - "frame": { - "x": 420, - "y": 211, - "w": 21, - "h": 20 - } - }, - { - "filename": "779s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 20 - }, - "frame": { - "x": 455, - "y": 208, - "w": 21, - "h": 20 - } - }, - { - "filename": "751s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 14, - "h": 20 - }, - "frame": { - "x": 441, - "y": 218, - "w": 14, - "h": 20 - } - }, - { - "filename": "790s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 21, - "h": 19 - }, - "frame": { - "x": 476, - "y": 212, - "w": 21, - "h": 19 - } - }, { "filename": "793s", "rotated": false, @@ -4560,14 +4140,161 @@ "h": 24 }, "frame": { - "x": 455, - "y": 228, + "x": 297, + "y": 246, "w": 21, "h": 24 } }, { - "filename": "2019", + "filename": "747s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 22, + "h": 20 + }, + "frame": { + "x": 297, + "y": 270, + "w": 22, + "h": 20 + } + }, + { + "filename": "2074", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 8, + "y": 13, + "w": 24, + "h": 15 + }, + "frame": { + "x": 231, + "y": 282, + "w": 24, + "h": 15 + } + }, + { + "filename": "2037", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 22, + "h": 21 + }, + "frame": { + "x": 255, + "y": 282, + "w": 22, + "h": 21 + } + }, + { + "filename": "744", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 19, + "h": 22 + }, + "frame": { + "x": 236, + "y": 297, + "w": 19, + "h": 22 + } + }, + { + "filename": "743s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 5, + "w": 20, + "h": 22 + }, + "frame": { + "x": 255, + "y": 303, + "w": 20, + "h": 22 + } + }, + { + "filename": "754", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 6, + "w": 20, + "h": 22 + }, + "frame": { + "x": 275, + "y": 303, + "w": 20, + "h": 22 + } + }, + { + "filename": "746s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 18, + "h": 13 + }, + "frame": { + "x": 277, + "y": 290, + "w": 18, + "h": 13 + } + }, + { + "filename": "749", "rotated": false, "trimmed": true, "sourceSize": { @@ -4578,17 +4305,101 @@ "x": 10, "y": 5, "w": 21, - "h": 21 + "h": 23 }, "frame": { - "x": 476, - "y": 231, + "x": 295, + "y": 290, "w": 21, - "h": 21 + "h": 23 } }, { - "filename": "2019s", + "filename": "722", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 8, + "w": 17, + "h": 18 + }, + "frame": { + "x": 305, + "y": 156, + "w": 17, + "h": 18 + } + }, + { + "filename": "741-sensu", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 310, + "y": 174, + "w": 17, + "h": 23 + } + }, + { + "filename": "741s-sensu", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 310, + "y": 197, + "w": 17, + "h": 23 + } + }, + { + "filename": "737", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 8, + "w": 18, + "h": 19 + }, + "frame": { + "x": 322, + "y": 155, + "w": 18, + "h": 19 + } + }, + { + "filename": "749s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4599,55 +4410,13 @@ "x": 10, "y": 5, "w": 21, - "h": 21 + "h": 23 }, "frame": { - "x": 287, - "y": 211, + "x": 327, + "y": 174, "w": 21, - "h": 21 - } - }, - { - "filename": "2052", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 21, - "h": 21 - }, - "frame": { - "x": 308, - "y": 211, - "w": 21, - "h": 21 - } - }, - { - "filename": "2052s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 7, - "w": 21, - "h": 21 - }, - "frame": { - "x": 329, - "y": 211, - "w": 21, - "h": 21 + "h": 23 } }, { @@ -4665,8 +4434,8 @@ "h": 23 }, "frame": { - "x": 350, - "y": 211, + "x": 327, + "y": 197, "w": 21, "h": 23 } @@ -4686,75 +4455,12 @@ "h": 23 }, "frame": { - "x": 371, - "y": 212, + "x": 318, + "y": 220, "w": 21, "h": 23 } }, - { - "filename": "743s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 5, - "w": 20, - "h": 22 - }, - "frame": { - "x": 392, - "y": 212, - "w": 20, - "h": 22 - } - }, - { - "filename": "739", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 20, - "h": 21 - }, - "frame": { - "x": 245, - "y": 213, - "w": 20, - "h": 21 - } - }, - { - "filename": "754", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 6, - "w": 20, - "h": 22 - }, - "frame": { - "x": 244, - "y": 234, - "w": 20, - "h": 22 - } - }, { "filename": "754s", "rotated": false, @@ -4770,12 +4476,33 @@ "h": 22 }, "frame": { - "x": 244, - "y": 256, + "x": 318, + "y": 243, "w": 20, "h": 22 } }, + { + "filename": "728", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 17, + "h": 20 + }, + "frame": { + "x": 340, + "y": 154, + "w": 17, + "h": 20 + } + }, { "filename": "739s", "rotated": false, @@ -4791,14 +4518,14 @@ "h": 21 }, "frame": { - "x": 244, - "y": 278, + "x": 357, + "y": 153, "w": 20, "h": 21 } }, { - "filename": "2027s", + "filename": "789s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4807,19 +4534,19 @@ }, "spriteSourceSize": { "x": 10, - "y": 10, - "w": 21, - "h": 18 + "y": 6, + "w": 23, + "h": 20 }, "frame": { - "x": 265, - "y": 217, - "w": 21, - "h": 18 + "x": 348, + "y": 174, + "w": 23, + "h": 20 } }, { - "filename": "744", + "filename": "2037s", "rotated": false, "trimmed": true, "sourceSize": { @@ -4827,16 +4554,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 11, - "y": 6, - "w": 19, - "h": 22 + "x": 10, + "y": 7, + "w": 22, + "h": 21 }, "frame": { - "x": 264, - "y": 235, - "w": 19, - "h": 22 + "x": 348, + "y": 194, + "w": 22, + "h": 21 } }, { @@ -4854,33 +4581,12 @@ "h": 22 }, "frame": { - "x": 264, - "y": 257, + "x": 377, + "y": 150, "w": 19, "h": 22 } }, - { - "filename": "741-pompom", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 20, - "h": 20 - }, - "frame": { - "x": 264, - "y": 279, - "w": 20, - "h": 20 - } - }, { "filename": "762", "rotated": false, @@ -4896,8 +4602,8 @@ "h": 23 }, "frame": { - "x": 246, - "y": 299, + "x": 319, + "y": 265, "w": 18, "h": 23 } @@ -4917,54 +4623,12 @@ "h": 23 }, "frame": { - "x": 264, - "y": 299, + "x": 339, + "y": 220, "w": 18, "h": 23 } }, - { - "filename": "741-sensu", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 283, - "y": 235, - "w": 17, - "h": 23 - } - }, - { - "filename": "728s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 17, - "h": 20 - }, - "frame": { - "x": 283, - "y": 258, - "w": 17, - "h": 20 - } - }, { "filename": "741-pau", "rotated": false, @@ -4980,8 +4644,8 @@ "h": 22 }, "frame": { - "x": 300, - "y": 232, + "x": 338, + "y": 243, "w": 18, "h": 22 } @@ -5001,35 +4665,14 @@ "h": 22 }, "frame": { - "x": 318, - "y": 232, + "x": 337, + "y": 265, "w": 18, "h": 22 } }, { - "filename": "741s-pompom", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 10, - "y": 7, - "w": 20, - "h": 20 - }, - "frame": { - "x": 300, - "y": 254, - "w": 20, - "h": 20 - } - }, - { - "filename": "723s", + "filename": "723", "rotated": false, "trimmed": true, "sourceSize": { @@ -5043,14 +4686,14 @@ "h": 22 }, "frame": { - "x": 284, - "y": 278, + "x": 357, + "y": 215, "w": 17, "h": 22 } }, { - "filename": "741s-sensu", + "filename": "2074s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5058,20 +4701,20 @@ "h": 30 }, "spriteSourceSize": { - "x": 13, - "y": 5, - "w": 17, - "h": 23 + "x": 8, + "y": 13, + "w": 24, + "h": 15 }, "frame": { - "x": 282, - "y": 300, - "w": 17, - "h": 23 + "x": 397, + "y": 149, + "w": 24, + "h": 15 } }, { - "filename": "731", + "filename": "741-pompom", "rotated": false, "trimmed": true, "sourceSize": { @@ -5079,16 +4722,37 @@ "h": 30 }, "spriteSourceSize": { - "x": 12, + "x": 10, + "y": 7, + "w": 20, + "h": 20 + }, + "frame": { + "x": 421, + "y": 151, + "w": 20, + "h": 20 + } + }, + { + "filename": "775", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, "y": 6, - "w": 17, - "h": 22 + "w": 21, + "h": 20 }, "frame": { - "x": 320, - "y": 254, - "w": 17, - "h": 22 + "x": 396, + "y": 164, + "w": 21, + "h": 20 } }, { @@ -5106,14 +4770,119 @@ "h": 20 }, "frame": { - "x": 301, - "y": 274, + "x": 377, + "y": 172, "w": 19, "h": 20 } }, { - "filename": "722s", + "filename": "775s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 6, + "w": 21, + "h": 20 + }, + "frame": { + "x": 417, + "y": 171, + "w": 21, + "h": 20 + } + }, + { + "filename": "778-busted", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 12, + "w": 21, + "h": 16 + }, + "frame": { + "x": 396, + "y": 184, + "w": 21, + "h": 16 + } + }, + { + "filename": "778s-busted", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 9, + "y": 12, + "w": 21, + "h": 16 + }, + "frame": { + "x": 417, + "y": 191, + "w": 21, + "h": 16 + } + }, + { + "filename": "779", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 21, + "h": 20 + }, + "frame": { + "x": 441, + "y": 166, + "w": 21, + "h": 20 + } + }, + { + "filename": "2019", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 5, + "w": 21, + "h": 21 + }, + "frame": { + "x": 438, + "y": 186, + "w": 21, + "h": 21 + } + }, + { + "filename": "737s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5123,18 +4892,18 @@ "spriteSourceSize": { "x": 12, "y": 8, - "w": 17, - "h": 18 + "w": 18, + "h": 19 }, "frame": { - "x": 320, - "y": 276, - "w": 17, - "h": 18 + "x": 462, + "y": 172, + "w": 18, + "h": 19 } }, { - "filename": "753", + "filename": "779s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5142,20 +4911,125 @@ "h": 30 }, "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 14, + "x": 10, + "y": 7, + "w": 21, + "h": 20 + }, + "frame": { + "x": 480, + "y": 174, + "w": 21, + "h": 20 + } + }, + { + "filename": "790", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 21, "h": 19 }, "frame": { - "x": 336, - "y": 232, - "w": 14, + "x": 459, + "y": 191, + "w": 21, "h": 19 } }, { - "filename": "2088", + "filename": "790s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 21, + "h": 19 + }, + "frame": { + "x": 480, + "y": 194, + "w": 21, + "h": 19 + } + }, + { + "filename": "2019s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 5, + "w": 21, + "h": 21 + }, + "frame": { + "x": 370, + "y": 194, + "w": 21, + "h": 21 + } + }, + { + "filename": "723s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 374, + "y": 215, + "w": 17, + "h": 22 + } + }, + { + "filename": "2052", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 21, + "h": 21 + }, + "frame": { + "x": 391, + "y": 200, + "w": 21, + "h": 21 + } + }, + { + "filename": "2027", "rotated": false, "trimmed": true, "sourceSize": { @@ -5169,14 +5043,56 @@ "h": 18 }, "frame": { - "x": 350, - "y": 234, + "x": 391, + "y": 221, "w": 21, "h": 18 } }, { - "filename": "2088s", + "filename": "2052s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 7, + "w": 21, + "h": 21 + }, + "frame": { + "x": 412, + "y": 207, + "w": 21, + "h": 21 + } + }, + { + "filename": "741s-pompom", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 7, + "w": 20, + "h": 20 + }, + "frame": { + "x": 433, + "y": 207, + "w": 20, + "h": 20 + } + }, + { + "filename": "2027s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5190,8 +5106,8 @@ "h": 18 }, "frame": { - "x": 371, - "y": 235, + "x": 412, + "y": 228, "w": 21, "h": 18 } @@ -5211,12 +5127,75 @@ "h": 20 }, "frame": { - "x": 392, - "y": 234, + "x": 433, + "y": 227, "w": 19, "h": 20 } }, + { + "filename": "2088", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 10, + "w": 21, + "h": 18 + }, + "frame": { + "x": 453, + "y": 210, + "w": 21, + "h": 18 + } + }, + { + "filename": "2088s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 10, + "y": 10, + "w": 21, + "h": 18 + }, + "frame": { + "x": 452, + "y": 228, + "w": 21, + "h": 18 + } + }, + { + "filename": "757", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 9, + "w": 19, + "h": 18 + }, + "frame": { + "x": 474, + "y": 213, + "w": 19, + "h": 18 + } + }, { "filename": "757s", "rotated": false, @@ -5232,12 +5211,54 @@ "h": 18 }, "frame": { - "x": 301, - "y": 294, + "x": 473, + "y": 231, "w": 19, "h": 18 } }, + { + "filename": "731", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 6, + "w": 17, + "h": 22 + }, + "frame": { + "x": 316, + "y": 290, + "w": 17, + "h": 22 + } + }, + { + "filename": "771", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 11, + "w": 18, + "h": 13 + }, + "frame": { + "x": 316, + "y": 312, + "w": 18, + "h": 13 + } + }, { "filename": "731s", "rotated": false, @@ -5253,12 +5274,33 @@ "h": 22 }, "frame": { - "x": 320, - "y": 294, + "x": 333, + "y": 288, "w": 17, "h": 22 } }, + { + "filename": "736", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 17, + "h": 13 + }, + "frame": { + "x": 334, + "y": 310, + "w": 17, + "h": 13 + } + }, { "filename": "778-disguised", "rotated": false, @@ -5274,8 +5316,8 @@ "h": 22 }, "frame": { - "x": 337, - "y": 252, + "x": 350, + "y": 287, "w": 17, "h": 22 } @@ -5295,54 +5337,12 @@ "h": 22 }, "frame": { - "x": 354, - "y": 252, + "x": 355, + "y": 265, "w": 17, "h": 22 } }, - { - "filename": "737", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 18, - "h": 19 - }, - "frame": { - "x": 337, - "y": 274, - "w": 18, - "h": 19 - } - }, - { - "filename": "737s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 8, - "w": 18, - "h": 19 - }, - "frame": { - "x": 371, - "y": 253, - "w": 18, - "h": 19 - } - }, { "filename": "741", "rotated": false, @@ -5358,12 +5358,96 @@ "h": 19 }, "frame": { - "x": 337, - "y": 293, + "x": 356, + "y": 246, "w": 17, "h": 19 } }, + { + "filename": "728s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 17, + "h": 20 + }, + "frame": { + "x": 373, + "y": 237, + "w": 17, + "h": 20 + } + }, + { + "filename": "722s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 8, + "w": 17, + "h": 18 + }, + "frame": { + "x": 390, + "y": 239, + "w": 17, + "h": 18 + } + }, + { + "filename": "736s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 12, + "w": 17, + "h": 13 + }, + "frame": { + "x": 351, + "y": 309, + "w": 17, + "h": 13 + } + }, + { + "filename": "771s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 11, + "w": 18, + "h": 13 + }, + "frame": { + "x": 373, + "y": 257, + "w": 18, + "h": 13 + } + }, { "filename": "741s", "rotated": false, @@ -5379,8 +5463,8 @@ "h": 19 }, "frame": { - "x": 355, - "y": 274, + "x": 372, + "y": 270, "w": 17, "h": 19 } @@ -5400,12 +5484,33 @@ "h": 19 }, "frame": { - "x": 354, - "y": 293, + "x": 367, + "y": 289, "w": 17, "h": 19 } }, + { + "filename": "808", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 17, + "h": 17 + }, + "frame": { + "x": 368, + "y": 308, + "w": 17, + "h": 17 + } + }, { "filename": "759s", "rotated": false, @@ -5421,96 +5526,12 @@ "h": 19 }, "frame": { - "x": 372, - "y": 272, + "x": 391, + "y": 257, "w": 17, "h": 19 } }, - { - "filename": "777", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 8, - "w": 17, - "h": 19 - }, - "frame": { - "x": 389, - "y": 254, - "w": 17, - "h": 19 - } - }, - { - "filename": "774", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 17, - "h": 18 - }, - "frame": { - "x": 389, - "y": 273, - "w": 17, - "h": 18 - } - }, - { - "filename": "774s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 11, - "y": 8, - "w": 17, - "h": 18 - }, - "frame": { - "x": 389, - "y": 273, - "w": 17, - "h": 18 - } - }, - { - "filename": "753s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 14, - "y": 8, - "w": 14, - "h": 19 - }, - "frame": { - "x": 406, - "y": 254, - "w": 14, - "h": 19 - } - }, { "filename": "774-blue", "rotated": false, @@ -5526,35 +5547,14 @@ "h": 18 }, "frame": { - "x": 406, - "y": 273, + "x": 389, + "y": 276, "w": 17, "h": 18 } }, { - "filename": "746s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 18, - "h": 13 - }, - "frame": { - "x": 423, - "y": 231, - "w": 18, - "h": 13 - } - }, - { - "filename": "777s", + "filename": "777", "rotated": false, "trimmed": true, "sourceSize": { @@ -5568,54 +5568,12 @@ "h": 19 }, "frame": { - "x": 420, - "y": 244, + "x": 408, + "y": 246, "w": 17, "h": 19 } }, - { - "filename": "771", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 11, - "w": 18, - "h": 13 - }, - "frame": { - "x": 437, - "y": 244, - "w": 18, - "h": 13 - } - }, - { - "filename": "771s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 13, - "y": 11, - "w": 18, - "h": 13 - }, - "frame": { - "x": 437, - "y": 257, - "w": 18, - "h": 13 - } - }, { "filename": "774-green", "rotated": false, @@ -5631,12 +5589,33 @@ "h": 18 }, "frame": { - "x": 455, - "y": 252, + "x": 408, + "y": 265, "w": 17, "h": 18 } }, + { + "filename": "777s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 17, + "h": 19 + }, + "frame": { + "x": 425, + "y": 247, + "w": 17, + "h": 19 + } + }, { "filename": "774-indigo", "rotated": false, @@ -5652,14 +5631,14 @@ "h": 18 }, "frame": { - "x": 472, - "y": 252, + "x": 425, + "y": 266, "w": 17, "h": 18 } }, { - "filename": "736", + "filename": "751", "rotated": false, "trimmed": true, "sourceSize": { @@ -5667,37 +5646,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 12, - "y": 12, - "w": 17, - "h": 13 + "x": 13, + "y": 8, + "w": 14, + "h": 20 }, "frame": { - "x": 372, - "y": 291, - "w": 17, - "h": 13 - } - }, - { - "filename": "736s", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 12, - "w": 17, - "h": 13 - }, - "frame": { - "x": 389, - "y": 291, - "w": 17, - "h": 13 + "x": 442, + "y": 247, + "w": 14, + "h": 20 } }, { @@ -5715,8 +5673,8 @@ "h": 18 }, "frame": { - "x": 406, - "y": 291, + "x": 456, + "y": 246, "w": 17, "h": 18 } @@ -5736,12 +5694,33 @@ "h": 18 }, "frame": { - "x": 371, - "y": 304, + "x": 473, + "y": 249, "w": 17, "h": 18 } }, + { + "filename": "751s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 14, + "h": 20 + }, + "frame": { + "x": 442, + "y": 267, + "w": 14, + "h": 20 + } + }, { "filename": "774-violet", "rotated": false, @@ -5757,8 +5736,8 @@ "h": 18 }, "frame": { - "x": 388, - "y": 304, + "x": 456, + "y": 264, "w": 17, "h": 18 } @@ -5778,8 +5757,29 @@ "h": 18 }, "frame": { - "x": 423, - "y": 270, + "x": 473, + "y": 267, + "w": 17, + "h": 18 + } + }, + { + "filename": "774", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 8, + "w": 17, + "h": 18 + }, + "frame": { + "x": 406, + "y": 283, "w": 17, "h": 18 } @@ -5800,32 +5800,11 @@ }, "frame": { "x": 423, - "y": 288, + "y": 284, "w": 17, "h": 18 } }, - { - "filename": "808", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 40, - "h": 30 - }, - "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 17, - "h": 17 - }, - "frame": { - "x": 423, - "y": 306, - "w": 17, - "h": 17 - } - }, { "filename": "774s-green", "rotated": false, @@ -5842,11 +5821,32 @@ }, "frame": { "x": 440, - "y": 270, + "y": 287, "w": 17, "h": 18 } }, + { + "filename": "753", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 14, + "y": 8, + "w": 14, + "h": 19 + }, + "frame": { + "x": 457, + "y": 282, + "w": 14, + "h": 19 + } + }, { "filename": "774s-indigo", "rotated": false, @@ -5862,14 +5862,14 @@ "h": 18 }, "frame": { - "x": 440, - "y": 288, + "x": 471, + "y": 285, "w": 17, "h": 18 } }, { - "filename": "808s", + "filename": "753s", "rotated": false, "trimmed": true, "sourceSize": { @@ -5877,16 +5877,16 @@ "h": 30 }, "spriteSourceSize": { - "x": 12, - "y": 11, - "w": 17, - "h": 17 + "x": 14, + "y": 8, + "w": 14, + "h": 19 }, "frame": { - "x": 440, - "y": 306, - "w": 17, - "h": 17 + "x": 488, + "y": 285, + "w": 14, + "h": 19 } }, { @@ -5904,8 +5904,8 @@ "h": 18 }, "frame": { - "x": 457, - "y": 270, + "x": 385, + "y": 294, "w": 17, "h": 18 } @@ -5925,8 +5925,8 @@ "h": 18 }, "frame": { - "x": 457, - "y": 288, + "x": 402, + "y": 301, "w": 17, "h": 18 } @@ -5946,8 +5946,8 @@ "h": 18 }, "frame": { - "x": 474, - "y": 270, + "x": 419, + "y": 302, "w": 17, "h": 18 } @@ -5967,11 +5967,53 @@ "h": 18 }, "frame": { - "x": 474, - "y": 288, + "x": 436, + "y": 305, "w": 17, "h": 18 } + }, + { + "filename": "774s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 11, + "y": 8, + "w": 17, + "h": 18 + }, + "frame": { + "x": 453, + "y": 305, + "w": 17, + "h": 18 + } + }, + { + "filename": "808s", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 12, + "y": 11, + "w": 17, + "h": 17 + }, + "frame": { + "x": 470, + "y": 303, + "w": 17, + "h": 17 + } } ] } @@ -5979,6 +6021,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a4de8d1c4f7d4f58c929b8b5479e03f1:3c8ac308e19a7f9420a4df8a78188490:2e7c5873ead8fd8fce82a0b3fcc86b42$" + "smartupdate": "$TexturePacker:SmartUpdate:5861cb99c3db0943f1ccef3b0e1b4683:26656a692718930d92be5b6aba391ced:2e7c5873ead8fd8fce82a0b3fcc86b42$" } } diff --git a/public/images/pokemon_icons_7.png b/public/images/pokemon_icons_7.png index c9a396ed5c6..5e6421360fd 100644 Binary files a/public/images/pokemon_icons_7.png and b/public/images/pokemon_icons_7.png differ diff --git a/public/images/ui/legacy/mystery_egg.png b/public/images/ui/legacy/mystery_egg.png new file mode 100644 index 00000000000..bb117a137b0 Binary files /dev/null and b/public/images/ui/legacy/mystery_egg.png differ diff --git a/public/images/ui/legacy/normal_memory.png b/public/images/ui/legacy/normal_memory.png new file mode 100644 index 00000000000..ddc22d1d4ab Binary files /dev/null and b/public/images/ui/legacy/normal_memory.png differ diff --git a/public/images/ui/legacy/pokedex_summary_bg.png b/public/images/ui/legacy/pokedex_summary_bg.png new file mode 100644 index 00000000000..690df1547c0 Binary files /dev/null and b/public/images/ui/legacy/pokedex_summary_bg.png differ diff --git a/public/images/ui/mystery_egg.png b/public/images/ui/mystery_egg.png new file mode 100644 index 00000000000..bb117a137b0 Binary files /dev/null and b/public/images/ui/mystery_egg.png differ diff --git a/public/images/ui/normal_memory.png b/public/images/ui/normal_memory.png new file mode 100644 index 00000000000..ddc22d1d4ab Binary files /dev/null and b/public/images/ui/normal_memory.png differ diff --git a/public/images/ui/pokedex_summary_bg.png b/public/images/ui/pokedex_summary_bg.png new file mode 100644 index 00000000000..92e70bbee27 Binary files /dev/null and b/public/images/ui/pokedex_summary_bg.png differ diff --git a/public/locales b/public/locales index 2d3765a4f03..58dda14ee83 160000 --- a/public/locales +++ b/public/locales @@ -1 +1 @@ -Subproject commit 2d3765a4f035b4916523bf75b754e153e9d65134 +Subproject commit 58dda14ee834204c4bd5ece47694a3c068df4b0e diff --git a/src/battle-scene.ts b/src/battle-scene.ts index b8c8d1d5a1f..53dca4ddcb2 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -161,6 +161,7 @@ export default class BattleScene extends SceneBase { public reroll: boolean = false; public shopCursorTarget: number = ShopCursorTarget.REWARDS; public commandCursorMemory: boolean = false; + public dexForDevs: boolean = false; public showMovesetFlyout: boolean = true; public showArenaFlyout: boolean = true; public showTimeOfDayWidget: boolean = true; @@ -1400,8 +1401,8 @@ export default class BattleScene extends SceneBase { return this.currentBattle; } - newArena(biome: Biome): Arena { - this.arena = new Arena(biome, Biome[biome].toLowerCase()); + newArena(biome: Biome, playerFaints?: number): Arena { + this.arena = new Arena(biome, Biome[biome].toLowerCase(), playerFaints); this.eventTarget.dispatchEvent(new NewArenaEvent()); this.arenaBg.pipelineData = { terrainColorRatio: this.arena.getBgTerrainColorRatioForBiome() }; @@ -2352,14 +2353,14 @@ export default class BattleScene extends SceneBase { } /** - * Adds Phase to the end of phaseQueuePrepend, or at phaseQueuePrependSpliceIndex - * @param phase {@linkcode Phase} the phase to add + * Adds Phase(s) to the end of phaseQueuePrepend, or at phaseQueuePrependSpliceIndex + * @param phases {@linkcode Phase} the phase(s) to add */ - unshiftPhase(phase: Phase): void { + unshiftPhase(...phases: Phase[]): void { if (this.phaseQueuePrependSpliceIndex === -1) { - this.phaseQueuePrepend.push(phase); + this.phaseQueuePrepend.push(...phases); } else { - this.phaseQueuePrepend.splice(this.phaseQueuePrependSpliceIndex, 0, phase); + this.phaseQueuePrepend.splice(this.phaseQueuePrependSpliceIndex, 0, ...phases); } } @@ -2497,32 +2498,38 @@ export default class BattleScene extends SceneBase { * @param targetPhase {@linkcode Phase} the type of phase to search for in phaseQueue * @returns boolean if a targetPhase was found and added */ - prependToPhase(phase: Phase, targetPhase: Constructor): boolean { + prependToPhase(phase: Phase | Phase [], targetPhase: Constructor): boolean { + if (!Array.isArray(phase)) { + phase = [ phase ]; + } const targetIndex = this.phaseQueue.findIndex(ph => ph instanceof targetPhase); if (targetIndex !== -1) { - this.phaseQueue.splice(targetIndex, 0, phase); + this.phaseQueue.splice(targetIndex, 0, ...phase); return true; } else { - this.unshiftPhase(phase); + this.unshiftPhase(...phase); return false; } } /** - * Tries to add the input phase to index after target phase in the {@linkcode phaseQueue}, else simply calls {@linkcode unshiftPhase()} - * @param phase {@linkcode Phase} the phase to be added + * Tries to add the input phase(s) to index after target phase in the {@linkcode phaseQueue}, else simply calls {@linkcode unshiftPhase()} + * @param phase {@linkcode Phase} the phase(s) to be added * @param targetPhase {@linkcode Phase} the type of phase to search for in {@linkcode phaseQueue} * @returns `true` if a `targetPhase` was found to append to */ - appendToPhase(phase: Phase, targetPhase: Constructor): boolean { + appendToPhase(phase: Phase | Phase[], targetPhase: Constructor): boolean { + if (!Array.isArray(phase)) { + phase = [ phase ]; + } const targetIndex = this.phaseQueue.findIndex(ph => ph instanceof targetPhase); if (targetIndex !== -1 && this.phaseQueue.length > targetIndex) { - this.phaseQueue.splice(targetIndex + 1, 0, phase); + this.phaseQueue.splice(targetIndex + 1, 0, ...phase); return true; } else { - this.unshiftPhase(phase); + this.unshiftPhase(...phase); return false; } } diff --git a/src/battle.ts b/src/battle.ts index fa333040c22..7ede7b2982e 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -101,10 +101,15 @@ export default class Battle { public battleSeed: string = Utils.randomString(16, true); private battleSeedState: string | null = null; public moneyScattered: number = 0; + /** Primarily for double battles, keeps track of last enemy and player pokemon that triggered its ability or used a move */ + public lastEnemyInvolved: number; + public lastPlayerInvolved: number; public lastUsedPokeball: PokeballType | null = null; - /** The number of times a Pokemon on the player's side has fainted this battle */ - public playerFaints: number = 0; - /** The number of times a Pokemon on the enemy's side has fainted this battle */ + /** + * Saves the number of times a Pokemon on the enemy's side has fainted during this battle. + * This is saved here since we encounter a new enemy every wave. + * {@linkcode globalScene.arena.playerFaints} is the corresponding faint counter for the player and needs to be save across waves (reset every arena encounter). + */ public enemyFaints: number = 0; public playerFaintsHistory: FaintLogEntry[] = []; public enemyFaintsHistory: FaintLogEntry[] = []; @@ -115,7 +120,7 @@ export default class Battle { private rngCounter: number = 0; - constructor(gameMode: GameMode, waveIndex: number, battleType: BattleType, trainer?: Trainer, double?: boolean) { + constructor(gameMode: GameMode, waveIndex: number, battleType: BattleType, trainer?: Trainer, double: boolean = false) { this.gameMode = gameMode; this.waveIndex = waveIndex; this.battleType = battleType; @@ -124,7 +129,7 @@ export default class Battle { this.enemyLevels = battleType !== BattleType.TRAINER ? new Array(double ? 2 : 1).fill(null).map(() => this.getLevelForWave()) : trainer?.getPartyLevels(this.waveIndex); - this.double = double ?? false; + this.double = double; } private initBattleSpec(): void { diff --git a/src/data/ability.ts b/src/data/ability.ts index cdf29f73371..698620bdae3 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -1037,7 +1037,7 @@ export class PostDefendPerishSongAbAttr extends PostDefendAbAttr { override canApplyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean { return (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && !move.hitsSubstitute(attacker, pokemon)) - && !(pokemon.getTag(BattlerTagType.PERISH_SONG) || attacker.getTag(BattlerTagType.PERISH_SONG)); + && !attacker.getTag(BattlerTagType.PERISH_SONG); } override applyPostDefend(pokemon: Pokemon, _passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, _hitResult: HitResult, _args: any[]): boolean { @@ -2857,6 +2857,44 @@ export class PreStatStageChangeAbAttr extends AbAttr { } } +/** + * Reflect all {@linkcode BattleStat} reductions caused by other Pokémon's moves and Abilities. + * Currently only applies to Mirror Armor. + */ +export class ReflectStatStageChangeAbAttr extends PreStatStageChangeAbAttr { + /** {@linkcode BattleStat} to reflect */ + private reflectedStat? : BattleStat; + + /** + * Apply the {@linkcode ReflectStatStageChangeAbAttr} to an interaction + * @param _pokemon The user pokemon + * @param _passive N/A + * @param simulated `true` if the ability is being simulated by the AI + * @param stat the {@linkcode BattleStat} being affected + * @param cancelled The {@linkcode Utils.BooleanHolder} that will be set to true due to reflection + * @param args + * @returns true because it reflects any stat being lowered + */ + applyPreStatStageChange(_pokemon: Pokemon, _passive: boolean, simulated: boolean, stat: BattleStat, cancelled: Utils.BooleanHolder, args: any[]): boolean { + const attacker: Pokemon = args[0]; + const stages = args[1]; + this.reflectedStat = stat; + if (!simulated) { + globalScene.unshiftPhase(new StatStageChangePhase(attacker.getBattlerIndex(), false, [ stat ], stages, true, false, true, null, true)); + } + cancelled.value = true; + return true; + } + + getTriggerMessage(pokemon: Pokemon, abilityName: string, ..._args: any[]): string { + return i18next.t("abilityTriggers:protectStat", { + pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), + abilityName, + statName: this.reflectedStat ? i18next.t(getStatKey(this.reflectedStat)) : i18next.t("battle:stats") + }); + } +} + /** * Protect one or all {@linkcode BattleStat} from reductions caused by other Pokémon's moves and Abilities */ @@ -4621,6 +4659,13 @@ export class InfiltratorAbAttr extends AbAttr { } } +/** + * Attribute implementing the effects of {@link https://bulbapedia.bulbagarden.net/wiki/Magic_Bounce_(ability) | Magic Bounce}. + * Allows the source to bounce back {@linkcode MoveFlags.REFLECTABLE | Reflectable} + * moves as if the user had used {@linkcode Moves.MAGIC_COAT | Magic Coat}. + */ +export class ReflectStatusMoveAbAttr extends AbAttr { } + export class UncopiableAbilityAbAttr extends AbAttr { constructor() { super(false); @@ -6025,8 +6070,11 @@ export function initAbilities() { }, Stat.SPD, 1) .attr(PostIntimidateStatStageChangeAbAttr, [ Stat.SPD ], 1), new Ability(Abilities.MAGIC_BOUNCE, 5) + .attr(ReflectStatusMoveAbAttr) .ignorable() - .unimplemented(), + // Interactions with stomping tantrum, instruct, encore, and probably other moves that + // rely on move history + .edgeCase(), new Ability(Abilities.SAP_SIPPER, 5) .attr(TypeImmunityStatStageChangeAbAttr, Type.GRASS, Stat.ATK, 1) .ignorable(), @@ -6323,8 +6371,8 @@ export function initAbilities() { new Ability(Abilities.PROPELLER_TAIL, 8) .attr(BlockRedirectAbAttr), new Ability(Abilities.MIRROR_ARMOR, 8) - .ignorable() - .unimplemented(), + .attr(ReflectStatStageChangeAbAttr) + .ignorable(), /** * Right now, the logic is attached to Surf and Dive moves. Ideally, the post-defend/hit should be an * ability attribute but the current implementation of move effects for BattlerTag does not support this- in the case @@ -6351,7 +6399,8 @@ export function initAbilities() { .attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => move.hasFlag(MoveFlags.SOUND_BASED), 0.5) .ignorable(), new Ability(Abilities.SAND_SPIT, 8) - .attr(PostDefendWeatherChangeAbAttr, WeatherType.SANDSTORM, (target, user, move) => move.category !== MoveCategory.STATUS), + .attr(PostDefendWeatherChangeAbAttr, WeatherType.SANDSTORM, (target, user, move) => move.category !== MoveCategory.STATUS) + .bypassFaint(), new Ability(Abilities.ICE_SCALES, 8) .attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => move.category === MoveCategory.SPECIAL, 0.5) .ignorable(), @@ -6384,7 +6433,8 @@ export function initAbilities() { new Ability(Abilities.STEELY_SPIRIT, 8) .attr(UserFieldMoveTypePowerBoostAbAttr, Type.STEEL), new Ability(Abilities.PERISH_BODY, 8) - .attr(PostDefendPerishSongAbAttr, 4), + .attr(PostDefendPerishSongAbAttr, 4) + .bypassFaint(), new Ability(Abilities.WANDERING_SPIRIT, 8) .attr(PostDefendAbilitySwapAbAttr) .bypassFaint() @@ -6442,7 +6492,8 @@ export function initAbilities() { .attr(PostDefendAbilityGiveAbAttr, Abilities.LINGERING_AROMA) .bypassFaint(), new Ability(Abilities.SEED_SOWER, 9) - .attr(PostDefendTerrainChangeAbAttr, TerrainType.GRASSY), + .attr(PostDefendTerrainChangeAbAttr, TerrainType.GRASSY) + .bypassFaint(), new Ability(Abilities.THERMAL_EXCHANGE, 9) .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => user.getMoveType(move) === Type.FIRE && move.category !== MoveCategory.STATUS, Stat.ATK, 1) .attr(StatusEffectImmunityAbAttr, StatusEffect.BURN) @@ -6492,15 +6543,13 @@ export function initAbilities() { .attr(PostWeatherChangeAddBattlerTagAttr, BattlerTagType.PROTOSYNTHESIS, 0, WeatherType.SUNNY, WeatherType.HARSH_SUN) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) - .attr(NoTransformAbilityAbAttr) - .partial(), // While setting the tag, the getbattlestat should ignore all modifiers to stats except stat stages + .attr(NoTransformAbilityAbAttr), new Ability(Abilities.QUARK_DRIVE, 9) .conditionalAttr(getTerrainCondition(TerrainType.ELECTRIC), PostSummonAddBattlerTagAbAttr, BattlerTagType.QUARK_DRIVE, 0, true) .attr(PostTerrainChangeAddBattlerTagAttr, BattlerTagType.QUARK_DRIVE, 0, TerrainType.ELECTRIC) .attr(UncopiableAbilityAbAttr) .attr(UnswappableAbilityAbAttr) - .attr(NoTransformAbilityAbAttr) - .partial(), // While setting the tag, the getbattlestat should ignore all modifiers to stats except stat stages + .attr(NoTransformAbilityAbAttr), new Ability(Abilities.GOOD_AS_GOLD, 9) .attr(MoveImmunityAbAttr, (pokemon, attacker, move) => pokemon !== attacker && move.category === MoveCategory.STATUS && ![ MoveTarget.ENEMY_SIDE, MoveTarget.BOTH_SIDES, MoveTarget.USER_SIDE ].includes(move.moveTarget)) .ignorable(), @@ -6533,8 +6582,8 @@ export function initAbilities() { new Ability(Abilities.SHARPNESS, 9) .attr(MovePowerBoostAbAttr, (user, target, move) => move.hasFlag(MoveFlags.SLICING_MOVE), 1.5), new Ability(Abilities.SUPREME_OVERLORD, 9) - .attr(VariableMovePowerBoostAbAttr, (user, target, move) => 1 + 0.1 * Math.min(user.isPlayer() ? globalScene.currentBattle.playerFaints : globalScene.currentBattle.enemyFaints, 5)) - .partial(), // Counter resets every wave instead of on arena reset + .attr(VariableMovePowerBoostAbAttr, (user, target, move) => 1 + 0.1 * Math.min(user.isPlayer() ? globalScene.arena.playerFaints : globalScene.currentBattle.enemyFaints, 5)) + .partial(), // Should only boost once, on summon new Ability(Abilities.COSTAR, 9) .attr(PostSummonCopyAllyStatsAbAttr), new Ability(Abilities.TOXIC_DEBRIS, 9) diff --git a/src/data/arena-tag.ts b/src/data/arena-tag.ts index 816de3e824c..2fa4593fd6c 100644 --- a/src/data/arena-tag.ts +++ b/src/data/arena-tag.ts @@ -910,7 +910,7 @@ class StickyWebTag extends ArenaTrapTag { if (!cancelled.value) { globalScene.queueMessage(i18next.t("arenaTag:stickyWebActivateTrap", { pokemonName: pokemon.getNameToRender() })); const stages = new NumberHolder(-1); - globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), false, [ Stat.SPD ], stages.value)); + globalScene.unshiftPhase(new StatStageChangePhase(pokemon.getBattlerIndex(), false, [ Stat.SPD ], stages.value, true, false, true, null, false, true)); return true; } } diff --git a/src/data/balance/egg-moves.ts b/src/data/balance/egg-moves.ts index 4855379f675..35ec6f934a4 100644 --- a/src/data/balance/egg-moves.ts +++ b/src/data/balance/egg-moves.ts @@ -7,10 +7,10 @@ import { Species } from "#enums/species"; export const speciesEggMoves = { [Species.BULBASAUR]: [ Moves.SAPPY_SEED, Moves.MALIGNANT_CHAIN, Moves.EARTH_POWER, Moves.MATCHA_GOTCHA ], [Species.CHARMANDER]: [ Moves.DRAGON_DANCE, Moves.BITTER_BLADE, Moves.EARTH_POWER, Moves.OBLIVION_WING ], - [Species.SQUIRTLE]: [ Moves.FREEZE_DRY, Moves.ARMOR_CANNON, Moves.BOUNCY_BUBBLE, Moves.ORIGIN_PULSE ], + [Species.SQUIRTLE]: [ Moves.FREEZE_DRY, Moves.ARMOR_CANNON, Moves.SHORE_UP, Moves.ORIGIN_PULSE ], [Species.CATERPIE]: [ Moves.SANDSEAR_STORM, Moves.SILK_TRAP, Moves.TWIN_BEAM, Moves.BLEAKWIND_STORM ], [Species.WEEDLE]: [ Moves.THOUSAND_ARROWS, Moves.NOXIOUS_TORQUE, Moves.ATTACK_ORDER, Moves.VICTORY_DANCE ], - [Species.PIDGEY]: [ Moves.WILDBOLT_STORM, Moves.SANDSEAR_STORM, Moves.NASTY_PLOT, Moves.BOOMBURST ], + [Species.PIDGEY]: [ Moves.BLEAKWIND_STORM, Moves.SANDSEAR_STORM, Moves.CALM_MIND, Moves.BOOMBURST ], [Species.RATTATA]: [ Moves.HYPER_FANG, Moves.PSYCHIC_FANGS, Moves.FIRE_FANG, Moves.EXTREME_SPEED ], [Species.SPEAROW]: [ Moves.FLOATY_FALL, Moves.HYPER_DRILL, Moves.TIDY_UP, Moves.TRIPLE_ARROWS ], [Species.EKANS]: [ Moves.NOXIOUS_TORQUE, Moves.DRAGON_DANCE, Moves.SLACK_OFF, Moves.SHED_TAIL ], @@ -34,7 +34,7 @@ export const speciesEggMoves = { [Species.TENTACOOL]: [ Moves.BANEFUL_BUNKER, Moves.MALIGNANT_CHAIN, Moves.BOUNCY_BUBBLE, Moves.STRENGTH_SAP ], [Species.GEODUDE]: [ Moves.FLARE_BLITZ, Moves.HEAD_SMASH, Moves.SHORE_UP, Moves.SHELL_SMASH ], [Species.PONYTA]: [ Moves.HEADLONG_RUSH, Moves.FIRE_LASH, Moves.SWORDS_DANCE, Moves.VOLT_TACKLE ], - [Species.SLOWPOKE]: [ Moves.BOUNCY_BUBBLE, Moves.FROST_BREATH, Moves.SHED_TAIL, Moves.MYSTICAL_POWER ], + [Species.SLOWPOKE]: [ Moves.SPLISHY_SPLASH, Moves.FROST_BREATH, Moves.SHED_TAIL, Moves.MYSTICAL_POWER ], [Species.MAGNEMITE]: [ Moves.PARABOLIC_CHARGE, Moves.FLAMETHROWER, Moves.ICE_BEAM, Moves.THUNDERCLAP ], [Species.FARFETCHD]: [ Moves.IVY_CUDGEL, Moves.TRIPLE_ARROWS, Moves.DRILL_RUN, Moves.VICTORY_DANCE ], [Species.DODUO]: [ Moves.TRIPLE_AXEL, Moves.HYPER_DRILL, Moves.FLOATY_FALL, Moves.TRIPLE_ARROWS ], @@ -52,7 +52,7 @@ export const speciesEggMoves = { [Species.KOFFING]: [ Moves.SCALD, Moves.RECOVER, Moves.BODY_PRESS, Moves.MALIGNANT_CHAIN ], [Species.RHYHORN]: [ Moves.SHORE_UP, Moves.ICE_HAMMER, Moves.ACCELEROCK, Moves.HEAD_SMASH ], [Species.TANGELA]: [ Moves.NATURES_MADNESS, Moves.SNAP_TRAP, Moves.PARTING_SHOT, Moves.SAPPY_SEED ], - [Species.KANGASKHAN]: [ Moves.POWER_UP_PUNCH, Moves.TRAILBLAZE, Moves.FACADE, Moves.SEISMIC_TOSS ], + [Species.KANGASKHAN]: [ Moves.POWER_UP_PUNCH, Moves.TRAILBLAZE, Moves.COVET, Moves.SEISMIC_TOSS ], [Species.HORSEA]: [ Moves.SNIPE_SHOT, Moves.FROST_BREATH, Moves.SLUDGE_BOMB, Moves.CLANGING_SCALES ], [Species.GOLDEEN]: [ Moves.GLACIAL_LANCE, Moves.SUPERCELL_SLAM, Moves.DRAGON_DANCE, Moves.FISHIOUS_REND ], [Species.STARYU]: [ Moves.CALM_MIND, Moves.BOUNCY_BUBBLE, Moves.MOONBLAST, Moves.MYSTICAL_POWER ], @@ -112,7 +112,7 @@ export const speciesEggMoves = { [Species.REMORAID]: [ Moves.WATER_SHURIKEN, Moves.TAKE_HEART, Moves.SHELL_SIDE_ARM, Moves.BOUNCY_BUBBLE ], [Species.DELIBIRD]: [ Moves.BONEMERANG, Moves.FLOATY_FALL, Moves.VICTORY_DANCE, Moves.GLACIAL_LANCE ], [Species.SKARMORY]: [ Moves.ROOST, Moves.BODY_PRESS, Moves.SPIKY_SHIELD, Moves.BEAK_BLAST ], - [Species.HOUNDOUR]: [ Moves.EARTH_POWER, Moves.THUNDERBOLT, Moves.MOONBLAST, Moves.FIERY_WRATH ], + [Species.HOUNDOUR]: [ Moves.FIERY_WRATH, Moves.THUNDERBOLT, Moves.MOONBLAST, Moves.ARMOR_CANNON ], [Species.PHANPY]: [ Moves.SHORE_UP, Moves.SWORDS_DANCE, Moves.MOUNTAIN_GALE, Moves.COLLISION_COURSE ], [Species.STANTLER]: [ Moves.THUNDEROUS_KICK, Moves.PHOTON_GEYSER, Moves.SWORDS_DANCE, Moves.BOOMBURST ], [Species.SMEARGLE]: [ Moves.CONVERSION, Moves.BURNING_BULWARK, Moves.SALT_CURE, Moves.DARK_VOID ], @@ -132,7 +132,7 @@ export const speciesEggMoves = { [Species.TREECKO]: [ Moves.NASTY_PLOT, Moves.CORE_ENFORCER, Moves.FLAMETHROWER, Moves.SEED_FLARE ], [Species.TORCHIC]: [ Moves.THUNDEROUS_KICK, Moves.ZING_ZAP, Moves.BURNING_BULWARK, Moves.PYRO_BALL ], [Species.MUDKIP]: [ Moves.SHORE_UP, Moves.MOUNTAIN_GALE, Moves.AQUA_STEP, Moves.PRECIPICE_BLADES ], - [Species.POOCHYENA]: [ Moves.JAW_LOCK, Moves.CLOSE_COMBAT, Moves.DIRE_CLAW, Moves.NO_RETREAT ], + [Species.POOCHYENA]: [ Moves.KNOCK_OFF, Moves.CLOSE_COMBAT, Moves.DIRE_CLAW, Moves.VICTORY_DANCE ], [Species.ZIGZAGOON]: [ Moves.EXTREME_SPEED, Moves.NUZZLE, Moves.HIGH_HORSEPOWER, Moves.TIDY_UP ], [Species.WURMPLE]: [ Moves.BATON_PASS, Moves.BLEAKWIND_STORM, Moves.STORED_POWER, Moves.MALIGNANT_CHAIN ], [Species.LOTAD]: [ Moves.REVELATION_DANCE, Moves.APPLE_ACID, Moves.ICE_BEAM, Moves.QUIVER_DANCE ], @@ -185,26 +185,26 @@ export const speciesEggMoves = { [Species.TROPIUS]: [ Moves.STUFF_CHEEKS, Moves.EARTH_POWER, Moves.APPLE_ACID, Moves.SAPPY_SEED ], [Species.ABSOL]: [ Moves.KOWTOW_CLEAVE, Moves.SACRED_SWORD, Moves.PSYBLADE, Moves.BITTER_BLADE ], [Species.WYNAUT]: [ Moves.RECOVER, Moves.SHED_TAIL, Moves.TAUNT, Moves.COMEUPPANCE ], - [Species.SNORUNT]: [ Moves.FREEZY_FROST, Moves.EXTREME_SPEED, Moves.EARTH_POWER, Moves.NO_RETREAT ], + [Species.SNORUNT]: [ Moves.SPARKLY_SWIRL, Moves.NASTY_PLOT, Moves.EARTH_POWER, Moves.BLOOD_MOON ], [Species.SPHEAL]: [ Moves.FLIP_TURN, Moves.FREEZE_DRY, Moves.SLACK_OFF, Moves.STEAM_ERUPTION ], [Species.CLAMPERL]: [ Moves.SHELL_SIDE_ARM, Moves.BOUNCY_BUBBLE, Moves.FREEZE_DRY, Moves.STEAM_ERUPTION ], [Species.RELICANTH]: [ Moves.DRAGON_DANCE, Moves.SHORE_UP, Moves.WAVE_CRASH, Moves.DIAMOND_STORM ], [Species.LUVDISC]: [ Moves.BATON_PASS, Moves.HEART_SWAP, Moves.GLITZY_GLOW, Moves.REVIVAL_BLESSING ], - [Species.BAGON]: [ Moves.FLOATY_FALL, Moves.FIRE_LASH, Moves.DRAGON_DANCE, Moves.DRAGON_DARTS ], + [Species.BAGON]: [ Moves.HEADLONG_RUSH, Moves.FIRE_LASH, Moves.DRAGON_DANCE, Moves.DRAGON_DARTS ], [Species.BELDUM]: [ Moves.HEADLONG_RUSH, Moves.DRAIN_PUNCH, Moves.TRIPLE_AXEL, Moves.SHIFT_GEAR ], [Species.REGIROCK]: [ Moves.STONE_AXE, Moves.BODY_PRESS, Moves.SHORE_UP, Moves.SALT_CURE ], [Species.REGICE]: [ Moves.EARTH_POWER, Moves.TAKE_HEART, Moves.RECOVER, Moves.FREEZE_DRY ], [Species.REGISTEEL]: [ Moves.BODY_PRESS, Moves.SIZZLY_SLIDE, Moves.RECOVER, Moves.GIGATON_HAMMER ], [Species.LATIAS]: [ Moves.CORE_ENFORCER, Moves.FUSION_FLARE, Moves.SPARKLY_SWIRL, Moves.MYSTICAL_POWER ], [Species.LATIOS]: [ Moves.CORE_ENFORCER, Moves.BLUE_FLARE, Moves.NASTY_PLOT, Moves.TACHYON_CUTTER ], - [Species.KYOGRE]: [ Moves.WILDBOLT_STORM, Moves.HURRICANE, Moves.FREEZY_FROST, Moves.BOUNCY_BUBBLE ], + [Species.KYOGRE]: [ Moves.RECOVER, Moves.HURRICANE, Moves.FREEZY_FROST, Moves.WILDBOLT_STORM ], [Species.GROUDON]: [ Moves.STONE_AXE, Moves.SOLAR_BLADE, Moves.MORNING_SUN, Moves.SACRED_FIRE ], [Species.RAYQUAZA]: [ Moves.V_CREATE, Moves.DRAGON_DARTS, Moves.CORE_ENFORCER, Moves.OBLIVION_WING ], [Species.JIRACHI]: [ Moves.TACHYON_CUTTER, Moves.TRIPLE_ARROWS, Moves.ROCK_SLIDE, Moves.SHELL_SMASH ], [Species.DEOXYS]: [ Moves.COLLISION_COURSE, Moves.FUSION_FLARE, Moves.PARTING_SHOT, Moves.LUMINA_CRASH ], [Species.TURTWIG]: [ Moves.SHELL_SMASH, Moves.MIGHTY_CLEAVE, Moves.ICE_SPINNER, Moves.SAPPY_SEED ], - [Species.CHIMCHAR]: [ Moves.FIERY_DANCE, Moves.SECRET_SWORD, Moves.TRIPLE_AXEL, Moves.SACRED_FIRE ], + [Species.CHIMCHAR]: [ Moves.THUNDERBOLT, Moves.SECRET_SWORD, Moves.TRIPLE_AXEL, Moves.SACRED_FIRE ], [Species.PIPLUP]: [ Moves.KINGS_SHIELD, Moves.TACHYON_CUTTER, Moves.FREEZE_DRY, Moves.STEAM_ERUPTION ], [Species.STARLY]: [ Moves.SWORDS_DANCE, Moves.HEAD_CHARGE, Moves.FLARE_BLITZ, Moves.EXTREME_SPEED ], [Species.BIDOOF]: [ Moves.EXTREME_SPEED, Moves.COSMIC_POWER, Moves.POWER_TRIP, Moves.AQUA_STEP ], @@ -215,15 +215,15 @@ export const speciesEggMoves = { [Species.SHIELDON]: [ Moves.SHORE_UP, Moves.BODY_PRESS, Moves.KINGS_SHIELD, Moves.DIAMOND_STORM ], [Species.BURMY]: [ Moves.FIERY_DANCE, Moves.DEFEND_ORDER, Moves.HEAL_ORDER, Moves.SAPPY_SEED ], [Species.COMBEE]: [ Moves.SPORE, Moves.FLOATY_FALL, Moves.KINGS_SHIELD, Moves.VICTORY_DANCE ], - [Species.PACHIRISU]: [ Moves.FREEZY_FROST, Moves.SIZZLY_SLIDE, Moves.SLACK_OFF, Moves.ZIPPY_ZAP ], + [Species.PACHIRISU]: [ Moves.FREEZY_FROST, Moves.SIZZLY_SLIDE, Moves.SLACK_OFF, Moves.THUNDER_CAGE ], [Species.BUIZEL]: [ Moves.JET_PUNCH, Moves.TRIPLE_AXEL, Moves.SUPERCELL_SLAM, Moves.SURGING_STRIKES ], [Species.CHERUBI]: [ Moves.SLEEP_POWDER, Moves.STRENGTH_SAP, Moves.FIRE_LASH, Moves.FLOWER_TRICK ], [Species.SHELLOS]: [ Moves.BOUNCY_BUBBLE, Moves.SCORCHING_SANDS, Moves.FREEZE_DRY, Moves.STEAM_ERUPTION ], - [Species.DRIFLOON]: [ Moves.WILL_O_WISP, Moves.MIND_BLOWN, Moves.CALM_MIND, Moves.OBLIVION_WING ], - [Species.BUNEARY]: [ Moves.TRIPLE_AXEL, Moves.SWORDS_DANCE, Moves.THUNDEROUS_KICK, Moves.MULTI_ATTACK ], + [Species.DRIFLOON]: [ Moves.PSYCHO_SHIFT, Moves.MIND_BLOWN, Moves.CALM_MIND, Moves.OBLIVION_WING ], + [Species.BUNEARY]: [ Moves.TRIPLE_AXEL, Moves.EXTREME_SPEED, Moves.THUNDEROUS_KICK, Moves.SWORDS_DANCE ], [Species.GLAMEOW]: [ Moves.PARTING_SHOT, Moves.HIGH_HORSEPOWER, Moves.SWORDS_DANCE, Moves.EXTREME_SPEED ], [Species.CHINGLING]: [ Moves.BUZZY_BUZZ, Moves.EERIE_SPELL, Moves.TORCH_SONG, Moves.BOOMBURST ], - [Species.STUNKY]: [ Moves.CEASELESS_EDGE, Moves.KNOCK_OFF, Moves.RECOVER, Moves.DIRE_CLAW ], + [Species.STUNKY]: [ Moves.CEASELESS_EDGE, Moves.FIRE_LASH, Moves.RECOVER, Moves.DIRE_CLAW ], [Species.BRONZOR]: [ Moves.RECOVER, Moves.TACHYON_CUTTER, Moves.GLARE, Moves.LUMINA_CRASH ], [Species.BONSLY]: [ Moves.ACCELEROCK, Moves.SWORDS_DANCE, Moves.STRENGTH_SAP, Moves.SAPPY_SEED ], [Species.MIME_JR]: [ Moves.CHILLY_RECEPTION, Moves.MOONBLAST, Moves.FROST_BREATH, Moves.LUMINA_CRASH ], @@ -237,18 +237,18 @@ export const speciesEggMoves = { [Species.SKORUPI]: [ Moves.COIL, Moves.DIRE_CLAW, Moves.CRABHAMMER, Moves.WICKED_BLOW ], [Species.CROAGUNK]: [ Moves.DIRE_CLAW, Moves.ICE_SPINNER, Moves.THUNDEROUS_KICK, Moves.VICTORY_DANCE ], [Species.CARNIVINE]: [ Moves.STRENGTH_SAP, Moves.FIRE_LASH, Moves.COIL, Moves.SAPPY_SEED ], - [Species.FINNEON]: [ Moves.QUIVER_DANCE, Moves.BOUNCY_BUBBLE, Moves.FREEZE_DRY, Moves.ORIGIN_PULSE ], + [Species.FINNEON]: [ Moves.QUIVER_DANCE, Moves.SPLISHY_SPLASH, Moves.FREEZE_DRY, Moves.OBLIVION_WING ], [Species.MANTYKE]: [ Moves.SPLISHY_SPLASH, Moves.FREEZY_FROST, Moves.NASTY_PLOT, Moves.OBLIVION_WING ], [Species.SNOVER]: [ Moves.LANDS_WRATH, Moves.POWDER, Moves.CALM_MIND, Moves.MATCHA_GOTCHA ], [Species.ROTOM]: [ Moves.STRENGTH_SAP, Moves.FIERY_DANCE, Moves.SPLISHY_SPLASH, Moves.ELECTRO_DRIFT ], - [Species.UXIE]: [ Moves.COSMIC_POWER, Moves.SECRET_SWORD, Moves.RECOVER, Moves.SPARKLY_SWIRL ], - [Species.MESPRIT]: [ Moves.TAIL_GLOW, Moves.AURA_SPHERE, Moves.RECOVER, Moves.LUMINA_CRASH ], - [Species.AZELF]: [ Moves.PSYSTRIKE, Moves.ICE_BEAM, Moves.MOONBLAST, Moves.TAIL_GLOW ], + [Species.UXIE]: [ Moves.LUMINA_CRASH, Moves.AURA_SPHERE, Moves.RECOVER, Moves.TAIL_GLOW ], + [Species.MESPRIT]: [ Moves.PHOTON_GEYSER, Moves.AURA_SPHERE, Moves.RECOVER, Moves.TAIL_GLOW ], + [Species.AZELF]: [ Moves.PSYSTRIKE, Moves.AURA_SPHERE, Moves.ICE_BEAM, Moves.TAIL_GLOW ], [Species.DIALGA]: [ Moves.CORE_ENFORCER, Moves.TAKE_HEART, Moves.RECOVER, Moves.MAKE_IT_RAIN ], [Species.PALKIA]: [ Moves.MALIGNANT_CHAIN, Moves.TAKE_HEART, Moves.RECOVER, Moves.ORIGIN_PULSE ], [Species.HEATRAN]: [ Moves.MATCHA_GOTCHA, Moves.RECOVER, Moves.ERUPTION, Moves.TACHYON_CUTTER ], [Species.REGIGIGAS]: [ Moves.SKILL_SWAP, Moves.RECOVER, Moves.EXTREME_SPEED, Moves.GIGATON_HAMMER ], - [Species.GIRATINA]: [ Moves.DRAGON_DANCE, Moves.GLAIVE_RUSH, Moves.RECOVER, Moves.SPECTRAL_THIEF ], + [Species.GIRATINA]: [ Moves.DRAGON_DANCE, Moves.SPECTRAL_THIEF, Moves.RECOVER, Moves.COLLISION_COURSE ], [Species.CRESSELIA]: [ Moves.COSMIC_POWER, Moves.BODY_PRESS, Moves.SIZZLY_SLIDE, Moves.LUMINA_CRASH ], [Species.PHIONE]: [ Moves.BOUNCY_BUBBLE, Moves.FREEZE_DRY, Moves.STORED_POWER, Moves.ORIGIN_PULSE ], [Species.MANAPHY]: [ Moves.BOUNCY_BUBBLE, Moves.FROST_BREATH, Moves.WILDBOLT_STORM, Moves.ORIGIN_PULSE ], @@ -264,14 +264,14 @@ export const speciesEggMoves = { [Species.LILLIPUP]: [ Moves.CLOSE_COMBAT, Moves.BODY_SLAM, Moves.HIGH_HORSEPOWER, Moves.LAST_RESPECTS ], [Species.PURRLOIN]: [ Moves.ENCORE, Moves.OBSTRUCT, Moves.PARTING_SHOT, Moves.WICKED_BLOW ], [Species.PANSAGE]: [ Moves.SWORDS_DANCE, Moves.FIRE_LASH, Moves.EARTHQUAKE, Moves.IVY_CUDGEL ], - [Species.PANSEAR]: [ Moves.NASTY_PLOT, Moves.HYDRO_STEAM, Moves.SCORCHING_SANDS, Moves.TORCH_SONG ], - [Species.PANPOUR]: [ Moves.NASTY_PLOT, Moves.ENERGY_BALL, Moves.EARTH_POWER, Moves.STEAM_ERUPTION ], + [Species.PANSEAR]: [ Moves.NASTY_PLOT, Moves.HYDRO_STEAM, Moves.EARTH_POWER, Moves.ERUPTION ], + [Species.PANPOUR]: [ Moves.NASTY_PLOT, Moves.ENERGY_BALL, Moves.EARTH_POWER, Moves.WATER_SPOUT ], [Species.MUNNA]: [ Moves.COSMIC_POWER, Moves.AURA_SPHERE, Moves.LUNAR_BLESSING, Moves.MYSTICAL_POWER ], [Species.PIDOVE]: [ Moves.GUNK_SHOT, Moves.TIDY_UP, Moves.FLOATY_FALL, Moves.TRIPLE_ARROWS ], [Species.BLITZLE]: [ Moves.HORN_LEECH, Moves.SWORDS_DANCE, Moves.FLARE_BLITZ, Moves.BOLT_STRIKE ], [Species.ROGGENROLA]: [ Moves.BODY_PRESS, Moves.CURSE, Moves.SHORE_UP, Moves.DIAMOND_STORM ], [Species.WOOBAT]: [ Moves.ESPER_WING, Moves.STORED_POWER, Moves.MYSTICAL_FIRE, Moves.OBLIVION_WING ], - [Species.DRILBUR]: [ Moves.METEOR_MASH, Moves.MOUNTAIN_GALE, Moves.SHIFT_GEAR, Moves.PRECIPICE_BLADES ], + [Species.DRILBUR]: [ Moves.METEOR_MASH, Moves.ICE_SPINNER, Moves.SHIFT_GEAR, Moves.THOUSAND_ARROWS ], [Species.AUDINO]: [ Moves.TAKE_HEART, Moves.MOONBLAST, Moves.WISH, Moves.MATCHA_GOTCHA ], [Species.TIMBURR]: [ Moves.MACH_PUNCH, Moves.DRAIN_PUNCH, Moves.ICE_HAMMER, Moves.DOUBLE_IRON_BASH ], [Species.TYMPOLE]: [ Moves.JET_PUNCH, Moves.HIGH_HORSEPOWER, Moves.BULK_UP, Moves.SURGING_STRIKES ], @@ -298,18 +298,18 @@ export const speciesEggMoves = { [Species.SOLOSIS]: [ Moves.MIST_BALL, Moves.SPEED_SWAP, Moves.FLAMETHROWER, Moves.LIGHT_OF_RUIN ], [Species.DUCKLETT]: [ Moves.SPLISHY_SPLASH, Moves.SANDSEAR_STORM, Moves.WILDBOLT_STORM, Moves.QUIVER_DANCE ], [Species.VANILLITE]: [ Moves.EARTH_POWER, Moves.AURORA_VEIL, Moves.CALM_MIND, Moves.SPARKLY_SWIRL ], - [Species.DEERLING]: [ Moves.TIDY_UP, Moves.FLOWER_TRICK, Moves.BODY_SLAM, Moves.COMBAT_TORQUE ], + [Species.DEERLING]: [ Moves.TIDY_UP, Moves.HEADBUTT, Moves.COMBAT_TORQUE, Moves.FLOWER_TRICK ], [Species.EMOLGA]: [ Moves.ICICLE_CRASH, Moves.ZING_ZAP, Moves.FLOATY_FALL, Moves.ELECTRIFY ], [Species.KARRABLAST]: [ Moves.LEECH_LIFE, Moves.BITTER_BLADE, Moves.OBSTRUCT, Moves.DOUBLE_IRON_BASH ], [Species.FOONGUS]: [ Moves.POLLEN_PUFF, Moves.PARTING_SHOT, Moves.FOUL_PLAY, Moves.SAPPY_SEED ], [Species.FRILLISH]: [ Moves.CALM_MIND, Moves.BUZZY_BUZZ, Moves.FREEZE_DRY, Moves.STEAM_ERUPTION ], [Species.ALOMOMOLA]: [ Moves.FLIP_TURN, Moves.HEART_SWAP, Moves.GLITZY_GLOW, Moves.REVIVAL_BLESSING ], [Species.JOLTIK]: [ Moves.WILDBOLT_STORM, Moves.PARABOLIC_CHARGE, Moves.EARTH_POWER, Moves.QUIVER_DANCE ], - [Species.FERROSEED]: [ Moves.SYNTHESIS, Moves.COMBAT_TORQUE, Moves.SPIKY_SHIELD, Moves.SAPPY_SEED ], + [Species.FERROSEED]: [ Moves.SYNTHESIS, Moves.CEASELESS_EDGE, Moves.SPIKY_SHIELD, Moves.SAPPY_SEED ], [Species.KLINK]: [ Moves.TRIPLE_AXEL, Moves.HIGH_HORSEPOWER, Moves.RECOVER, Moves.AURA_WHEEL ], [Species.TYNAMO]: [ Moves.SCALD, Moves.STRENGTH_SAP, Moves.FIRE_LASH, Moves.AURA_WHEEL ], [Species.ELGYEM]: [ Moves.THUNDERCLAP, Moves.BADDY_BAD, Moves.AURA_SPHERE, Moves.PHOTON_GEYSER ], - [Species.LITWICK]: [ Moves.PARTING_SHOT, Moves.EARTH_POWER, Moves.MOONBLAST, Moves.TORCH_SONG ], + [Species.LITWICK]: [ Moves.GIGA_DRAIN, Moves.EARTH_POWER, Moves.MOONBLAST, Moves.TORCH_SONG ], [Species.AXEW]: [ Moves.STONE_AXE, Moves.DIRE_CLAW, Moves.BITTER_BLADE, Moves.GLAIVE_RUSH ], [Species.CUBCHOO]: [ Moves.MOUNTAIN_GALE, Moves.AQUA_STEP, Moves.ICE_SHARD, Moves.COLLISION_COURSE ], [Species.CRYOGONAL]: [ Moves.FREEZING_GLARE, Moves.AURORA_VEIL, Moves.NASTY_PLOT, Moves.ORIGIN_PULSE ], @@ -325,14 +325,14 @@ export const speciesEggMoves = { [Species.HEATMOR]: [ Moves.EARTH_POWER, Moves.OVERHEAT, Moves.THUNDERBOLT, Moves.V_CREATE ], [Species.DURANT]: [ Moves.HIGH_HORSEPOWER, Moves.FIRST_IMPRESSION, Moves.SWORDS_DANCE, Moves.BEHEMOTH_BASH ], [Species.DEINO]: [ Moves.FIERY_WRATH, Moves.ESPER_WING, Moves.SLUDGE_BOMB, Moves.FICKLE_BEAM ], - [Species.LARVESTA]: [ Moves.THUNDERBOLT, Moves.MAGMA_STORM, Moves.EARTH_POWER, Moves.MATCHA_GOTCHA ], + [Species.LARVESTA]: [ Moves.THUNDERBOLT, Moves.DAZZLING_GLEAM, Moves.EARTH_POWER, Moves.HYDRO_STEAM ], [Species.COBALION]: [ Moves.BEHEMOTH_BLADE, Moves.MIGHTY_CLEAVE, Moves.CEASELESS_EDGE, Moves.VICTORY_DANCE ], [Species.TERRAKION]: [ Moves.MIGHTY_CLEAVE, Moves.HEADLONG_RUSH, Moves.CEASELESS_EDGE, Moves.VICTORY_DANCE ], - [Species.VIRIZION]: [ Moves.PSYBLADE, Moves.SAPPY_SEED, Moves.CEASELESS_EDGE, Moves.VICTORY_DANCE ], + [Species.VIRIZION]: [ Moves.SAPPY_SEED, Moves.PSYBLADE, Moves.CEASELESS_EDGE, Moves.VICTORY_DANCE ], [Species.TORNADUS]: [ Moves.SANDSEAR_STORM, Moves.PARTING_SHOT, Moves.SPLISHY_SPLASH, Moves.OBLIVION_WING ], [Species.THUNDURUS]: [ Moves.SANDSEAR_STORM, Moves.HURRICANE, Moves.FROST_BREATH, Moves.ELECTRO_SHOT ], [Species.RESHIRAM]: [ Moves.ENERGY_BALL, Moves.TAKE_HEART, Moves.FICKLE_BEAM, Moves.ERUPTION ], - [Species.ZEKROM]: [ Moves.TRIPLE_AXEL, Moves.THUNDEROUS_KICK, Moves.DRAGON_HAMMER, Moves.BOLT_BEAK ], + [Species.ZEKROM]: [ Moves.TRIPLE_AXEL, Moves.THUNDEROUS_KICK, Moves.DRAGON_HAMMER, Moves.DRAGON_ENERGY ], [Species.LANDORUS]: [ Moves.STONE_AXE, Moves.FLOATY_FALL, Moves.ROOST, Moves.BLEAKWIND_STORM ], [Species.KYUREM]: [ Moves.DRAGON_DARTS, Moves.GLACIAL_LANCE, Moves.NO_RETREAT, Moves.DRAGON_ENERGY ], [Species.KELDEO]: [ Moves.BOUNCY_BUBBLE, Moves.THUNDERBOLT, Moves.ICE_BEAM, Moves.STEAM_ERUPTION ], @@ -366,35 +366,35 @@ export const speciesEggMoves = { [Species.CARBINK]: [ Moves.BODY_PRESS, Moves.SHORE_UP, Moves.SPARKLY_SWIRL, Moves.DIAMOND_STORM ], [Species.GOOMY]: [ Moves.DRAGON_HAMMER, Moves.RECOVER, Moves.CALM_MIND, Moves.MAKE_IT_RAIN ], [Species.KLEFKI]: [ Moves.HEAL_BELL, Moves.ENCORE, Moves.INSTRUCT, Moves.TOPSY_TURVY ], - [Species.PHANTUMP]: [ Moves.RAGE_FIST, Moves.SLEEP_POWDER, Moves.SYNTHESIS, Moves.SAPPY_SEED ], + [Species.PHANTUMP]: [ Moves.RAGE_FIST, Moves.SLEEP_POWDER, Moves.BULK_UP, Moves.SAPPY_SEED ], [Species.PUMPKABOO]: [ Moves.SPIRIT_SHACKLE, Moves.FIRE_LASH, Moves.DIRE_CLAW, Moves.SAPPY_SEED ], [Species.BERGMITE]: [ Moves.STONE_AXE, Moves.METAL_BURST, Moves.BODY_PRESS, Moves.GLACIAL_LANCE ], [Species.NOIBAT]: [ Moves.AEROBLAST, Moves.OVERDRIVE, Moves.NASTY_PLOT, Moves.CLANGING_SCALES ], [Species.XERNEAS]: [ Moves.EARTH_POWER, Moves.SPRINGTIDE_STORM, Moves.STRENGTH_SAP, Moves.TAIL_GLOW ], - [Species.YVELTAL]: [ Moves.SHELL_SIDE_ARM, Moves.POWER_TRIP, Moves.FIERY_WRATH, Moves.CLANGOROUS_SOUL ], + [Species.YVELTAL]: [ Moves.SLUDGE_WAVE, Moves.POWER_TRIP, Moves.FIERY_WRATH, Moves.CLANGOROUS_SOUL ], [Species.ZYGARDE]: [ Moves.DRAGON_DARTS, Moves.HEAL_ORDER, Moves.CLANGOROUS_SOUL, Moves.DOUBLE_IRON_BASH ], [Species.DIANCIE]: [ Moves.MAGICAL_TORQUE, Moves.FIERY_DANCE, Moves.SHORE_UP, Moves.GEOMANCY ], [Species.HOOPA]: [ Moves.PHOTON_GEYSER, Moves.SECRET_SWORD, Moves.FIERY_WRATH, Moves.SHELL_SMASH ], - [Species.VOLCANION]: [ Moves.HYDRO_STEAM, Moves.CALM_MIND, Moves.ENERGY_BALL, Moves.MAGMA_STORM ], + [Species.VOLCANION]: [ Moves.HYDRO_STEAM, Moves.CALM_MIND, Moves.SEARING_SHOT, Moves.THUNDERCLAP ], [Species.ETERNAL_FLOETTE]: [ Moves.MIND_BLOWN, Moves.CHLOROBLAST, Moves.LUSTER_PURGE, Moves.QUIVER_DANCE ], [Species.ROWLET]: [ Moves.THOUSAND_ARROWS, Moves.SHADOW_BONE, Moves.FIRST_IMPRESSION, Moves.VICTORY_DANCE ], [Species.LITTEN]: [ Moves.SUCKER_PUNCH, Moves.PARTING_SHOT, Moves.SLACK_OFF, Moves.SACRED_FIRE ], - [Species.POPPLIO]: [ Moves.PSYCHIC_NOISE, Moves.BOUNCY_BUBBLE, Moves.OVERDRIVE, Moves.TORCH_SONG ], + [Species.POPPLIO]: [ Moves.PSYCHIC_NOISE, Moves.MOONLIGHT, Moves.OVERDRIVE, Moves.TORCH_SONG ], [Species.PIKIPEK]: [ Moves.DUAL_WINGBEAT, Moves.BONE_RUSH, Moves.BURNING_BULWARK, Moves.POPULATION_BOMB ], [Species.YUNGOOS]: [ Moves.EXTREME_SPEED, Moves.KNOCK_OFF, Moves.TIDY_UP, Moves.MULTI_ATTACK ], [Species.GRUBBIN]: [ Moves.ICE_BEAM, Moves.EARTH_POWER, Moves.THUNDERCLAP, Moves.QUIVER_DANCE ], - [Species.CRABRAWLER]: [ Moves.JET_PUNCH, Moves.SHORE_UP, Moves.SUCKER_PUNCH, Moves.SURGING_STRIKES ], + [Species.CRABRAWLER]: [ Moves.JET_PUNCH, Moves.SHORE_UP, Moves.MACH_PUNCH, Moves.SURGING_STRIKES ], [Species.ORICORIO]: [ Moves.QUIVER_DANCE, Moves.FIERY_DANCE, Moves.THUNDERCLAP, Moves.OBLIVION_WING ], [Species.CUTIEFLY]: [ Moves.STICKY_WEB, Moves.SLEEP_POWDER, Moves.HEAT_WAVE, Moves.SPARKLY_SWIRL ], [Species.ROCKRUFF]: [ Moves.HIGH_HORSEPOWER, Moves.TIDY_UP, Moves.ICE_SPINNER, Moves.MIGHTY_CLEAVE ], [Species.WISHIWASHI]: [ Moves.HEAL_ORDER, Moves.FREEZE_DRY, Moves.WATER_SHURIKEN, Moves.TAIL_GLOW ], [Species.MAREANIE]: [ Moves.CEASELESS_EDGE, Moves.SIZZLY_SLIDE, Moves.BODY_PRESS, Moves.LEECH_SEED ], [Species.MUDBRAY]: [ Moves.BODY_PRESS, Moves.YAWN, Moves.SHORE_UP, Moves.THOUSAND_WAVES ], - [Species.DEWPIDER]: [ Moves.JET_PUNCH, Moves.SILK_TRAP, Moves.SWORDS_DANCE, Moves.AQUA_STEP ], + [Species.DEWPIDER]: [ Moves.AQUA_STEP, Moves.SILK_TRAP, Moves.SWORDS_DANCE, Moves.JET_PUNCH ], [Species.FOMANTIS]: [ Moves.SUPERPOWER, Moves.HEADLONG_RUSH, Moves.ICE_HAMMER, Moves.BITTER_BLADE ], [Species.MORELULL]: [ Moves.CALM_MIND, Moves.SAPPY_SEED, Moves.DRAINING_KISS, Moves.MATCHA_GOTCHA ], - [Species.SALANDIT]: [ Moves.SCALD, Moves.SLUDGE_WAVE, Moves.CORE_ENFORCER, Moves.ERUPTION ], + [Species.SALANDIT]: [ Moves.SCALD, Moves.MALIGNANT_CHAIN, Moves.CORE_ENFORCER, Moves.ERUPTION ], [Species.STUFFUL]: [ Moves.DRAIN_PUNCH, Moves.METEOR_MASH, Moves.TRIPLE_AXEL, Moves.RAGE_FIST ], [Species.BOUNSWEET]: [ Moves.TRIPLE_AXEL, Moves.AQUA_STEP, Moves.THUNDEROUS_KICK, Moves.SAPPY_SEED ], [Species.COMFEY]: [ Moves.REVIVAL_BLESSING, Moves.TAKE_HEART, Moves.STRENGTH_SAP, Moves.MATCHA_GOTCHA ], @@ -416,25 +416,25 @@ export const speciesEggMoves = { [Species.TAPU_KOKO]: [ Moves.MAGICAL_TORQUE, Moves.TRIPLE_AXEL, Moves.SWORDS_DANCE, Moves.BOLT_STRIKE ], [Species.TAPU_LELE]: [ Moves.MOONLIGHT, Moves.NASTY_PLOT, Moves.HEAT_WAVE, Moves.EXPANDING_FORCE ], [Species.TAPU_BULU]: [ Moves.SAPPY_SEED, Moves.DRAIN_PUNCH, Moves.MAGICAL_TORQUE, Moves.VICTORY_DANCE ], - [Species.TAPU_FINI]: [ Moves.AURA_SPHERE, Moves.EARTH_POWER, Moves.RECOVER, Moves.QUIVER_DANCE ], + [Species.TAPU_FINI]: [ Moves.SPRINGTIDE_STORM, Moves.EARTH_POWER, Moves.RECOVER, Moves.QUIVER_DANCE ], [Species.COSMOG]: [ Moves.PHOTON_GEYSER, Moves.PRECIPICE_BLADES, Moves.SACRED_FIRE, Moves.ASTRAL_BARRAGE ], [Species.NIHILEGO]: [ Moves.STRENGTH_SAP, Moves.MALIGNANT_CHAIN, Moves.EARTH_POWER, Moves.QUIVER_DANCE ], [Species.BUZZWOLE]: [ Moves.FIRST_IMPRESSION, Moves.COMBAT_TORQUE, Moves.ROCK_BLAST, Moves.DOUBLE_IRON_BASH ], [Species.PHEROMOSA]: [ Moves.SECRET_SWORD, Moves.MAKE_IT_RAIN, Moves.ATTACK_ORDER, Moves.DIAMOND_STORM ], [Species.XURKITREE]: [ Moves.FLAMETHROWER, Moves.GIGA_DRAIN, Moves.TAIL_GLOW, Moves.THUNDERCLAP ], - [Species.CELESTEELA]: [ Moves.RECOVER, Moves.BUZZY_BUZZ, Moves.SANDSEAR_STORM, Moves.OBLIVION_WING ], + [Species.CELESTEELA]: [ Moves.RECOVER, Moves.BUZZY_BUZZ, Moves.EARTH_POWER, Moves.OBLIVION_WING ], [Species.KARTANA]: [ Moves.MIGHTY_CLEAVE, Moves.PSYBLADE, Moves.BITTER_BLADE, Moves.BEHEMOTH_BLADE ], [Species.GUZZLORD]: [ Moves.SUCKER_PUNCH, Moves.COMEUPPANCE, Moves.SLACK_OFF, Moves.SHED_TAIL ], [Species.NECROZMA]: [ Moves.DYNAMAX_CANNON, Moves.SACRED_FIRE, Moves.ASTRAL_BARRAGE, Moves.CLANGOROUS_SOUL ], [Species.MAGEARNA]: [ Moves.STRENGTH_SAP, Moves.EARTH_POWER, Moves.MOONBLAST, Moves.MAKE_IT_RAIN ], - [Species.MARSHADOW]: [ Moves.POWER_UP_PUNCH, Moves.TRIPLE_AXEL, Moves.METEOR_MASH, Moves.STORM_THROW ], + [Species.MARSHADOW]: [ Moves.POWER_UP_PUNCH, Moves.BONEMERANG, Moves.METEOR_MASH, Moves.TRIPLE_AXEL ], [Species.POIPOLE]: [ Moves.MALIGNANT_CHAIN, Moves.ICE_BEAM, Moves.ARMOR_CANNON, Moves.CLANGING_SCALES ], [Species.STAKATAKA]: [ Moves.HEAVY_SLAM, Moves.SHORE_UP, Moves.CURSE, Moves.SALT_CURE ], [Species.BLACEPHALON]: [ Moves.STEEL_BEAM, Moves.MOONBLAST, Moves.CHLOROBLAST, Moves.MOONGEIST_BEAM ], - [Species.ZERAORA]: [ Moves.SWORDS_DANCE, Moves.TRIPLE_AXEL, Moves.BOLT_STRIKE, Moves.PYRO_BALL ], + [Species.ZERAORA]: [ Moves.SWORDS_DANCE, Moves.U_TURN, Moves.COLLISION_COURSE, Moves.TRIPLE_AXEL ], [Species.MELTAN]: [ Moves.BULLET_PUNCH, Moves.DRAIN_PUNCH, Moves.BULK_UP, Moves.PLASMA_FISTS ], [Species.ALOLA_RATTATA]: [ Moves.FALSE_SURRENDER, Moves.PSYCHIC_FANGS, Moves.COIL, Moves.EXTREME_SPEED ], - [Species.ALOLA_SANDSHREW]: [ Moves.SPIKY_SHIELD, Moves.AQUA_CUTTER, Moves.SHIFT_GEAR, Moves.GLACIAL_LANCE ], + [Species.ALOLA_SANDSHREW]: [ Moves.SPIKY_SHIELD, Moves.LIQUIDATION, Moves.SHIFT_GEAR, Moves.GLACIAL_LANCE ], [Species.ALOLA_VULPIX]: [ Moves.MOONBLAST, Moves.PARTING_SHOT, Moves.EARTH_POWER, Moves.REVIVAL_BLESSING ], [Species.ALOLA_DIGLETT]: [ Moves.THOUSAND_WAVES, Moves.SWORDS_DANCE, Moves.TRIPLE_DIVE, Moves.MOUNTAIN_GALE ], [Species.ALOLA_MEOWTH]: [ Moves.BADDY_BAD, Moves.BUZZY_BUZZ, Moves.PARTING_SHOT, Moves.MAKE_IT_RAIN ], @@ -449,22 +449,22 @@ export const speciesEggMoves = { [Species.BLIPBUG]: [ Moves.HEAL_ORDER, Moves.LUSTER_PURGE, Moves.SLEEP_POWDER, Moves.TAIL_GLOW ], [Species.NICKIT]: [ Moves.BADDY_BAD, Moves.FLAMETHROWER, Moves.SPARKLY_SWIRL, Moves.MAKE_IT_RAIN ], [Species.GOSSIFLEUR]: [ Moves.PARTING_SHOT, Moves.STRENGTH_SAP, Moves.SAPPY_SEED, Moves.SEED_FLARE ], - [Species.WOOLOO]: [ Moves.PSYSHIELD_BASH, Moves.MILK_DRINK, Moves.BODY_PRESS, Moves.MULTI_ATTACK ], + [Species.WOOLOO]: [ Moves.NUZZLE, Moves.MILK_DRINK, Moves.BODY_PRESS, Moves.MULTI_ATTACK ], [Species.CHEWTLE]: [ Moves.ICE_FANG, Moves.PSYCHIC_FANGS, Moves.SHELL_SMASH, Moves.MIGHTY_CLEAVE ], [Species.YAMPER]: [ Moves.ICE_FANG, Moves.SWORDS_DANCE, Moves.THUNDER_FANG, Moves.BOLT_STRIKE ], [Species.ROLYCOLY]: [ Moves.BITTER_BLADE, Moves.BODY_PRESS, Moves.BULK_UP, Moves.DIAMOND_STORM ], [Species.APPLIN]: [ Moves.CORE_ENFORCER, Moves.DRAGON_HAMMER, Moves.FLOWER_TRICK, Moves.MATCHA_GOTCHA ], [Species.SILICOBRA]: [ Moves.SHORE_UP, Moves.SHED_TAIL, Moves.MOUNTAIN_GALE, Moves.THOUSAND_ARROWS ], - [Species.CRAMORANT]: [ Moves.APPLE_ACID, Moves.SURF, Moves.SCORCHING_SANDS, Moves.OBLIVION_WING ], + [Species.CRAMORANT]: [ Moves.APPLE_ACID, Moves.SURF, Moves.BOLT_BEAK, Moves.OBLIVION_WING ], [Species.ARROKUDA]: [ Moves.SUPERCELL_SLAM, Moves.TRIPLE_DIVE, Moves.ICE_SPINNER, Moves.SWORDS_DANCE ], [Species.TOXEL]: [ Moves.NASTY_PLOT, Moves.BUG_BUZZ, Moves.SPARKLING_ARIA, Moves.TORCH_SONG ], [Species.SIZZLIPEDE]: [ Moves.BURNING_BULWARK, Moves.ZING_ZAP, Moves.FIRST_IMPRESSION, Moves.BITTER_BLADE ], [Species.CLOBBOPUS]: [ Moves.STORM_THROW, Moves.JET_PUNCH, Moves.MACH_PUNCH, Moves.SURGING_STRIKES ], - [Species.SINISTEA]: [ Moves.SCALD, Moves.TAKE_HEART, Moves.SPARKLY_SWIRL, Moves.MATCHA_GOTCHA ], + [Species.SINISTEA]: [ Moves.SPLISHY_SPLASH, Moves.MATCHA_GOTCHA, Moves.DRAINING_KISS, Moves.MOONGEIST_BEAM ], [Species.HATENNA]: [ Moves.RECOVER, Moves.MOONBLAST, Moves.BUZZY_BUZZ, Moves.TORCH_SONG ], - [Species.IMPIDIMP]: [ Moves.ENCORE, Moves.PARTING_SHOT, Moves.TOPSY_TURVY, Moves.WICKED_BLOW ], + [Species.IMPIDIMP]: [ Moves.SLACK_OFF, Moves.PARTING_SHOT, Moves.OCTOLOCK, Moves.WICKED_BLOW ], [Species.MILCERY]: [ Moves.MOONBLAST, Moves.CHILLY_RECEPTION, Moves.EARTH_POWER, Moves.GEOMANCY ], - [Species.FALINKS]: [ Moves.COMBAT_TORQUE, Moves.PSYSHIELD_BASH, Moves.HEAL_ORDER, Moves.POPULATION_BOMB ], + [Species.FALINKS]: [ Moves.BATON_PASS, Moves.POWER_TRIP, Moves.HEAL_ORDER, Moves.COMBAT_TORQUE ], [Species.PINCURCHIN]: [ Moves.TRICK_ROOM, Moves.VOLT_SWITCH, Moves.STRENGTH_SAP, Moves.THUNDERCLAP ], [Species.SNOM]: [ Moves.FROST_BREATH, Moves.HEAL_ORDER, Moves.EARTH_POWER, Moves.SPORE ], [Species.STONJOURNER]: [ Moves.BODY_PRESS, Moves.HELPING_HAND, Moves.ACCELEROCK, Moves.DIAMOND_STORM ], @@ -484,9 +484,9 @@ export const speciesEggMoves = { [Species.KUBFU]: [ Moves.METEOR_MASH, Moves.DRAIN_PUNCH, Moves.JET_PUNCH, Moves.DRAGON_DANCE ], [Species.ZARUDE]: [ Moves.SAPPY_SEED, Moves.MIGHTY_CLEAVE, Moves.WICKED_BLOW, Moves.VICTORY_DANCE ], [Species.REGIELEKI]: [ Moves.NASTY_PLOT, Moves.ICE_BEAM, Moves.EARTH_POWER, Moves.ELECTRO_DRIFT ], - [Species.REGIDRAGO]: [ Moves.METEOR_MASH, Moves.FLAMETHROWER, Moves.TAKE_HEART, Moves.DRAGON_DARTS ], + [Species.REGIDRAGO]: [ Moves.SHELL_SIDE_ARM, Moves.FLAMETHROWER, Moves.TAKE_HEART, Moves.DRAGON_DARTS ], [Species.GLASTRIER]: [ Moves.SPEED_SWAP, Moves.SLACK_OFF, Moves.HIGH_HORSEPOWER, Moves.GLACIAL_LANCE ], - [Species.SPECTRIER]: [ Moves.EARTH_POWER, Moves.PARTING_SHOT, Moves.AURA_SPHERE, Moves.ASTRAL_BARRAGE ], + [Species.SPECTRIER]: [ Moves.EARTH_POWER, Moves.MOONLIGHT, Moves.AURA_SPHERE, Moves.ASTRAL_BARRAGE ], [Species.CALYREX]: [ Moves.SAPPY_SEED, Moves.RECOVER, Moves.SECRET_SWORD, Moves.PHOTON_GEYSER ], [Species.ENAMORUS]: [ Moves.AEROBLAST, Moves.THOUSAND_ARROWS, Moves.STORED_POWER, Moves.FLEUR_CANNON ], [Species.GALAR_MEOWTH]: [ Moves.LIQUIDATION, Moves.HORN_LEECH, Moves.BULLET_PUNCH, Moves.BEHEMOTH_BASH ], @@ -494,7 +494,7 @@ export const speciesEggMoves = { [Species.GALAR_SLOWPOKE]: [ Moves.SHED_TAIL, Moves.BADDY_BAD, Moves.MOONBLAST, Moves.PHOTON_GEYSER ], [Species.GALAR_FARFETCHD]: [ Moves.ROOST, Moves.SACRED_SWORD, Moves.KINGS_SHIELD, Moves.BEHEMOTH_BLADE ], [Species.GALAR_ARTICUNO]: [ Moves.SECRET_SWORD, Moves.NIGHT_DAZE, Moves.ICE_BEAM, Moves.OBLIVION_WING ], - [Species.GALAR_ZAPDOS]: [ Moves.TIDY_UP, Moves.FLOATY_FALL, Moves.ROOST, Moves.BOLT_BEAK ], + [Species.GALAR_ZAPDOS]: [ Moves.POISON_JAB, Moves.FLOATY_FALL, Moves.ROOST, Moves.BOLT_BEAK ], [Species.GALAR_MOLTRES]: [ Moves.ROOST, Moves.SLUDGE_BOMB, Moves.FLAMETHROWER, Moves.OBLIVION_WING ], [Species.GALAR_CORSOLA]: [ Moves.SHELL_SMASH, Moves.AURA_SPHERE, Moves.INFERNAL_PARADE, Moves.ASTRAL_BARRAGE ], [Species.GALAR_ZIGZAGOON]: [ Moves.CEASELESS_EDGE, Moves.FACADE, Moves.PARTING_SHOT, Moves.EXTREME_SPEED ], @@ -510,7 +510,7 @@ export const speciesEggMoves = { [Species.SPRIGATITO]: [ Moves.FIRE_LASH, Moves.TRIPLE_AXEL, Moves.SUCKER_PUNCH, Moves.WICKED_BLOW ], [Species.FUECOCO]: [ Moves.ALLURING_VOICE, Moves.SLACK_OFF, Moves.OVERDRIVE, Moves.MOONGEIST_BEAM ], [Species.QUAXLY]: [ Moves.DRAGON_DANCE, Moves.TRIPLE_AXEL, Moves.POWER_TRIP, Moves.THUNDEROUS_KICK ], - [Species.LECHONK]: [ Moves.MILK_DRINK, Moves.PSYSHIELD_BASH, Moves.FILLET_AWAY, Moves.MULTI_ATTACK ], + [Species.LECHONK]: [ Moves.MILK_DRINK, Moves.PSYSHIELD_BASH, Moves.BLAZING_TORQUE, Moves.FILLET_AWAY ], [Species.TAROUNTULA]: [ Moves.STONE_AXE, Moves.LEECH_LIFE, Moves.THIEF, Moves.SPORE ], [Species.NYMBLE]: [ Moves.KNOCK_OFF, Moves.FELL_STINGER, Moves.ATTACK_ORDER, Moves.WICKED_BLOW ], [Species.PAWMI]: [ Moves.DRAIN_PUNCH, Moves.METEOR_MASH, Moves.JET_PUNCH, Moves.PLASMA_FISTS ], @@ -522,13 +522,13 @@ export const speciesEggMoves = { [Species.CHARCADET]: [ Moves.SACRED_SWORD, Moves.PHOTON_GEYSER, Moves.MOONBLAST, Moves.SPECTRAL_THIEF ], [Species.TADBULB]: [ Moves.PARABOLIC_CHARGE, Moves.SCALD, Moves.EARTH_POWER, Moves.ELECTRO_SHOT ], [Species.WATTREL]: [ Moves.NASTY_PLOT, Moves.SPLISHY_SPLASH, Moves.SANDSEAR_STORM, Moves.ELECTRO_SHOT ], - [Species.MASCHIFF]: [ Moves.PARTING_SHOT, Moves.CLOSE_COMBAT, Moves.PSYCHIC_FANGS, Moves.NO_RETREAT ], + [Species.MASCHIFF]: [ Moves.PARTING_SHOT, Moves.COMBAT_TORQUE, Moves.PSYCHIC_FANGS, Moves.NO_RETREAT ], [Species.SHROODLE]: [ Moves.GASTRO_ACID, Moves.PARTING_SHOT, Moves.TOXIC, Moves.SKETCH ], [Species.BRAMBLIN]: [ Moves.TAILWIND, Moves.STRENGTH_SAP, Moves.FLOWER_TRICK, Moves.LAST_RESPECTS ], [Species.TOEDSCOOL]: [ Moves.STRENGTH_SAP, Moves.TOPSY_TURVY, Moves.SAPPY_SEED, Moves.TAIL_GLOW ], [Species.KLAWF]: [ Moves.CRABHAMMER, Moves.SHORE_UP, Moves.MIGHTY_CLEAVE, Moves.SHELL_SMASH ], [Species.CAPSAKID]: [ Moves.STRENGTH_SAP, Moves.APPLE_ACID, Moves.FROST_BREATH, Moves.TORCH_SONG ], - [Species.RELLOR]: [ Moves.HEAL_BLOCK, Moves.RECOVER, Moves.HEAT_WAVE, Moves.LUMINA_CRASH ], + [Species.RELLOR]: [ Moves.HEAL_BLOCK, Moves.RECOVER, Moves.MAGIC_POWDER, Moves.LUMINA_CRASH ], [Species.FLITTLE]: [ Moves.COSMIC_POWER, Moves.AURA_SPHERE, Moves.ROOST, Moves.FIERY_DANCE ], [Species.TINKATINK]: [ Moves.MAGICAL_TORQUE, Moves.PYRO_BALL, Moves.IVY_CUDGEL, Moves.SHIFT_GEAR ], [Species.WIGLETT]: [ Moves.SHELL_SMASH, Moves.ICICLE_CRASH, Moves.SEED_BOMB, Moves.SURGING_STRIKES ], @@ -537,11 +537,11 @@ export const speciesEggMoves = { [Species.VAROOM]: [ Moves.COMBAT_TORQUE, Moves.U_TURN, Moves.BLAZING_TORQUE, Moves.NOXIOUS_TORQUE ], [Species.CYCLIZAR]: [ Moves.PARTING_SHOT, Moves.FIRE_LASH, Moves.MAGICAL_TORQUE, Moves.GLAIVE_RUSH ], [Species.ORTHWORM]: [ Moves.SIZZLY_SLIDE, Moves.COIL, Moves.BODY_PRESS, Moves.SHORE_UP ], - [Species.GLIMMET]: [ Moves.CALM_MIND, Moves.EARTH_POWER, Moves.FIERY_DANCE, Moves.MALIGNANT_CHAIN ], + [Species.GLIMMET]: [ Moves.CALM_MIND, Moves.GIGA_DRAIN, Moves.FIERY_DANCE, Moves.MALIGNANT_CHAIN ], [Species.GREAVARD]: [ Moves.SHADOW_BONE, Moves.YAWN, Moves.SHORE_UP, Moves.COLLISION_COURSE ], [Species.FLAMIGO]: [ Moves.THUNDEROUS_KICK, Moves.TRIPLE_AXEL, Moves.FLOATY_FALL, Moves.VICTORY_DANCE ], - [Species.CETODDLE]: [ Moves.MOUNTAIN_GALE, Moves.HIGH_HORSEPOWER, Moves.SLACK_OFF, Moves.DRAGON_DANCE ], - [Species.VELUZA]: [ Moves.PSYBLADE, Moves.FLIP_TURN, Moves.ICE_SPINNER, Moves.BITTER_BLADE ], + [Species.CETODDLE]: [ Moves.ZING_ZAP, Moves.HIGH_HORSEPOWER, Moves.SLACK_OFF, Moves.DRAGON_DANCE ], + [Species.VELUZA]: [ Moves.PSYBLADE, Moves.LEAF_BLADE, Moves.CEASELESS_EDGE, Moves.BITTER_BLADE ], [Species.DONDOZO]: [ Moves.SOFT_BOILED, Moves.SIZZLY_SLIDE, Moves.BREAKING_SWIPE, Moves.SALT_CURE ], [Species.TATSUGIRI]: [ Moves.SLUDGE_BOMB, Moves.FILLET_AWAY, Moves.CORE_ENFORCER, Moves.STEAM_ERUPTION ], [Species.GREAT_TUSK]: [ Moves.STONE_AXE, Moves.MORNING_SUN, Moves.COLLISION_COURSE, Moves.SHIFT_GEAR ], @@ -551,7 +551,7 @@ export const speciesEggMoves = { [Species.SLITHER_WING]: [ Moves.MIGHTY_CLEAVE, Moves.THUNDEROUS_KICK, Moves.FIRE_LASH, Moves.VICTORY_DANCE ], [Species.SANDY_SHOCKS]: [ Moves.MORNING_SUN, Moves.ICE_BEAM, Moves.NASTY_PLOT, Moves.THUNDERCLAP ], [Species.IRON_TREADS]: [ Moves.FUSION_BOLT, Moves.BULK_UP, Moves.SHORE_UP, Moves.SUNSTEEL_STRIKE ], - [Species.IRON_BUNDLE]: [ Moves.EARTH_POWER, Moves.BOUNCY_BUBBLE, Moves.NASTY_PLOT, Moves.STEAM_ERUPTION ], + [Species.IRON_BUNDLE]: [ Moves.EARTH_POWER, Moves.SPLISHY_SPLASH, Moves.VOLT_SWITCH, Moves.NASTY_PLOT ], [Species.IRON_HANDS]: [ Moves.DRAIN_PUNCH, Moves.BULK_UP, Moves.PLASMA_FISTS, Moves.ICE_HAMMER ], [Species.IRON_JUGULIS]: [ Moves.FIERY_WRATH, Moves.ROOST, Moves.NASTY_PLOT, Moves.OBLIVION_WING ], [Species.IRON_MOTH]: [ Moves.EARTH_POWER, Moves.SEARING_SHOT, Moves.MALIGNANT_CHAIN, Moves.QUIVER_DANCE ], @@ -566,7 +566,7 @@ export const speciesEggMoves = { [Species.IRON_VALIANT]: [ Moves.PLASMA_FISTS, Moves.NO_RETREAT, Moves.SECRET_SWORD, Moves.MAGICAL_TORQUE ], [Species.KORAIDON]: [ Moves.SUNSTEEL_STRIKE, Moves.SOLAR_BLADE, Moves.DRAGON_DARTS, Moves.BITTER_BLADE ], [Species.MIRAIDON]: [ Moves.ICE_BEAM, Moves.CLANGOROUS_SOUL, Moves.CORE_ENFORCER, Moves.RISING_VOLTAGE ], - [Species.WALKING_WAKE]: [ Moves.BOUNCY_BUBBLE, Moves.NASTY_PLOT, Moves.SLUDGE_WAVE, Moves.CORE_ENFORCER ], + [Species.WALKING_WAKE]: [ Moves.BOUNCY_BUBBLE, Moves.FUSION_FLARE, Moves.SLUDGE_WAVE, Moves.CORE_ENFORCER ], [Species.IRON_LEAVES]: [ Moves.BITTER_BLADE, Moves.U_TURN, Moves.MIGHTY_CLEAVE, Moves.VICTORY_DANCE ], [Species.POLTCHAGEIST]: [ Moves.PARABOLIC_CHARGE, Moves.BOUNCY_BUBBLE, Moves.LEECH_SEED, Moves.SPARKLY_SWIRL ], [Species.OKIDOGI]: [ Moves.COMBAT_TORQUE, Moves.TIDY_UP, Moves.DIRE_CLAW, Moves.WICKED_BLOW ], @@ -578,7 +578,7 @@ export const speciesEggMoves = { [Species.IRON_BOULDER]: [ Moves.PSYBLADE, Moves.KOWTOW_CLEAVE, Moves.STONE_AXE, Moves.BITTER_BLADE ], [Species.IRON_CROWN]: [ Moves.NASTY_PLOT, Moves.SECRET_SWORD, Moves.PSYSTRIKE, Moves.ELECTRO_DRIFT ], [Species.TERAPAGOS]: [ Moves.MOONBLAST, Moves.RECOVER, Moves.ICE_BEAM, Moves.SHELL_SMASH ], - [Species.PECHARUNT]: [ Moves.TAKE_HEART, Moves.BODY_PRESS, Moves.SAPPY_SEED, Moves.KINGS_SHIELD ], + [Species.PECHARUNT]: [ Moves.TAKE_HEART, Moves.BODY_PRESS, Moves.SAPPY_SEED, Moves.ASTRAL_BARRAGE ], [Species.PALDEA_TAUROS]: [ Moves.NO_RETREAT, Moves.BLAZING_TORQUE, Moves.AQUA_STEP, Moves.THUNDEROUS_KICK ], [Species.PALDEA_WOOPER]: [ Moves.STONE_AXE, Moves.RECOVER, Moves.BANEFUL_BUNKER, Moves.BARB_BARRAGE ], [Species.BLOODMOON_URSALUNA]: [ Moves.NASTY_PLOT, Moves.ROCK_POLISH, Moves.SANDSEAR_STORM, Moves.BOOMBURST ] diff --git a/src/data/balance/passives.ts b/src/data/balance/passives.ts index 3b30a629a4b..df347909d49 100644 --- a/src/data/balance/passives.ts +++ b/src/data/balance/passives.ts @@ -12,7 +12,7 @@ interface StarterPassiveAbilities { export const starterPassiveAbilities: StarterPassiveAbilities = { [Species.BULBASAUR]: { 0: Abilities.GRASSY_SURGE }, [Species.CHARMANDER]: { 0: Abilities.BEAST_BOOST }, - [Species.SQUIRTLE]: { 0: Abilities.STURDY }, + [Species.SQUIRTLE]: { 0: Abilities.DAUNTLESS_SHIELD }, [Species.CATERPIE]: { 0: Abilities.MAGICIAN }, [Species.WEEDLE]: { 0: Abilities.TINTED_LENS }, [Species.PIDGEY]: { 0: Abilities.SHEER_FORCE }, @@ -57,7 +57,7 @@ export const starterPassiveAbilities: StarterPassiveAbilities = { [Species.KOFFING]: { 0: Abilities.PARENTAL_BOND }, [Species.RHYHORN]: { 0: Abilities.FILTER }, [Species.TANGELA]: { 0: Abilities.SEED_SOWER }, - [Species.KANGASKHAN]: { 0: Abilities.GUTS }, + [Species.KANGASKHAN]: { 0: Abilities.TECHNICIAN }, [Species.HORSEA]: { 0: Abilities.DRAGONS_MAW }, [Species.GOLDEEN]: { 0: Abilities.MULTISCALE }, [Species.STARYU]: { 0: Abilities.REGENERATOR }, @@ -129,7 +129,7 @@ export const starterPassiveAbilities: StarterPassiveAbilities = { [Species.RAIKOU]: { 0: Abilities.BEAST_BOOST }, [Species.ENTEI]: { 0: Abilities.BEAST_BOOST }, [Species.SUICUNE]: { 0: Abilities.BEAST_BOOST }, - [Species.LARVITAR]: { 0: Abilities.SAND_RUSH }, + [Species.LARVITAR]: { 0: Abilities.SOLID_ROCK }, [Species.LUGIA]: { 0: Abilities.DELTA_STREAM }, [Species.HO_OH]: { 0: Abilities.MAGIC_GUARD }, [Species.CELEBI]: { 0: Abilities.PSYCHIC_SURGE }, @@ -246,11 +246,11 @@ export const starterPassiveAbilities: StarterPassiveAbilities = { [Species.MANTYKE]: { 0: Abilities.UNAWARE }, [Species.SNOVER]: { 0: Abilities.GRASSY_SURGE }, [Species.ROTOM]: { 0: Abilities.HADRON_ENGINE }, - [Species.UXIE]: { 0: Abilities.UNAWARE }, + [Species.UXIE]: { 0: Abilities.UNNERVE }, [Species.MESPRIT]: { 0: Abilities.MOODY }, [Species.AZELF]: { 0: Abilities.NEUROFORCE }, - [Species.DIALGA]: { 0: Abilities.LEVITATE }, - [Species.PALKIA]: { 0: Abilities.SPEED_BOOST }, + [Species.DIALGA]: { 0: Abilities.BERSERK }, + [Species.PALKIA]: { 0: Abilities.BERSERK }, [Species.HEATRAN]: { 0: Abilities.EARTH_EATER }, [Species.REGIGIGAS]: { 0: Abilities.SCRAPPY }, [Species.GIRATINA]: { 0: Abilities.SHADOW_SHIELD }, @@ -285,7 +285,7 @@ export const starterPassiveAbilities: StarterPassiveAbilities = { [Species.SEWADDLE]: { 0: Abilities.SHARPNESS }, [Species.VENIPEDE]: { 0: Abilities.STAMINA }, [Species.COTTONEE]: { 0: Abilities.FLUFFY }, - [Species.PETILIL]: { 0: Abilities.SIMPLE }, + [Species.PETILIL]: { 0: Abilities.FLOWER_VEIL }, [Species.BASCULIN]: { 0: Abilities.SUPREME_OVERLORD }, [Species.SANDILE]: { 0: Abilities.TOUGH_CLAWS }, [Species.DARUMAKA]: { 0: Abilities.GORILLA_TACTICS }, @@ -347,7 +347,7 @@ export const starterPassiveAbilities: StarterPassiveAbilities = { [Species.CHESPIN]: { 0: Abilities.DAUNTLESS_SHIELD }, [Species.FENNEKIN]: { 0: Abilities.PSYCHIC_SURGE }, [Species.FROAKIE]: { 0: Abilities.STAKEOUT }, - [Species.BUNNELBY]: { 0: Abilities.GUTS }, + [Species.BUNNELBY]: { 0: Abilities.THICK_FAT }, [Species.FLETCHLING]: { 0: Abilities.MAGIC_GUARD }, [Species.SCATTERBUG]: { 0: Abilities.PRANKSTER }, [Species.LITLEO]: { 0: Abilities.BEAST_BOOST }, @@ -380,7 +380,7 @@ export const starterPassiveAbilities: StarterPassiveAbilities = { [Species.ZYGARDE]: { 0: Abilities.ADAPTABILITY }, [Species.DIANCIE]: { 0: Abilities.PRISM_ARMOR }, [Species.HOOPA]: { 0: Abilities.OPPORTUNIST }, - [Species.VOLCANION]: { 0: Abilities.FILTER }, + [Species.VOLCANION]: { 0: Abilities.NEUTRALIZING_GAS }, [Species.ETERNAL_FLOETTE]: { 0: Abilities.MAGIC_GUARD }, [Species.ROWLET]: { 0: Abilities.SNIPER }, @@ -395,7 +395,7 @@ export const starterPassiveAbilities: StarterPassiveAbilities = { [Species.ROCKRUFF]: { 0: Abilities.ROCKY_PAYLOAD }, [Species.WISHIWASHI]: { 0: Abilities.REGENERATOR }, [Species.MAREANIE]: { 0: Abilities.TOXIC_DEBRIS }, - [Species.MUDBRAY]: { 0: Abilities.CUD_CHEW }, + [Species.MUDBRAY]: { 0: Abilities.SAP_SIPPER }, [Species.DEWPIDER]: { 0: Abilities.TINTED_LENS }, [Species.FOMANTIS]: { 0: Abilities.SHARPNESS }, [Species.MORELULL]: { 0: Abilities.TRIAGE }, @@ -419,8 +419,8 @@ export const starterPassiveAbilities: StarterPassiveAbilities = { [Species.DHELMISE]: { 0: Abilities.WATER_BUBBLE }, [Species.JANGMO_O]: { 0: Abilities.DAUNTLESS_SHIELD }, [Species.TAPU_KOKO]: { 0: Abilities.DAUNTLESS_SHIELD }, - [Species.TAPU_LELE]: { 0: Abilities.SHEER_FORCE }, - [Species.TAPU_BULU]: { 0: Abilities.TRIAGE }, + [Species.TAPU_LELE]: { 0: Abilities.BERSERK }, + [Species.TAPU_BULU]: { 0: Abilities.FLOWER_VEIL }, [Species.TAPU_FINI]: { 0: Abilities.FAIRY_AURA }, [Species.COSMOG]: { 0: Abilities.BEAST_BOOST }, [Species.NIHILEGO]: { 0: Abilities.LEVITATE }, @@ -542,7 +542,7 @@ export const starterPassiveAbilities: StarterPassiveAbilities = { [Species.VAROOM]: { 0: Abilities.LEVITATE }, [Species.CYCLIZAR]: { 0: Abilities.PROTEAN }, [Species.ORTHWORM]: { 0: Abilities.REGENERATOR }, - [Species.GLIMMET]: { 0: Abilities.LEVITATE }, + [Species.GLIMMET]: { 0: Abilities.TERA_SHELL }, [Species.GREAVARD]: { 0: Abilities.UNAWARE }, [Species.FLAMIGO]: { 0: Abilities.MOXIE }, [Species.CETODDLE]: { 0: Abilities.REFRIGERATE }, diff --git a/src/data/balance/pokemon-evolutions.ts b/src/data/balance/pokemon-evolutions.ts index 9cc693dc33c..0e101c7155b 100644 --- a/src/data/balance/pokemon-evolutions.ts +++ b/src/data/balance/pokemon-evolutions.ts @@ -92,6 +92,7 @@ export class SpeciesFormEvolution { public item: EvolutionItem | null; public condition: SpeciesEvolutionCondition | null; public wildDelay: SpeciesWildEvolutionDelay; + public description: string = ""; constructor(speciesId: Species, preFormKey: string | null, evoFormKey: string | null, level: number, item: EvolutionItem | null, condition: SpeciesEvolutionCondition | null, wildDelay?: SpeciesWildEvolutionDelay) { this.speciesId = speciesId; @@ -101,6 +102,23 @@ export class SpeciesFormEvolution { this.item = item || EvolutionItem.NONE; this.condition = condition; this.wildDelay = wildDelay ?? SpeciesWildEvolutionDelay.NONE; + + const strings: string[] = []; + if (this.level > 1) { + strings.push(i18next.t("pokemonEvolutions:level") + ` ${this.level}`); + } + if (this.item) { + const itemDescription = i18next.t(`modifierType:EvolutionItem.${EvolutionItem[this.item].toUpperCase()}`); + const rarity = this.item > 50 ? i18next.t("pokemonEvolutions:ULTRA") : i18next.t("pokemonEvolutions:GREAT"); + strings.push(i18next.t("pokemonEvolutions:using") + itemDescription + ` (${rarity})`); + } + if (this.condition) { + strings.push(this.condition.description); + } + this.description = strings + .filter(str => str !== "") + .map((str, index) => index > 0 ? str[0].toLowerCase() + str.slice(1) : str) + .join(i18next.t("pokemonEvolutions:connector")); } } @@ -237,6 +255,7 @@ class WeatherEvolutionCondition extends SpeciesEvolutionCondition { constructor(weatherTypes: WeatherType[]) { super(() => weatherTypes.indexOf(globalScene.arena.weather?.weatherType || WeatherType.NONE) > -1); this.weatherTypes = weatherTypes; + this.description = i18next.t("pokemonEvolutions:weather"); } } @@ -1377,7 +1396,7 @@ export const pokemonEvolutions: PokemonEvolutions = { ], [Species.TANDEMAUS]: [ new SpeciesFormEvolution(Species.MAUSHOLD, "", "three", 25, null, new TandemausEvolutionCondition()), - new SpeciesEvolution(Species.MAUSHOLD, 25, null, null) + new SpeciesFormEvolution(Species.MAUSHOLD, "", "four", 25, null, null) ], [Species.FIDOUGH]: [ new SpeciesEvolution(Species.DACHSBUN, 26, null, null) @@ -1540,7 +1559,7 @@ export const pokemonEvolutions: PokemonEvolutions = { ], [Species.DUNSPARCE]: [ new SpeciesFormEvolution(Species.DUDUNSPARCE, "", "three-segment", 32, null, new DunsparceEvolutionCondition(), SpeciesWildEvolutionDelay.LONG), - new SpeciesEvolution(Species.DUDUNSPARCE, 32, null, new MoveEvolutionCondition(Moves.HYPER_DRILL), SpeciesWildEvolutionDelay.LONG) + new SpeciesFormEvolution(Species.DUDUNSPARCE, "", "two-segment", 32, null, new MoveEvolutionCondition(Moves.HYPER_DRILL), SpeciesWildEvolutionDelay.LONG) ], [Species.GLIGAR]: [ new SpeciesEvolution(Species.GLISCOR, 1, EvolutionItem.RAZOR_FANG, new TimeOfDayEvolutionCondition("night") /* Razor fang at night*/, SpeciesWildEvolutionDelay.VERY_LONG) diff --git a/src/data/balance/starters.ts b/src/data/balance/starters.ts index ee33142e981..dcf0766d005 100644 --- a/src/data/balance/starters.ts +++ b/src/data/balance/starters.ts @@ -128,7 +128,7 @@ export const speciesStarterCosts = { [Species.YANMA]: 3, [Species.WOOPER]: 2, [Species.MURKROW]: 3, - [Species.MISDREAVUS]: 2, + [Species.MISDREAVUS]: 3, [Species.UNOWN]: 1, [Species.GIRAFARIG]: 3, [Species.PINECO]: 2, @@ -245,7 +245,7 @@ export const speciesStarterCosts = { [Species.KRICKETOT]: 1, [Species.SHINX]: 2, [Species.BUDEW]: 3, - [Species.CRANIDOS]: 3, + [Species.CRANIDOS]: 2, [Species.SHIELDON]: 3, [Species.BURMY]: 2, [Species.COMBEE]: 2, @@ -274,7 +274,7 @@ export const speciesStarterCosts = { [Species.FINNEON]: 1, [Species.MANTYKE]: 2, [Species.SNOVER]: 2, - [Species.ROTOM]: 5, + [Species.ROTOM]: 4, [Species.UXIE]: 5, [Species.MESPRIT]: 5, [Species.AZELF]: 6, @@ -287,7 +287,7 @@ export const speciesStarterCosts = { [Species.PHIONE]: 4, [Species.MANAPHY]: 7, [Species.DARKRAI]: 7, - [Species.SHAYMIN]: 5, + [Species.SHAYMIN]: 6, [Species.ARCEUS]: 9, [Species.VICTINI]: 7, diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 17dc34aa514..91ab10aecfa 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -1752,7 +1752,7 @@ export class HighestStatBoostTag extends AbilityBattlerTag { super.onAdd(pokemon); let highestStat: EffectiveStat; - EFFECTIVE_STATS.map(s => pokemon.getEffectiveStat(s)).reduce((highestValue: number, value: number, i: number) => { + EFFECTIVE_STATS.map(s => pokemon.getEffectiveStat(s, undefined, undefined, undefined, undefined, undefined, undefined, true)).reduce((highestValue: number, value: number, i: number) => { if (value > highestValue) { highestStat = EFFECTIVE_STATS[i]; return value; @@ -1763,15 +1763,7 @@ export class HighestStatBoostTag extends AbilityBattlerTag { highestStat = highestStat!; // tell TS compiler it's defined! this.stat = highestStat; - switch (this.stat) { - case Stat.SPD: - this.multiplier = 1.5; - break; - default: - this.multiplier = 1.3; - break; - } - + this.multiplier = this.stat === Stat.SPD ? 1.5 : 1.3; globalScene.queueMessage(i18next.t("battlerTags:highestStatBoostOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), statName: i18next.t(getStatKey(highestStat)) }), null, false, null, true); } @@ -2871,7 +2863,7 @@ export class SyrupBombTag extends BattlerTag { /** * Telekinesis raises the target into the air for three turns and causes all moves used against the target (aside from OHKO moves) to hit the target unless the target is in a semi-invulnerable state from Fly/Dig. * The first effect is provided by {@linkcode FloatingTag}, the accuracy-bypass effect is provided by TelekinesisTag - * The effects of Telekinesis can be baton passed to a teammate. Unlike the mainline games, Telekinesis can be baton-passed to Mega Gengar. + * The effects of Telekinesis can be baton passed to a teammate. * @see {@link https://bulbapedia.bulbagarden.net/wiki/Telekinesis_(move) | Moves.TELEKINESIS} */ export class TelekinesisTag extends BattlerTag { @@ -2983,6 +2975,24 @@ export class PsychoShiftTag extends BattlerTag { } } +/** + * Tag associated with the move Magic Coat. + */ +export class MagicCoatTag extends BattlerTag { + constructor() { + super(BattlerTagType.MAGIC_COAT, BattlerTagLapseType.TURN_END, 1, Moves.MAGIC_COAT); + } + + /** + * Queues the "[PokemonName] shrouded itself with Magic Coat" message when the tag is added. + * @param pokemon - The target {@linkcode Pokemon} + */ + override onAdd(pokemon: Pokemon) { + // "{pokemonNameWithAffix} shrouded itself with Magic Coat!" + globalScene.queueMessage(i18next.t("battlerTags:magicCoatOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + } +} + /** * Retrieves a {@linkcode BattlerTag} based on the provided tag type, turn count, source move, and source ID. * @param sourceId - The ID of the pokemon adding the tag @@ -3172,6 +3182,8 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source return new GrudgeTag(); case BattlerTagType.PSYCHO_SHIFT: return new PsychoShiftTag(); + case BattlerTagType.MAGIC_COAT: + return new MagicCoatTag(); case BattlerTagType.NONE: default: return new BattlerTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId); diff --git a/src/data/move.ts b/src/data/move.ts index 5bc37b4e8e8..cc22f582790 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -125,7 +125,9 @@ export enum MoveFlags { /** Indicates a move is able to bypass its target's Substitute (if the target has one) */ IGNORE_SUBSTITUTE = 1 << 17, /** Indicates a move is able to be redirected to allies in a double battle if the attacker faints */ - REDIRECT_COUNTER = 1 << 18, + REDIRECT_COUNTER = 1 << 18, + /** Indicates a move is able to be reflected by {@linkcode Abilities.MAGIC_BOUNCE} and {@linkcode Moves.MAGIC_COAT} */ + REFLECTABLE = 1 << 19, } type MoveConditionFunc = (user: Pokemon, target: Pokemon, move: Move) => boolean; @@ -610,6 +612,16 @@ export default class Move implements Localizable { return this; } + /** + * Sets the {@linkcode MoveFlags.REFLECTABLE} flag for the calling Move + * @see {@linkcode Moves.ATTRACT} + * @returns The {@linkcode Move} that called this function + */ + reflectable(): this { + this.setFlag(MoveFlags.REFLECTABLE, true); + return this; + } + /** * Checks if the move flag applies to the pokemon(s) using/receiving the move * @param flag {@linkcode MoveFlags} MoveFlag to check on user and/or target @@ -4368,6 +4380,69 @@ export class CueNextRoundAttr extends MoveEffectAttr { } } +/** + * Attribute that changes stat stages before the damage is calculated + */ +export class StatChangeBeforeDmgCalcAttr extends MoveAttr { + /** + * Applies Stat Changes before damage is calculated + * + * @param user {@linkcode Pokemon} that called {@linkcode move} + * @param target {@linkcode Pokemon} that is the target of {@linkcode move} + * @param move {@linkcode Move} called by {@linkcode user} + * @param args N/A + * + * @returns true if stat stages where correctly applied + */ + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + return false; + } +} + +/** + * Steals the postitive Stat stages of the target before damage calculation so stat changes + * apply to damage calculation (e.g. {@linkcode Moves.SPECTRAL_THIEF}) + * {@link https://bulbapedia.bulbagarden.net/wiki/Spectral_Thief_(move) | Spectral Thief} + */ +export class SpectralThiefAttr extends StatChangeBeforeDmgCalcAttr { + /** + * steals max amount of positive stats of the target while not exceeding the limit of max 6 stat stages + * + * @param user {@linkcode Pokemon} that called {@linkcode move} + * @param target {@linkcode Pokemon} that is the target of {@linkcode move} + * @param move {@linkcode Move} called by {@linkcode user} + * @param args N/A + * + * @returns true if stat stages where correctly stolen + */ + apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + /** + * Copy all positive stat stages to user and reduce copied stat stages on target. + */ + for (const s of BATTLE_STATS) { + const statStageValueTarget = target.getStatStage(s); + const statStageValueUser = user.getStatStage(s); + + if (statStageValueTarget > 0) { + /** + * Only value of up to 6 can be stolen (stat stages don't exceed 6) + */ + const availableToSteal = Math.min(statStageValueTarget, 6 - statStageValueUser); + + globalScene.unshiftPhase(new StatStageChangePhase(user.getBattlerIndex(), this.selfTarget, [ s ], availableToSteal)); + target.setStatStage(s, statStageValueTarget - availableToSteal); + } + } + + target.updateInfo(); + user.updateInfo(); + globalScene.queueMessage(i18next.t("moveTriggers:stealPositiveStats", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target) })); + + return true; + } + +} + export class VariableAtkAttr extends MoveAttr { constructor() { super(); @@ -4559,7 +4634,8 @@ export class TeraMoveCategoryAttr extends VariableMoveCategoryAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const category = (args[0] as Utils.NumberHolder); - if (user.isTerastallized() && user.getEffectiveStat(Stat.ATK, target, move) > user.getEffectiveStat(Stat.SPATK, target, move)) { + if (user.isTerastallized() && user.getEffectiveStat(Stat.ATK, target, move, true, true, false, false, true) > + user.getEffectiveStat(Stat.SPATK, target, move, true, true, false, false, true)) { category.value = MoveCategory.PHYSICAL; return true; } @@ -5331,6 +5407,7 @@ export class AddBattlerTagAttr extends MoveEffectAttr { case BattlerTagType.INGRAIN: case BattlerTagType.IGNORE_ACCURACY: case BattlerTagType.AQUA_RING: + case BattlerTagType.MAGIC_COAT: return 3; case BattlerTagType.PROTECTED: case BattlerTagType.FLYING: @@ -8333,7 +8410,8 @@ export function initMoves() { .attr(ForceSwitchOutAttr, false, SwitchType.FORCE_SWITCH) .ignoresSubstitute() .hidesTarget() - .windMove(), + .windMove() + .reflectable(), new ChargingAttackMove(Moves.FLY, Type.FLYING, MoveCategory.PHYSICAL, 90, 95, 15, -1, 0, 1) .chargeText(i18next.t("moveTriggers:flewUpHigh", { pokemonName: "{USER}" })) .chargeAttr(SemiInvulnerableAttr, BattlerTagType.FLYING) @@ -8357,7 +8435,8 @@ export function initMoves() { new AttackMove(Moves.ROLLING_KICK, Type.FIGHTING, MoveCategory.PHYSICAL, 60, 85, 15, 30, 0, 1) .attr(FlinchAttr), new StatusMove(Moves.SAND_ATTACK, Type.GROUND, 100, 15, -1, 0, 1) - .attr(StatStageChangeAttr, [ Stat.ACC ], -1), + .attr(StatStageChangeAttr, [ Stat.ACC ], -1) + .reflectable(), new AttackMove(Moves.HEADBUTT, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 15, 30, 0, 1) .attr(FlinchAttr), new AttackMove(Moves.HORN_ATTACK, Type.NORMAL, MoveCategory.PHYSICAL, 65, 100, 25, -1, 0, 1), @@ -8386,7 +8465,8 @@ export function initMoves() { .recklessMove(), new StatusMove(Moves.TAIL_WHIP, Type.NORMAL, 100, 30, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.DEF ], -1) - .target(MoveTarget.ALL_NEAR_ENEMIES), + .target(MoveTarget.ALL_NEAR_ENEMIES) + .reflectable(), new AttackMove(Moves.POISON_STING, Type.POISON, MoveCategory.PHYSICAL, 15, 100, 35, 30, 0, 1) .attr(StatusEffectAttr, StatusEffect.POISON) .makesContact(false), @@ -8399,30 +8479,36 @@ export function initMoves() { .makesContact(false), new StatusMove(Moves.LEER, Type.NORMAL, 100, 30, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.DEF ], -1) - .target(MoveTarget.ALL_NEAR_ENEMIES), + .target(MoveTarget.ALL_NEAR_ENEMIES) + .reflectable(), new AttackMove(Moves.BITE, Type.DARK, MoveCategory.PHYSICAL, 60, 100, 25, 30, 0, 1) .attr(FlinchAttr) .bitingMove(), new StatusMove(Moves.GROWL, Type.NORMAL, 100, 40, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.ATK ], -1) .soundBased() - .target(MoveTarget.ALL_NEAR_ENEMIES), + .target(MoveTarget.ALL_NEAR_ENEMIES) + .reflectable(), new StatusMove(Moves.ROAR, Type.NORMAL, -1, 20, -1, -6, 1) .attr(ForceSwitchOutAttr, false, SwitchType.FORCE_SWITCH) .soundBased() - .hidesTarget(), + .hidesTarget() + .reflectable(), new StatusMove(Moves.SING, Type.NORMAL, 55, 15, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.SLEEP) - .soundBased(), + .soundBased() + .reflectable(), new StatusMove(Moves.SUPERSONIC, Type.NORMAL, 55, 20, -1, 0, 1) .attr(ConfuseAttr) - .soundBased(), + .soundBased() + .reflectable(), new AttackMove(Moves.SONIC_BOOM, Type.NORMAL, MoveCategory.SPECIAL, -1, 90, 20, -1, 0, 1) .attr(FixedDamageAttr, 20), new StatusMove(Moves.DISABLE, Type.NORMAL, 100, 20, -1, 0, 1) .attr(AddBattlerTagAttr, BattlerTagType.DISABLED, false, true) .condition((user, target, move) => target.getMoveHistory().reverse().find(m => m.move !== Moves.NONE && m.move !== Moves.STRUGGLE && !m.virtual) !== undefined) - .ignoresSubstitute(), + .ignoresSubstitute() + .reflectable(), new AttackMove(Moves.ACID, Type.POISON, MoveCategory.SPECIAL, 40, 100, 30, 10, 0, 1) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -1) .target(MoveTarget.ALL_NEAR_ENEMIES), @@ -8475,7 +8561,8 @@ export function initMoves() { .triageMove(), new StatusMove(Moves.LEECH_SEED, Type.GRASS, 90, 10, -1, 0, 1) .attr(LeechSeedAttr) - .condition((user, target, move) => !target.getTag(BattlerTagType.SEEDED) && !target.isOfType(Type.GRASS)), + .condition((user, target, move) => !target.getTag(BattlerTagType.SEEDED) && !target.isOfType(Type.GRASS)) + .reflectable(), new SelfStatusMove(Moves.GROWTH, Type.NORMAL, -1, 20, -1, 0, 1) .attr(GrowthStatStageChangeAttr), new AttackMove(Moves.RAZOR_LEAF, Type.GRASS, MoveCategory.PHYSICAL, 55, 95, 25, -1, 0, 1) @@ -8489,13 +8576,16 @@ export function initMoves() { .attr(AntiSunlightPowerDecreaseAttr), new StatusMove(Moves.POISON_POWDER, Type.POISON, 75, 35, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.POISON) - .powderMove(), + .powderMove() + .reflectable(), new StatusMove(Moves.STUN_SPORE, Type.GRASS, 75, 30, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) - .powderMove(), + .powderMove() + .reflectable(), new StatusMove(Moves.SLEEP_POWDER, Type.GRASS, 75, 15, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.SLEEP) - .powderMove(), + .powderMove() + .reflectable(), new AttackMove(Moves.PETAL_DANCE, Type.GRASS, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 1) .attr(FrenzyAttr) .attr(MissEffectAttr, frenzyMissFunc) @@ -8505,7 +8595,8 @@ export function initMoves() { .target(MoveTarget.RANDOM_NEAR_ENEMY), new StatusMove(Moves.STRING_SHOT, Type.BUG, 95, 40, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.SPD ], -2) - .target(MoveTarget.ALL_NEAR_ENEMIES), + .target(MoveTarget.ALL_NEAR_ENEMIES) + .reflectable(), new AttackMove(Moves.DRAGON_RAGE, Type.DRAGON, MoveCategory.SPECIAL, -1, 100, 10, -1, 0, 1) .attr(FixedDamageAttr, 40), new AttackMove(Moves.FIRE_SPIN, Type.FIRE, MoveCategory.SPECIAL, 35, 85, 15, -1, 0, 1) @@ -8516,7 +8607,8 @@ export function initMoves() { .attr(StatusEffectAttr, StatusEffect.PARALYSIS), new StatusMove(Moves.THUNDER_WAVE, Type.ELECTRIC, 90, 20, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) - .attr(RespectAttackTypeImmunityAttr), + .attr(RespectAttackTypeImmunityAttr) + .reflectable(), new AttackMove(Moves.THUNDER, Type.ELECTRIC, MoveCategory.SPECIAL, 110, 70, 10, 30, 0, 1) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .attr(ThunderAccuracyAttr) @@ -8538,13 +8630,15 @@ export function initMoves() { .chargeAttr(SemiInvulnerableAttr, BattlerTagType.UNDERGROUND), new StatusMove(Moves.TOXIC, Type.POISON, 90, 10, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.TOXIC) - .attr(ToxicAccuracyAttr), + .attr(ToxicAccuracyAttr) + .reflectable(), new AttackMove(Moves.CONFUSION, Type.PSYCHIC, MoveCategory.SPECIAL, 50, 100, 25, 10, 0, 1) .attr(ConfuseAttr), new AttackMove(Moves.PSYCHIC, Type.PSYCHIC, MoveCategory.SPECIAL, 90, 100, 10, 10, 0, 1) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -1), new StatusMove(Moves.HYPNOSIS, Type.PSYCHIC, 60, 20, -1, 0, 1) - .attr(StatusEffectAttr, StatusEffect.SLEEP), + .attr(StatusEffectAttr, StatusEffect.SLEEP) + .reflectable(), new SelfStatusMove(Moves.MEDITATE, Type.PSYCHIC, -1, 40, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.ATK ], 1, true), new SelfStatusMove(Moves.AGILITY, Type.PSYCHIC, -1, 30, -1, 0, 1) @@ -8562,7 +8656,8 @@ export function initMoves() { .ignoresSubstitute(), new StatusMove(Moves.SCREECH, Type.NORMAL, 85, 40, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.DEF ], -2) - .soundBased(), + .soundBased() + .reflectable(), new SelfStatusMove(Moves.DOUBLE_TEAM, Type.NORMAL, -1, 15, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.EVA ], 1, true), new SelfStatusMove(Moves.RECOVER, Type.NORMAL, -1, 5, -1, 0, 1) @@ -8574,9 +8669,11 @@ export function initMoves() { .attr(AddBattlerTagAttr, BattlerTagType.MINIMIZED, true, false) .attr(StatStageChangeAttr, [ Stat.EVA ], 2, true), new StatusMove(Moves.SMOKESCREEN, Type.NORMAL, 100, 20, -1, 0, 1) - .attr(StatStageChangeAttr, [ Stat.ACC ], -1), + .attr(StatStageChangeAttr, [ Stat.ACC ], -1) + .reflectable(), new StatusMove(Moves.CONFUSE_RAY, Type.GHOST, 100, 10, -1, 0, 1) - .attr(ConfuseAttr), + .attr(ConfuseAttr) + .reflectable(), new SelfStatusMove(Moves.WITHDRAW, Type.WATER, -1, 40, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.DEF ], 1, true), new SelfStatusMove(Moves.DEFENSE_CURL, Type.NORMAL, -1, 40, -1, 0, 1) @@ -8637,7 +8734,8 @@ export function initMoves() { new SelfStatusMove(Moves.AMNESIA, Type.PSYCHIC, -1, 20, -1, 0, 1) .attr(StatStageChangeAttr, [ Stat.SPDEF ], 2, true), new StatusMove(Moves.KINESIS, Type.PSYCHIC, 80, 15, -1, 0, 1) - .attr(StatStageChangeAttr, [ Stat.ACC ], -1), + .attr(StatStageChangeAttr, [ Stat.ACC ], -1) + .reflectable(), new SelfStatusMove(Moves.SOFT_BOILED, Type.NORMAL, -1, 5, -1, 0, 1) .attr(HealAttr, 0.5) .triageMove(), @@ -8647,14 +8745,16 @@ export function initMoves() { .condition(failOnGravityCondition) .recklessMove(), new StatusMove(Moves.GLARE, Type.NORMAL, 100, 30, -1, 0, 1) - .attr(StatusEffectAttr, StatusEffect.PARALYSIS), + .attr(StatusEffectAttr, StatusEffect.PARALYSIS) + .reflectable(), new AttackMove(Moves.DREAM_EATER, Type.PSYCHIC, MoveCategory.SPECIAL, 100, 100, 15, -1, 0, 1) .attr(HitHealAttr) .condition(targetSleptOrComatoseCondition) .triageMove(), new StatusMove(Moves.POISON_GAS, Type.POISON, 90, 40, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.POISON) - .target(MoveTarget.ALL_NEAR_ENEMIES), + .target(MoveTarget.ALL_NEAR_ENEMIES) + .reflectable(), new AttackMove(Moves.BARRAGE, Type.NORMAL, MoveCategory.PHYSICAL, 15, 85, 20, -1, 0, 1) .attr(MultiHitAttr) .makesContact(false) @@ -8663,7 +8763,8 @@ export function initMoves() { .attr(HitHealAttr) .triageMove(), new StatusMove(Moves.LOVELY_KISS, Type.NORMAL, 75, 10, -1, 0, 1) - .attr(StatusEffectAttr, StatusEffect.SLEEP), + .attr(StatusEffectAttr, StatusEffect.SLEEP) + .reflectable(), new ChargingAttackMove(Moves.SKY_ATTACK, Type.FLYING, MoveCategory.PHYSICAL, 140, 90, 5, 30, 0, 1) .chargeText(i18next.t("moveTriggers:isGlowing", { pokemonName: "{USER}" })) .attr(HighCritAttr) @@ -8682,9 +8783,11 @@ export function initMoves() { .punchingMove(), new StatusMove(Moves.SPORE, Type.GRASS, 100, 15, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.SLEEP) - .powderMove(), + .powderMove() + .reflectable(), new StatusMove(Moves.FLASH, Type.NORMAL, 100, 20, -1, 0, 1) - .attr(StatStageChangeAttr, [ Stat.ACC ], -1), + .attr(StatStageChangeAttr, [ Stat.ACC ], -1) + .reflectable(), new AttackMove(Moves.PSYWAVE, Type.PSYCHIC, MoveCategory.SPECIAL, -1, 100, 15, -1, 0, 1) .attr(RandomLevelDamageAttr), new SelfStatusMove(Moves.SPLASH, Type.NORMAL, -1, 40, -1, 0, 1) @@ -8743,7 +8846,8 @@ export function initMoves() { .attr(StealHeldItemChanceAttr, 0.3), new StatusMove(Moves.SPIDER_WEB, Type.BUG, -1, 10, -1, 0, 2) .condition(failIfGhostTypeCondition) - .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, true, 1), + .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, true, 1) + .reflectable(), new StatusMove(Moves.MIND_READER, Type.NORMAL, -1, 5, -1, 0, 2) .attr(IgnoreAccuracyAttr), new StatusMove(Moves.NIGHTMARE, Type.GHOST, 100, 15, -1, 0, 2) @@ -8774,12 +8878,14 @@ export function initMoves() { new StatusMove(Moves.COTTON_SPORE, Type.GRASS, 100, 40, -1, 0, 2) .attr(StatStageChangeAttr, [ Stat.SPD ], -2) .powderMove() - .target(MoveTarget.ALL_NEAR_ENEMIES), + .target(MoveTarget.ALL_NEAR_ENEMIES) + .reflectable(), new AttackMove(Moves.REVERSAL, Type.FIGHTING, MoveCategory.PHYSICAL, -1, 100, 15, -1, 0, 2) .attr(LowHpPowerAttr), new StatusMove(Moves.SPITE, Type.GHOST, 100, 10, -1, 0, 2) .ignoresSubstitute() - .attr(ReducePpMoveAttr, 4), + .attr(ReducePpMoveAttr, 4) + .reflectable(), new AttackMove(Moves.POWDER_SNOW, Type.ICE, MoveCategory.SPECIAL, 40, 100, 25, 10, 0, 2) .attr(StatusEffectAttr, StatusEffect.FREEZE) .target(MoveTarget.ALL_NEAR_ENEMIES), @@ -8789,10 +8895,12 @@ export function initMoves() { new AttackMove(Moves.MACH_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 40, 100, 30, -1, 1, 2) .punchingMove(), new StatusMove(Moves.SCARY_FACE, Type.NORMAL, 100, 10, -1, 0, 2) - .attr(StatStageChangeAttr, [ Stat.SPD ], -2), + .attr(StatStageChangeAttr, [ Stat.SPD ], -2) + .reflectable(), new AttackMove(Moves.FEINT_ATTACK, Type.DARK, MoveCategory.PHYSICAL, 60, -1, 20, -1, 0, 2), new StatusMove(Moves.SWEET_KISS, Type.FAIRY, 75, 10, -1, 0, 2) - .attr(ConfuseAttr), + .attr(ConfuseAttr) + .reflectable(), new SelfStatusMove(Moves.BELLY_DRUM, Type.NORMAL, -1, 10, -1, 0, 2) .attr(CutHpStatStageBoostAttr, [ Stat.ATK ], 12, 2, (user) => { globalScene.queueMessage(i18next.t("moveTriggers:cutOwnHpAndMaximizedStat", { pokemonName: getPokemonNameWithAffix(user), statName: i18next.t(getStatKey(Stat.ATK)) })); @@ -8807,13 +8915,15 @@ export function initMoves() { .ballBombMove(), new StatusMove(Moves.SPIKES, Type.GROUND, -1, 20, -1, 0, 2) .attr(AddArenaTrapTagAttr, ArenaTagType.SPIKES) - .target(MoveTarget.ENEMY_SIDE), + .target(MoveTarget.ENEMY_SIDE) + .reflectable(), new AttackMove(Moves.ZAP_CANNON, Type.ELECTRIC, MoveCategory.SPECIAL, 120, 50, 5, 100, 0, 2) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .ballBombMove(), new StatusMove(Moves.FORESIGHT, Type.NORMAL, -1, 40, -1, 0, 2) .attr(ExposedMoveAttr, BattlerTagType.IGNORE_GHOST) - .ignoresSubstitute(), + .ignoresSubstitute() + .reflectable(), new SelfStatusMove(Moves.DESTINY_BOND, Type.GHOST, -1, 5, -1, 0, 2) .ignoresProtect() .attr(DestinyBondAttr) @@ -8859,7 +8969,8 @@ export function initMoves() { .attr(ProtectAttr, BattlerTagType.ENDURING) .condition(failIfLastCondition), new StatusMove(Moves.CHARM, Type.FAIRY, 100, 20, -1, 0, 2) - .attr(StatStageChangeAttr, [ Stat.ATK ], -2), + .attr(StatStageChangeAttr, [ Stat.ATK ], -2) + .reflectable(), new AttackMove(Moves.ROLLOUT, Type.ROCK, MoveCategory.PHYSICAL, 30, 90, 20, -1, 0, 2) .partial() // Does not lock the user, also does not increase damage properly .attr(ConsecutiveUseDoublePowerAttr, 5, true, true, Moves.DEFENSE_CURL), @@ -8867,7 +8978,8 @@ export function initMoves() { .attr(SurviveDamageAttr), new StatusMove(Moves.SWAGGER, Type.NORMAL, 85, 15, -1, 0, 2) .attr(StatStageChangeAttr, [ Stat.ATK ], 2) - .attr(ConfuseAttr), + .attr(ConfuseAttr) + .reflectable(), new SelfStatusMove(Moves.MILK_DRINK, Type.NORMAL, -1, 5, -1, 0, 2) .attr(HealAttr, 0.5) .triageMove(), @@ -8880,11 +8992,13 @@ export function initMoves() { .attr(StatStageChangeAttr, [ Stat.DEF ], 1, true), new StatusMove(Moves.MEAN_LOOK, Type.NORMAL, -1, 5, -1, 0, 2) .condition(failIfGhostTypeCondition) - .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, true, 1), + .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, true, 1) + .reflectable(), new StatusMove(Moves.ATTRACT, Type.NORMAL, 100, 15, -1, 0, 2) .attr(AddBattlerTagAttr, BattlerTagType.INFATUATED) .ignoresSubstitute() - .condition((user, target, move) => user.isOppositeGender(target)), + .condition((user, target, move) => user.isOppositeGender(target)) + .reflectable(), new SelfStatusMove(Moves.SLEEP_TALK, Type.NORMAL, -1, 10, -1, 0, 2) .attr(BypassSleepAttr) .attr(RandomMovesetMoveAttr, invalidSleepTalkMoves, false) @@ -8931,7 +9045,8 @@ export function initMoves() { new StatusMove(Moves.ENCORE, Type.NORMAL, 100, 5, -1, 0, 2) .attr(AddBattlerTagAttr, BattlerTagType.ENCORE, false, true) .ignoresSubstitute() - .condition((user, target, move) => new EncoreTag(user.id).canAdd(target)), + .condition((user, target, move) => new EncoreTag(user.id).canAdd(target)) + .reflectable(), new AttackMove(Moves.PURSUIT, Type.DARK, MoveCategory.PHYSICAL, 40, 100, 20, -1, 0, 2) .partial(), // No effect implemented new AttackMove(Moves.RAPID_SPIN, Type.NORMAL, MoveCategory.PHYSICAL, 50, 100, 40, 100, 0, 2) @@ -8952,7 +9067,8 @@ export function initMoves() { .attr(RemoveArenaTrapAttr), new StatusMove(Moves.SWEET_SCENT, Type.NORMAL, 100, 20, -1, 0, 2) .attr(StatStageChangeAttr, [ Stat.EVA ], -2) - .target(MoveTarget.ALL_NEAR_ENEMIES), + .target(MoveTarget.ALL_NEAR_ENEMIES) + .reflectable(), new AttackMove(Moves.IRON_TAIL, Type.STEEL, MoveCategory.PHYSICAL, 100, 75, 15, 30, 0, 2) .attr(StatStageChangeAttr, [ Stat.DEF ], -1), new AttackMove(Moves.METAL_CLAW, Type.STEEL, MoveCategory.PHYSICAL, 50, 95, 35, 10, 0, 2) @@ -9040,12 +9156,15 @@ export function initMoves() { new StatusMove(Moves.TORMENT, Type.DARK, 100, 15, -1, 0, 3) .ignoresSubstitute() .edgeCase() // Incomplete implementation because of Uproar's partial implementation - .attr(AddBattlerTagAttr, BattlerTagType.TORMENT, false, true, 1), + .attr(AddBattlerTagAttr, BattlerTagType.TORMENT, false, true, 1) + .reflectable(), new StatusMove(Moves.FLATTER, Type.DARK, 100, 15, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.SPATK ], 1) - .attr(ConfuseAttr), + .attr(ConfuseAttr) + .reflectable(), new StatusMove(Moves.WILL_O_WISP, Type.FIRE, 85, 15, -1, 0, 3) - .attr(StatusEffectAttr, StatusEffect.BURN), + .attr(StatusEffectAttr, StatusEffect.BURN) + .reflectable(), new StatusMove(Moves.MEMENTO, Type.DARK, 100, 10, -1, 0, 3) .attr(SacrificialAttrOnHit) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -2), @@ -9069,7 +9188,8 @@ export function initMoves() { .attr(AddBattlerTagAttr, BattlerTagType.CHARGED, true, false), new StatusMove(Moves.TAUNT, Type.DARK, 100, 20, -1, 0, 3) .ignoresSubstitute() - .attr(AddBattlerTagAttr, BattlerTagType.TAUNT, false, true, 4), + .attr(AddBattlerTagAttr, BattlerTagType.TAUNT, false, true, 4) + .reflectable(), new StatusMove(Moves.HELPING_HAND, Type.NORMAL, -1, 20, -1, 5, 3) .attr(AddBattlerTagAttr, BattlerTagType.HELPING_HAND) .ignoresSubstitute() @@ -9092,7 +9212,12 @@ export function initMoves() { new AttackMove(Moves.SUPERPOWER, Type.FIGHTING, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF ], -1, true), new SelfStatusMove(Moves.MAGIC_COAT, Type.PSYCHIC, -1, 15, -1, 4, 3) - .unimplemented(), + .attr(AddBattlerTagAttr, BattlerTagType.MAGIC_COAT, true, true, 0) + .condition(failIfLastCondition) + // Interactions with stomping tantrum, instruct, and other moves that + // rely on move history + // Also will not reflect roar / whirlwind if the target has ForceSwitchOutImmunityAbAttr + .edgeCase(), new SelfStatusMove(Moves.RECYCLE, Type.NORMAL, -1, 10, -1, 0, 3) .unimplemented(), new AttackMove(Moves.REVENGE, Type.FIGHTING, MoveCategory.PHYSICAL, 60, 100, 10, -1, -4, 3) @@ -9101,7 +9226,8 @@ export function initMoves() { .attr(RemoveScreensAttr), new StatusMove(Moves.YAWN, Type.NORMAL, -1, 10, -1, 0, 3) .attr(AddBattlerTagAttr, BattlerTagType.DROWSY, false, true) - .condition((user, target, move) => !target.status && !target.isSafeguarded(user)), + .condition((user, target, move) => !target.status && !target.isSafeguarded(user)) + .reflectable(), new AttackMove(Moves.KNOCK_OFF, Type.DARK, MoveCategory.PHYSICAL, 65, 100, 20, -1, 0, 3) .attr(MovePowerMultiplierAttr, (user, target, move) => target.getHeldItems().filter(i => i.isTransferable).length > 0 ? 1.5 : 1) .attr(RemoveHeldItemAttr, false), @@ -9145,7 +9271,8 @@ export function initMoves() { .ballBombMove(), new StatusMove(Moves.FEATHER_DANCE, Type.FLYING, 100, 15, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.ATK ], -2) - .danceMove(), + .danceMove() + .reflectable(), new StatusMove(Moves.TEETER_DANCE, Type.NORMAL, 100, 20, -1, 0, 3) .attr(ConfuseAttr) .danceMove() @@ -9191,7 +9318,8 @@ export function initMoves() { .attr(PartyStatusCureAttr, i18next.t("moveTriggers:soothingAromaWaftedThroughArea"), Abilities.SAP_SIPPER) .target(MoveTarget.PARTY), new StatusMove(Moves.FAKE_TEARS, Type.DARK, 100, 20, -1, 0, 3) - .attr(StatStageChangeAttr, [ Stat.SPDEF ], -2), + .attr(StatStageChangeAttr, [ Stat.SPDEF ], -2) + .reflectable(), new AttackMove(Moves.AIR_CUTTER, Type.FLYING, MoveCategory.SPECIAL, 60, 95, 25, -1, 0, 3) .attr(HighCritAttr) .slicingMove() @@ -9202,7 +9330,8 @@ export function initMoves() { .attr(HealStatusEffectAttr, true, StatusEffect.FREEZE), new StatusMove(Moves.ODOR_SLEUTH, Type.NORMAL, -1, 40, -1, 0, 3) .attr(ExposedMoveAttr, BattlerTagType.IGNORE_GHOST) - .ignoresSubstitute(), + .ignoresSubstitute() + .reflectable(), new AttackMove(Moves.ROCK_TOMB, Type.ROCK, MoveCategory.PHYSICAL, 60, 95, 15, 100, 0, 3) .attr(StatStageChangeAttr, [ Stat.SPD ], -1) .makesContact(false), @@ -9211,12 +9340,15 @@ export function initMoves() { .windMove(), new StatusMove(Moves.METAL_SOUND, Type.STEEL, 85, 40, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -2) - .soundBased(), + .soundBased() + .reflectable(), new StatusMove(Moves.GRASS_WHISTLE, Type.GRASS, 55, 15, -1, 0, 3) .attr(StatusEffectAttr, StatusEffect.SLEEP) - .soundBased(), + .soundBased() + .reflectable(), new StatusMove(Moves.TICKLE, Type.NORMAL, 100, 20, -1, 0, 3) - .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF ], -1), + .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF ], -1) + .reflectable(), new SelfStatusMove(Moves.COSMIC_POWER, Type.PSYCHIC, -1, 20, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.DEF, Stat.SPDEF ], 1, true), new AttackMove(Moves.WATER_SPOUT, Type.WATER, MoveCategory.SPECIAL, 150, 100, 5, -1, 0, 3) @@ -9254,7 +9386,8 @@ export function initMoves() { .attr(StatStageChangeAttr, [ Stat.DEF ], 2, true), new StatusMove(Moves.BLOCK, Type.NORMAL, -1, 5, -1, 0, 3) .condition(failIfGhostTypeCondition) - .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, true, 1), + .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, true, 1) + .reflectable(), new StatusMove(Moves.HOWL, Type.NORMAL, -1, 40, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.ATK ], 1) .soundBased() @@ -9317,7 +9450,8 @@ export function initMoves() { .target(MoveTarget.BOTH_SIDES), new StatusMove(Moves.MIRACLE_EYE, Type.PSYCHIC, -1, 40, -1, 0, 4) .attr(ExposedMoveAttr, BattlerTagType.IGNORE_DARK) - .ignoresSubstitute(), + .ignoresSubstitute() + .reflectable(), new AttackMove(Moves.WAKE_UP_SLAP, Type.FIGHTING, MoveCategory.PHYSICAL, 70, 100, 10, -1, 0, 4) .attr(MovePowerMultiplierAttr, (user, target, move) => targetSleptOrComatoseCondition(user, target, move) ? 2 : 1) .attr(HealStatusEffectAttr, false, StatusEffect.SLEEP), @@ -9329,7 +9463,8 @@ export function initMoves() { .ballBombMove(), new SelfStatusMove(Moves.HEALING_WISH, Type.PSYCHIC, -1, 10, -1, 0, 4) .attr(SacrificialFullRestoreAttr, false, "moveTriggers:sacrificialFullRestore") - .triageMove(), + .triageMove() + .condition(failIfLastInPartyCondition), new AttackMove(Moves.BRINE, Type.WATER, MoveCategory.SPECIAL, 65, 100, 10, -1, 0, 4) .attr(MovePowerMultiplierAttr, (user, target, move) => target.getHpRatio() < 0.5 ? 2 : 1), new AttackMove(Moves.NATURAL_GIFT, Type.NORMAL, MoveCategory.PHYSICAL, -1, 100, 15, -1, 0, 4) @@ -9363,6 +9498,7 @@ export function initMoves() { 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) + .reflectable() .unimplemented(), new AttackMove(Moves.FLING, Type.DARK, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 4) .makesContact(false) @@ -9382,14 +9518,16 @@ export function initMoves() { .attr(LessPPMorePowerAttr), new StatusMove(Moves.HEAL_BLOCK, Type.PSYCHIC, 100, 15, -1, 0, 4) .attr(AddBattlerTagAttr, BattlerTagType.HEAL_BLOCK, false, true, 5) - .target(MoveTarget.ALL_NEAR_ENEMIES), + .target(MoveTarget.ALL_NEAR_ENEMIES) + .reflectable(), new AttackMove(Moves.WRING_OUT, Type.NORMAL, MoveCategory.SPECIAL, -1, 100, 5, -1, 0, 4) .attr(OpponentHighHpPowerAttr, 120) .makesContact(), new SelfStatusMove(Moves.POWER_TRICK, Type.PSYCHIC, -1, 10, -1, 0, 4) .attr(AddBattlerTagAttr, BattlerTagType.POWER_TRICK, true), new StatusMove(Moves.GASTRO_ACID, Type.POISON, 100, 10, -1, 0, 4) - .attr(SuppressAbilitiesAttr), + .attr(SuppressAbilitiesAttr) + .reflectable(), new StatusMove(Moves.LUCKY_CHANT, Type.NORMAL, -1, 30, -1, 0, 4) .attr(AddArenaTagAttr, ArenaTagType.NO_CRIT, 5, true, true) .target(MoveTarget.USER_SIDE), @@ -9411,12 +9549,14 @@ export function initMoves() { new AttackMove(Moves.LAST_RESORT, Type.NORMAL, MoveCategory.PHYSICAL, 140, 100, 5, -1, 0, 4) .attr(LastResortAttr), new StatusMove(Moves.WORRY_SEED, Type.GRASS, 100, 10, -1, 0, 4) - .attr(AbilityChangeAttr, Abilities.INSOMNIA), + .attr(AbilityChangeAttr, Abilities.INSOMNIA) + .reflectable(), new AttackMove(Moves.SUCKER_PUNCH, Type.DARK, MoveCategory.PHYSICAL, 70, 100, 5, -1, 1, 4) .condition((user, target, move) => globalScene.currentBattle.turnCommands[target.getBattlerIndex()]?.command === Command.FIGHT && !target.turnData.acted && allMoves[globalScene.currentBattle.turnCommands[target.getBattlerIndex()]?.move?.move!].category !== MoveCategory.STATUS), // TODO: is this bang correct? new StatusMove(Moves.TOXIC_SPIKES, Type.POISON, -1, 20, -1, 0, 4) .attr(AddArenaTrapTagAttr, ArenaTagType.TOXIC_SPIKES) - .target(MoveTarget.ENEMY_SIDE), + .target(MoveTarget.ENEMY_SIDE) + .reflectable(), new StatusMove(Moves.HEART_SWAP, Type.PSYCHIC, -1, 10, -1, 0, 4) .attr(SwapStatStagesAttr, BATTLE_STATS) .ignoresSubstitute(), @@ -9528,7 +9668,8 @@ export function initMoves() { .attr(ClearTerrainAttr) .attr(RemoveScreensAttr, false) .attr(RemoveArenaTrapAttr, true) - .attr(RemoveArenaTagsAttr, [ ArenaTagType.MIST, ArenaTagType.SAFEGUARD ], false), + .attr(RemoveArenaTagsAttr, [ ArenaTagType.MIST, ArenaTagType.SAFEGUARD ], false) + .reflectable(), new StatusMove(Moves.TRICK_ROOM, Type.PSYCHIC, -1, 5, -1, -7, 4) .attr(AddArenaTagAttr, ArenaTagType.TRICK_ROOM, 5) .ignoresProtect() @@ -9566,10 +9707,12 @@ export function initMoves() { new StatusMove(Moves.CAPTIVATE, Type.NORMAL, 100, 20, -1, 0, 4) .attr(StatStageChangeAttr, [ Stat.SPATK ], -2) .condition((user, target, move) => target.isOppositeGender(user)) - .target(MoveTarget.ALL_NEAR_ENEMIES), + .target(MoveTarget.ALL_NEAR_ENEMIES) + .reflectable(), new StatusMove(Moves.STEALTH_ROCK, Type.ROCK, -1, 20, -1, 0, 4) .attr(AddArenaTrapTagAttr, ArenaTagType.STEALTH_ROCK) - .target(MoveTarget.ENEMY_SIDE), + .target(MoveTarget.ENEMY_SIDE) + .reflectable(), new AttackMove(Moves.GRASS_KNOT, Type.GRASS, MoveCategory.SPECIAL, -1, 100, 20, -1, 0, 4) .attr(WeightPowerAttr) .makesContact(), @@ -9606,14 +9749,16 @@ export function initMoves() { new SelfStatusMove(Moves.LUNAR_DANCE, Type.PSYCHIC, -1, 10, -1, 0, 4) .attr(SacrificialFullRestoreAttr, true, "moveTriggers:lunarDanceRestore") .danceMove() - .triageMove(), + .triageMove() + .condition(failIfLastInPartyCondition), new AttackMove(Moves.CRUSH_GRIP, Type.NORMAL, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 4) .attr(OpponentHighHpPowerAttr, 120), new AttackMove(Moves.MAGMA_STORM, Type.FIRE, MoveCategory.SPECIAL, 100, 75, 5, -1, 0, 4) .attr(TrapAttr, BattlerTagType.MAGMA_STORM), new StatusMove(Moves.DARK_VOID, Type.DARK, 80, 10, -1, 0, 4) //Accuracy from Generations 4-6 .attr(StatusEffectAttr, StatusEffect.SLEEP) - .target(MoveTarget.ALL_NEAR_ENEMIES), + .target(MoveTarget.ALL_NEAR_ENEMIES) + .reflectable(), new AttackMove(Moves.SEED_FLARE, Type.GRASS, MoveCategory.SPECIAL, 120, 85, 5, 40, 0, 4) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -2), new AttackMove(Moves.OMINOUS_WIND, Type.GHOST, MoveCategory.SPECIAL, 60, 100, 5, 10, 0, 4) @@ -9653,7 +9798,8 @@ export function initMoves() { .condition((_user, target, _move) => !(target.species.speciesId === Species.GENGAR && target.getFormKey() === "mega")) .condition((_user, target, _move) => Utils.isNullOrUndefined(target.getTag(BattlerTagType.INGRAIN)) && Utils.isNullOrUndefined(target.getTag(BattlerTagType.IGNORE_FLYING))) .attr(AddBattlerTagAttr, BattlerTagType.TELEKINESIS, false, true, 3) - .attr(AddBattlerTagAttr, BattlerTagType.FLOATING, false, true, 3), + .attr(AddBattlerTagAttr, BattlerTagType.FLOATING, false, true, 3) + .reflectable(), new StatusMove(Moves.MAGIC_ROOM, Type.PSYCHIC, -1, 10, -1, 0, 5) .ignoresProtect() .target(MoveTarget.BOTH_SIDES) @@ -9686,7 +9832,8 @@ export function initMoves() { .attr(ElectroBallPowerAttr) .ballBombMove(), new StatusMove(Moves.SOAK, Type.WATER, 100, 20, -1, 0, 5) - .attr(ChangeTypeAttr, Type.WATER), + .attr(ChangeTypeAttr, Type.WATER) + .reflectable(), new AttackMove(Moves.FLAME_CHARGE, Type.FIRE, MoveCategory.PHYSICAL, 50, 100, 20, 100, 0, 5) .attr(StatStageChangeAttr, [ Stat.SPD ], 1, true), new SelfStatusMove(Moves.COIL, Type.POISON, -1, 20, -1, 0, 5) @@ -9699,9 +9846,11 @@ export function initMoves() { new AttackMove(Moves.FOUL_PLAY, Type.DARK, MoveCategory.PHYSICAL, 95, 100, 15, -1, 0, 5) .attr(TargetAtkUserAtkAttr), new StatusMove(Moves.SIMPLE_BEAM, Type.NORMAL, 100, 15, -1, 0, 5) - .attr(AbilityChangeAttr, Abilities.SIMPLE), + .attr(AbilityChangeAttr, Abilities.SIMPLE) + .reflectable(), new StatusMove(Moves.ENTRAINMENT, Type.NORMAL, 100, 15, -1, 0, 5) - .attr(AbilityGiveAttr), + .attr(AbilityGiveAttr) + .reflectable(), new StatusMove(Moves.AFTER_YOU, Type.NORMAL, -1, 15, -1, 0, 5) .ignoresProtect() .ignoresSubstitute() @@ -9739,7 +9888,8 @@ export function initMoves() { new StatusMove(Moves.HEAL_PULSE, Type.PSYCHIC, -1, 10, -1, 0, 5) .attr(HealAttr, 0.5, false, false) .pulseMove() - .triageMove(), + .triageMove() + .reflectable(), new AttackMove(Moves.HEX, Type.GHOST, MoveCategory.SPECIAL, 65, 100, 10, -1, 0, 5) .attr( MovePowerMultiplierAttr, @@ -9942,7 +10092,8 @@ export function initMoves() { .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], 1, false, { condition: (user, target, move) => target.isOfType(Type.GRASS) && target.isGrounded() }), new StatusMove(Moves.STICKY_WEB, Type.BUG, -1, 20, -1, 0, 6) .attr(AddArenaTrapTagAttr, ArenaTagType.STICKY_WEB) - .target(MoveTarget.ENEMY_SIDE), + .target(MoveTarget.ENEMY_SIDE) + .reflectable(), new AttackMove(Moves.FELL_STINGER, Type.BUG, MoveCategory.PHYSICAL, 50, 100, 25, -1, 0, 6) .attr(PostVictoryStatStageChangeAttr, [ Stat.ATK ], 3, true ), new ChargingAttackMove(Moves.PHANTOM_FORCE, Type.GHOST, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 6) @@ -9950,10 +10101,12 @@ export function initMoves() { .chargeAttr(SemiInvulnerableAttr, BattlerTagType.HIDDEN) .ignoresProtect(), new StatusMove(Moves.TRICK_OR_TREAT, Type.GHOST, 100, 20, -1, 0, 6) - .attr(AddTypeAttr, Type.GHOST), + .attr(AddTypeAttr, Type.GHOST) + .reflectable(), new StatusMove(Moves.NOBLE_ROAR, Type.NORMAL, 100, 30, -1, 0, 6) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1) - .soundBased(), + .soundBased() + .reflectable(), new StatusMove(Moves.ION_DELUGE, Type.ELECTRIC, -1, 25, -1, 1, 6) .attr(AddArenaTagAttr, ArenaTagType.ION_DELUGE) .target(MoveTarget.BOTH_SIDES), @@ -9962,7 +10115,8 @@ export function initMoves() { .target(MoveTarget.ALL_NEAR_OTHERS) .triageMove(), new StatusMove(Moves.FORESTS_CURSE, Type.GRASS, 100, 20, -1, 0, 6) - .attr(AddTypeAttr, Type.GRASS), + .attr(AddTypeAttr, Type.GRASS) + .reflectable(), new AttackMove(Moves.PETAL_BLIZZARD, Type.GRASS, MoveCategory.PHYSICAL, 90, 100, 15, -1, 0, 6) .windMove() .makesContact(false) @@ -9976,9 +10130,11 @@ export function initMoves() { new StatusMove(Moves.PARTING_SHOT, Type.DARK, 100, 20, -1, 0, 6) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1, false, { trigger: MoveEffectTrigger.PRE_APPLY }) .attr(ForceSwitchOutAttr, true) - .soundBased(), + .soundBased() + .reflectable(), new StatusMove(Moves.TOPSY_TURVY, Type.DARK, -1, 20, -1, 0, 6) - .attr(InvertStatsAttr), + .attr(InvertStatsAttr) + .reflectable(), new AttackMove(Moves.DRAINING_KISS, Type.FAIRY, MoveCategory.SPECIAL, 50, 100, 10, -1, 0, 6) .attr(HitHealAttr, 0.75) .makesContact() @@ -10017,10 +10173,12 @@ export function initMoves() { .condition(failIfLastCondition), new StatusMove(Moves.PLAY_NICE, Type.NORMAL, -1, 20, -1, 0, 6) .attr(StatStageChangeAttr, [ Stat.ATK ], -1) - .ignoresSubstitute(), + .ignoresSubstitute() + .reflectable(), new StatusMove(Moves.CONFIDE, Type.NORMAL, -1, 20, -1, 0, 6) .attr(StatStageChangeAttr, [ Stat.SPATK ], -1) - .soundBased(), + .soundBased() + .reflectable(), new AttackMove(Moves.DIAMOND_STORM, Type.ROCK, MoveCategory.PHYSICAL, 100, 95, 5, 50, 0, 6) .attr(StatStageChangeAttr, [ Stat.DEF ], 2, true, { firstTargetOnly: true }) .makesContact(false) @@ -10047,14 +10205,17 @@ export function initMoves() { .condition(failIfSingleBattle) .target(MoveTarget.NEAR_ALLY), new StatusMove(Moves.EERIE_IMPULSE, Type.ELECTRIC, 100, 15, -1, 0, 6) - .attr(StatStageChangeAttr, [ Stat.SPATK ], -2), + .attr(StatStageChangeAttr, [ Stat.SPATK ], -2) + .reflectable(), new StatusMove(Moves.VENOM_DRENCH, Type.POISON, 100, 20, -1, 0, 6) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK, Stat.SPD ], -1, false, { condition: (user, target, move) => target.status?.effect === StatusEffect.POISON || target.status?.effect === StatusEffect.TOXIC }) - .target(MoveTarget.ALL_NEAR_ENEMIES), + .target(MoveTarget.ALL_NEAR_ENEMIES) + .reflectable(), new StatusMove(Moves.POWDER, Type.BUG, 100, 20, -1, 1, 6) .attr(AddBattlerTagAttr, BattlerTagType.POWDER, false, true) .ignoresSubstitute() - .powderMove(), + .powderMove() + .reflectable(), new ChargingSelfStatusMove(Moves.GEOMANCY, Type.FAIRY, -1, 10, -1, 0, 6) .chargeText(i18next.t("moveTriggers:isChargingPower", { pokemonName: "{USER}" })) .attr(StatStageChangeAttr, [ Stat.SPATK, Stat.SPDEF, Stat.SPD ], 2, true), @@ -10076,7 +10237,8 @@ export function initMoves() { .ignoresSubstitute() .target(MoveTarget.NEAR_ALLY), new StatusMove(Moves.BABY_DOLL_EYES, Type.FAIRY, 100, 30, -1, 1, 6) - .attr(StatStageChangeAttr, [ Stat.ATK ], -1), + .attr(StatStageChangeAttr, [ Stat.ATK ], -1) + .reflectable(), new AttackMove(Moves.NUZZLE, Type.ELECTRIC, MoveCategory.PHYSICAL, 20, 100, 20, 100, 0, 6) .attr(StatusEffectAttr, StatusEffect.PARALYSIS), new AttackMove(Moves.HOLD_BACK, Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 40, -1, 0, 6) @@ -10220,13 +10382,15 @@ export function initMoves() { .punchingMove(), new StatusMove(Moves.FLORAL_HEALING, Type.FAIRY, -1, 10, -1, 0, 7) .attr(BoostHealAttr, 0.5, 2 / 3, true, false, (user, target, move) => globalScene.arena.terrain?.terrainType === TerrainType.GRASSY) - .triageMove(), + .triageMove() + .reflectable(), new AttackMove(Moves.HIGH_HORSEPOWER, Type.GROUND, MoveCategory.PHYSICAL, 95, 95, 10, -1, 0, 7), new StatusMove(Moves.STRENGTH_SAP, Type.GRASS, 100, 10, -1, 0, 7) .attr(HitHealAttr, null, Stat.ATK) .attr(StatStageChangeAttr, [ Stat.ATK ], -1) .condition((user, target, move) => target.getStatStage(Stat.ATK) > -6) - .triageMove(), + .triageMove() + .reflectable(), new ChargingAttackMove(Moves.SOLAR_BLADE, Type.GRASS, MoveCategory.PHYSICAL, 125, 100, 10, -1, 0, 7) .chargeText(i18next.t("moveTriggers:isGlowing", { pokemonName: "{USER}" })) .chargeAttr(WeatherInstantChargeAttr, [ WeatherType.SUNNY, WeatherType.HARSH_SUN ]) @@ -10236,10 +10400,12 @@ export function initMoves() { .makesContact(false), new StatusMove(Moves.SPOTLIGHT, Type.NORMAL, -1, 15, -1, 3, 7) .attr(AddBattlerTagAttr, BattlerTagType.CENTER_OF_ATTENTION, false) - .condition(failIfSingleBattle), + .condition(failIfSingleBattle) + .reflectable(), new StatusMove(Moves.TOXIC_THREAD, Type.POISON, 100, 20, -1, 0, 7) .attr(StatusEffectAttr, StatusEffect.POISON) - .attr(StatStageChangeAttr, [ Stat.SPD ], -1), + .attr(StatStageChangeAttr, [ Stat.SPD ], -1) + .reflectable(), new SelfStatusMove(Moves.LASER_FOCUS, Type.NORMAL, -1, 30, -1, 0, 7) .attr(AddBattlerTagAttr, BattlerTagType.ALWAYS_CRIT, true, false), new StatusMove(Moves.GEAR_UP, Type.STEEL, -1, 20, -1, 0, 7) @@ -10283,7 +10449,8 @@ export function initMoves() { (user: Pokemon, target: Pokemon, move: Move) => isNonVolatileStatusEffect(target.status?.effect!)) // TODO: is this bang correct? .attr(HealAttr, 0.5) .attr(HealStatusEffectAttr, false, getNonVolatileStatusEffects()) - .triageMove(), + .triageMove() + .reflectable(), new AttackMove(Moves.REVELATION_DANCE, Type.NORMAL, MoveCategory.SPECIAL, 90, 100, 15, -1, 0, 7) .danceMove() .attr(MatchUserTypeAttr), @@ -10365,14 +10532,15 @@ export function initMoves() { new AttackMove(Moves.PRISMATIC_LASER, Type.PSYCHIC, MoveCategory.SPECIAL, 160, 100, 10, -1, 0, 7) .attr(RechargeAttr), new AttackMove(Moves.SPECTRAL_THIEF, Type.GHOST, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 7) - .ignoresSubstitute() - .partial(), // Does not steal stats + .attr(SpectralThiefAttr) + .ignoresSubstitute(), new AttackMove(Moves.SUNSTEEL_STRIKE, Type.STEEL, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 7) .ignoresAbilities(), new AttackMove(Moves.MOONGEIST_BEAM, Type.GHOST, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 7) .ignoresAbilities(), new StatusMove(Moves.TEARFUL_LOOK, Type.NORMAL, -1, 20, -1, 0, 7) - .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1), + .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1) + .reflectable(), new AttackMove(Moves.ZING_ZAP, Type.ELECTRIC, MoveCategory.PHYSICAL, 80, 100, 10, 30, 0, 7) .attr(FlinchAttr), new AttackMove(Moves.NATURES_MADNESS, Type.FAIRY, MoveCategory.SPECIAL, -1, 90, 10, -1, 0, 7) @@ -10429,9 +10597,8 @@ export function initMoves() { new AttackMove(Moves.PIKA_PAPOW, Type.ELECTRIC, MoveCategory.SPECIAL, -1, -1, 20, -1, 0, 7) .attr(FriendshipPowerAttr), new AttackMove(Moves.BOUNCY_BUBBLE, Type.WATER, MoveCategory.SPECIAL, 60, 100, 20, -1, 0, 7) - .attr(HitHealAttr) // Custom - .triageMove() - .target(MoveTarget.ALL_NEAR_ENEMIES), + .attr(HitHealAttr, 1) + .triageMove(), new AttackMove(Moves.BUZZY_BUZZ, Type.ELECTRIC, MoveCategory.SPECIAL, 60, 100, 20, 100, 0, 7) .attr(StatusEffectAttr, StatusEffect.PARALYSIS), new AttackMove(Moves.SIZZLY_SLIDE, Type.FIRE, MoveCategory.PHYSICAL, 60, 100, 20, 100, 0, 7) @@ -10492,10 +10659,12 @@ export function initMoves() { .condition((user, target, move) => user.getTag(TrappedTag)?.sourceMove !== Moves.NO_RETREAT), // fails if the user is currently trapped by No Retreat new StatusMove(Moves.TAR_SHOT, Type.ROCK, 100, 15, -1, 0, 8) .attr(StatStageChangeAttr, [ Stat.SPD ], -1) - .attr(AddBattlerTagAttr, BattlerTagType.TAR_SHOT, false), + .attr(AddBattlerTagAttr, BattlerTagType.TAR_SHOT, false) + .reflectable(), new StatusMove(Moves.MAGIC_POWDER, Type.PSYCHIC, 100, 20, -1, 0, 8) .attr(ChangeTypeAttr, Type.PSYCHIC) - .powderMove(), + .powderMove() + .reflectable(), new AttackMove(Moves.DRAGON_DARTS, Type.DRAGON, MoveCategory.PHYSICAL, 50, 100, 10, -1, 0, 8) .attr(MultiHitAttr, MultiHitType._2) .makesContact(false) @@ -10672,6 +10841,7 @@ export function initMoves() { .makesContact(false), new StatusMove(Moves.CORROSIVE_GAS, Type.POISON, 100, 40, -1, 0, 8) .target(MoveTarget.ALL_NEAR_OTHERS) + .reflectable() .unimplemented(), new StatusMove(Moves.COACHING, Type.FIGHTING, -1, 10, -1, 0, 8) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF ], 1) @@ -10906,8 +11076,7 @@ export function initMoves() { .attr(TeraMoveCategoryAttr) .attr(TeraBlastTypeAttr) .attr(TeraBlastPowerAttr) - .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1, true, { condition: (user, target, move) => user.isTerastallized() && user.isOfType(Type.STELLAR) }) - .partial(), /** Does not ignore abilities that affect stats, relevant in determining the move's category {@see TeraMoveCategoryAttr} */ + .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1, true, { condition: (user, target, move) => user.isTerastallized() && user.isOfType(Type.STELLAR) }), new SelfStatusMove(Moves.SILK_TRAP, Type.BUG, -1, 10, -1, 4, 9) .attr(ProtectAttr, BattlerTagType.SILK_TRAP) .condition(failIfLastCondition), @@ -10917,8 +11086,7 @@ export function initMoves() { .attr(ConfuseAttr) .recklessMove(), new AttackMove(Moves.LAST_RESPECTS, Type.GHOST, MoveCategory.PHYSICAL, 50, 100, 10, -1, 0, 9) - .partial() // Counter resets every wave instead of on arena reset - .attr(MovePowerMultiplierAttr, (user, target, move) => 1 + Math.min(user.isPlayer() ? globalScene.currentBattle.playerFaints : globalScene.currentBattle.enemyFaints, 100)) + .attr(MovePowerMultiplierAttr, (user, target, move) => 1 + Math.min(user.isPlayer() ? globalScene.arena.playerFaints : globalScene.currentBattle.enemyFaints, 100)) .makesContact(false), new AttackMove(Moves.LUMINA_CRASH, Type.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 10, 100, 0, 9) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -2), diff --git a/src/data/mystery-encounters/encounters/fun-and-games-encounter.ts b/src/data/mystery-encounters/encounters/fun-and-games-encounter.ts index 53f89069491..287376f8bd0 100644 --- a/src/data/mystery-encounters/encounters/fun-and-games-encounter.ts +++ b/src/data/mystery-encounters/encounters/fun-and-games-encounter.ts @@ -41,8 +41,6 @@ export const FunAndGamesEncounter: MysteryEncounter = .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) .withSceneRequirement(new MoneyRequirement(0, 1.5)) // Cost equal to 1 Max Potion to play .withAutoHideIntroVisuals(false) - // Allows using move without a visible enemy pokemon - .withBattleAnimationsWithoutTargets(true) // The Wobbuffet won't use moves .withSkipEnemyBattleTurns(true) // Will skip COMMAND selection menu and go straight to FIGHT (move select) menu diff --git a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts index fd078e1ffaa..aa497e3c8fc 100644 --- a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts +++ b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts @@ -315,7 +315,7 @@ async function summonSafariPokemon() { const ivScannerModifier = globalScene.findModifier(m => m instanceof IvScannerModifier); if (ivScannerModifier) { - globalScene.pushPhase(new ScanIvsPhase(pokemon.getBattlerIndex(), Math.min(ivScannerModifier.getStackCount() * 2, 6))); + globalScene.pushPhase(new ScanIvsPhase(pokemon.getBattlerIndex())); } } diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index ead0443908b..351b969b1a8 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -887,16 +887,21 @@ export function getRandomEncounterSpecies(level: number, isBoss: boolean = false let bossSpecies: PokemonSpecies; let isEventEncounter = false; const eventEncounters = globalScene.eventManager.getEventEncounters(); + let formIndex; if (eventEncounters.length > 0 && randSeedInt(2) === 1) { const eventEncounter = randSeedItem(eventEncounters); const levelSpecies = getPokemonSpecies(eventEncounter.species).getWildSpeciesForLevel(level, !eventEncounter.blockEvolution, isBoss, globalScene.gameMode); isEventEncounter = true; bossSpecies = getPokemonSpecies(levelSpecies); + formIndex = eventEncounter.formIndex; } else { bossSpecies = globalScene.arena.randomSpecies(globalScene.currentBattle.waveIndex, level, 0, getPartyLuckValue(globalScene.getPlayerParty()), isBoss); } const ret = new EnemyPokemon(bossSpecies, level, TrainerSlot.NONE, isBoss); + if (formIndex) { + ret.formIndex = formIndex; + } //Reroll shiny for event encounters if (isEventEncounter && !ret.shiny) { diff --git a/src/data/pokemon-forms.ts b/src/data/pokemon-forms.ts index 02beab780c5..0226aef79d1 100644 --- a/src/data/pokemon-forms.ts +++ b/src/data/pokemon-forms.ts @@ -328,7 +328,8 @@ export class SpeciesFormChangeMoveLearnedTrigger extends SpeciesFormChangeTrigge this.move = move; this.known = known; const moveKey = Moves[this.move].split("_").filter(f => f).map((f, i) => i ? `${f[0]}${f.slice(1).toLowerCase()}` : f.toLowerCase()).join("") as unknown as string; - this.description = i18next.t("pokemonEvolutions:Forms.moveLearned", { move: i18next.t(`move:${moveKey}.name`) }); + this.description = known ? i18next.t("pokemonEvolutions:Forms.moveLearned", { move: i18next.t(`move:${moveKey}.name`) }) : + i18next.t("pokemonEvolutions:Forms.moveForgotten", { move: i18next.t(`move:${moveKey}.name`) }); } canChange(pokemon: Pokemon): boolean { diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index edc9cbccfd2..4349cee2cbf 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -7,7 +7,7 @@ import i18next from "i18next"; import type { AnySound } from "#app/battle-scene"; import { globalScene } from "#app/global-scene"; import type { GameMode } from "#app/game-mode"; -import type { StarterMoveset } from "#app/system/game-data"; +import { DexAttr, type StarterMoveset } from "#app/system/game-data"; import * as Utils from "#app/utils"; import { uncatchableSpecies } from "#app/data/balance/biomes"; import { speciesEggMoves } from "#app/data/balance/egg-moves"; @@ -32,6 +32,37 @@ export enum Region { PALDEA } +// TODO: this is horrible and will need to be removed once a refactor/cleanup of forms is executed. +export const normalForm: Species[] = [ + Species.PIKACHU, + Species.RAICHU, + Species.EEVEE, + Species.JOLTEON, + Species.FLAREON, + Species.VAPOREON, + Species.ESPEON, + Species.UMBREON, + Species.LEAFEON, + Species.GLACEON, + Species.SYLVEON, + Species.PICHU, + Species.ROTOM, + Species.DIALGA, + Species.PALKIA, + Species.KYUREM, + Species.GENESECT, + Species.FROAKIE, + Species.FROGADIER, + Species.GRENINJA, + Species.ROCKRUFF, + Species.NECROZMA, + Species.MAGEARNA, + Species.MARSHADOW, + Species.CRAMORANT, + Species.ZARUDE, + Species.CALYREX +]; + /** * Gets the {@linkcode PokemonSpecies} object associated with the {@linkcode Species} enum given * @param species The species to fetch @@ -324,8 +355,8 @@ export abstract class PokemonSpeciesForm { return ret; } - getSpriteAtlasPath(female: boolean, formIndex?: number, shiny?: boolean, variant?: number): string { - const spriteId = this.getSpriteId(female, formIndex, shiny, variant).replace(/\_{2}/g, "/"); + getSpriteAtlasPath(female: boolean, formIndex?: number, shiny?: boolean, variant?: number, back?: boolean): string { + const spriteId = this.getSpriteId(female, formIndex, shiny, variant, back).replace(/\_{2}/g, "/"); return `${/_[1-3]$/.test(spriteId) ? "variant/" : ""}${spriteId}`; } @@ -346,8 +377,8 @@ export abstract class PokemonSpeciesForm { return `${back ? "back__" : ""}${shiny && (!variantSet || (!variant && !variantSet[variant || 0])) ? "shiny__" : ""}${baseSpriteKey}${shiny && variantSet && variantSet[variant] === 2 ? `_${variant + 1}` : ""}`; } - getSpriteKey(female: boolean, formIndex?: number, shiny?: boolean, variant?: number): string { - return `pkmn__${this.getSpriteId(female, formIndex, shiny, variant)}`; + getSpriteKey(female: boolean, formIndex?: number, shiny?: boolean, variant?: number, back?: boolean): string { + return `pkmn__${this.getSpriteId(female, formIndex, shiny, variant, back)}`; } abstract getFormSpriteKey(formIndex?: number): string; @@ -520,10 +551,10 @@ export abstract class PokemonSpeciesForm { return true; } - loadAssets(female: boolean, formIndex?: number, shiny?: boolean, variant?: Variant, startLoad?: boolean): Promise { + loadAssets(female: boolean, formIndex?: number, shiny?: boolean, variant?: Variant, startLoad?: boolean, back?: boolean): Promise { return new Promise(resolve => { - const spriteKey = this.getSpriteKey(female, formIndex, shiny, variant); - globalScene.loadPokemonAtlas(spriteKey, this.getSpriteAtlasPath(female, formIndex, shiny, variant)); + const spriteKey = this.getSpriteKey(female, formIndex, shiny, variant, back); + globalScene.loadPokemonAtlas(spriteKey, this.getSpriteAtlasPath(female, formIndex, shiny, variant, back)); globalScene.load.audio(`${this.getCryKey(formIndex)}`, `audio/${this.getCryKey(formIndex)}.m4a`); globalScene.load.once(Phaser.Loader.Events.COMPLETE, () => { const originalWarn = console.warn; @@ -533,7 +564,7 @@ export abstract class PokemonSpeciesForm { console.warn = originalWarn; if (!(globalScene.anims.exists(spriteKey))) { globalScene.anims.create({ - key: this.getSpriteKey(female, formIndex, shiny, variant), + key: this.getSpriteKey(female, formIndex, shiny, variant, back), frames: frameNames, frameRate: 10, repeat: -1 @@ -541,7 +572,7 @@ export abstract class PokemonSpeciesForm { } else { globalScene.anims.get(spriteKey).frameRate = 10; } - const spritePath = this.getSpriteAtlasPath(female, formIndex, shiny, variant).replace("variant/", "").replace(/_[1-3]$/, ""); + const spritePath = this.getSpriteAtlasPath(female, formIndex, shiny, variant, back).replace("variant/", "").replace(/_[1-3]$/, ""); globalScene.loadPokemonVariantAssets(spriteKey, spritePath, variant).then(() => resolve()); }); if (startLoad) { @@ -690,6 +721,56 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali return this.name; } + /** + * Find the name of species with proper attachments for regionals and separate starter forms (Floette, Ursaluna) + * @returns a string with the region name or other form name attached + */ + getExpandedSpeciesName(): string { + if (this.speciesId < 2000) { + return this.name; // Other special cases could be put here too + } else { // Everything beyond this point essentially follows the pattern of FORMNAME_SPECIES + return i18next.t(`pokemonForm:appendForm.${Species[this.speciesId].split("_")[0]}`, { pokemonName: this.name }); + } + } + + /** + * Find the form name for species with just one form (regional variants, Floette, Ursaluna) + * @param formIndex The form index to check (defaults to 0) + * @param append Whether to append the species name to the end (defaults to false) + * @returns the pokemon-form locale key for the single form name ("Alolan Form", "Eternal Flower" etc) + */ + getFormNameToDisplay(formIndex: number = 0, append: boolean = false): string { + const formKey = this.forms?.[formIndex!]?.formKey; + const formText = Utils.capitalizeString(formKey, "-", false, false) || ""; + const speciesName = Utils.capitalizeString(Species[this.speciesId], "_", true, false); + let ret: string = ""; + + const region = this.getRegion(); + if (this.speciesId === Species.ARCEUS) { + ret = i18next.t(`pokemonInfo:Type.${formText?.toUpperCase()}`); + } else if ([ SpeciesFormKey.MEGA, SpeciesFormKey.MEGA_X, SpeciesFormKey.MEGA_Y, SpeciesFormKey.PRIMAL, SpeciesFormKey.GIGANTAMAX, SpeciesFormKey.GIGANTAMAX_RAPID, SpeciesFormKey.GIGANTAMAX_SINGLE, SpeciesFormKey.ETERNAMAX ].includes(formKey as SpeciesFormKey)) { + return i18next.t(`battlePokemonForm:${formKey}`, { pokemonName: (append ? this.name : "") }); + } else if (region === Region.NORMAL || (this.speciesId === Species.GALAR_DARMANITAN && formIndex > 0) || this.speciesId === Species.PALDEA_TAUROS) { // More special cases can be added here + const i18key = `pokemonForm:${speciesName}${formText}`; + if (i18next.exists(i18key)) { + ret = i18next.t(i18key); + } else { + const rootSpeciesName = Utils.capitalizeString(Species[this.getRootSpeciesId()], "_", true, false); + const i18RootKey = `pokemonForm:${rootSpeciesName}${formText}`; + ret = i18next.exists(i18RootKey) ? i18next.t(i18RootKey) : formText; + } + } else if (append) { // Everything beyond this has an expanded name + return this.getExpandedSpeciesName(); + } else if (this.speciesId === Species.ETERNAL_FLOETTE) { // Not a real form, so the key is made up + return i18next.t("pokemonForm:floetteEternalFlower"); + } else if (this.speciesId === Species.BLOODMOON_URSALUNA) { // Not a real form, so the key is made up + return i18next.t("pokemonForm:ursalunaBloodmoon"); + } else { // Only regional forms should be left at this point + return i18next.t(`pokemonForm:regionalForm.${Region[region]}`); + } + return append ? i18next.t("pokemonForm:appendForm.GENERIC", { pokemonName: this.name, formName: ret }) : ret; + } + localize(): void { this.name = i18next.t(`pokemon:${Species[this.speciesId].toLowerCase()}`); } @@ -947,25 +1028,59 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali ? this.forms[formIndex || 0].getFormSpriteKey() : ""; } + + /** + * Generates a {@linkcode bigint} corresponding to the maximum unlocks possible for this species, + * taking into account if the species has a male/female gender, and which variants are implemented. + * @returns {@linkcode bigint} Maximum unlocks, can be compared with {@linkcode DexEntry.caughtAttr}. + */ + getFullUnlocksData(): bigint { + let caughtAttr: bigint = 0n; + caughtAttr += DexAttr.NON_SHINY; + caughtAttr += DexAttr.SHINY; + if (this.malePercent !== null) { + if (this.malePercent > 0) { + caughtAttr += DexAttr.MALE; + } + if (this.malePercent < 100) { + caughtAttr += DexAttr.FEMALE; + } + } + caughtAttr += DexAttr.DEFAULT_VARIANT; + if (this.hasVariants()) { + caughtAttr += DexAttr.VARIANT_2; + caughtAttr += DexAttr.VARIANT_3; + } + + // Summing successive bigints for each obtainable form + caughtAttr += this?.forms?.length > 1 ? + this.forms.map((f, index) => f.isUnobtainable ? 0n : 128n * 2n ** BigInt(index)).reduce((acc, val) => acc + val, 0n) : + DexAttr.DEFAULT_FORM; + + return caughtAttr; + } } export class PokemonForm extends PokemonSpeciesForm { public formName: string; public formKey: string; public formSpriteKey: string | null; + public isUnobtainable: boolean; // This is a collection of form keys that have in-run form changes, but should still be separately selectable from the start screen private starterSelectableKeys: string[] = [ "10", "50", "10-pc", "50-pc", "red", "orange", "yellow", "green", "blue", "indigo", "violet" ]; constructor(formName: string, formKey: string, type1: Type, type2: Type | null, height: number, weight: number, ability1: Abilities, ability2: Abilities, abilityHidden: Abilities, baseTotal: number, baseHp: number, baseAtk: number, baseDef: number, baseSpatk: number, baseSpdef: number, baseSpd: number, - catchRate: number, baseFriendship: number, baseExp: number, genderDiffs: boolean = false, formSpriteKey: string | null = null, isStarterSelectable: boolean = false + catchRate: number, baseFriendship: number, baseExp: number, genderDiffs: boolean = false, formSpriteKey: string | null = null, isStarterSelectable: boolean = false, + isUnobtainable: boolean = false ) { super(type1, type2, height, weight, ability1, ability2, abilityHidden, baseTotal, baseHp, baseAtk, baseDef, baseSpatk, baseSpdef, baseSpd, catchRate, baseFriendship, baseExp, genderDiffs, (isStarterSelectable || !formKey)); this.formName = formName; this.formKey = formKey; this.formSpriteKey = formSpriteKey; + this.isUnobtainable = isUnobtainable; } getFormSpriteKey(_formIndex?: number) { @@ -1027,15 +1142,15 @@ export function initSpecies() { ), new PokemonSpecies(Species.WEEDLE, 1, false, false, false, "Hairy Bug Pokémon", Type.BUG, Type.POISON, 0.3, 3.2, Abilities.SHIELD_DUST, Abilities.NONE, Abilities.RUN_AWAY, 195, 40, 35, 30, 20, 20, 50, 255, 70, 39, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.KAKUNA, 1, false, false, false, "Cocoon Pokémon", Type.BUG, Type.POISON, 0.6, 10, Abilities.SHED_SKIN, Abilities.NONE, Abilities.SHED_SKIN, 205, 45, 25, 50, 25, 25, 35, 120, 70, 72, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.BEEDRILL, 1, false, false, false, "Poison Bee Pokémon", Type.BUG, Type.POISON, 1, 29.5, Abilities.SWARM, Abilities.NONE, Abilities.SNIPER, 395, 65, 90, 40, 45, 80, 75, 45, 70, 178, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", Type.BUG, Type.POISON, 1, 29.5, Abilities.SWARM, Abilities.NONE, Abilities.SNIPER, 395, 65, 90, 40, 45, 80, 75, 45, 70, 178, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.BUG, Type.POISON, 1.4, 40.5, Abilities.ADAPTABILITY, Abilities.NONE, Abilities.ADAPTABILITY, 495, 65, 150, 40, 15, 80, 145, 45, 70, 178), + new PokemonSpecies(Species.BEEDRILL, 1, false, false, false, "Poison Bee Pokémon", Type.BUG, Type.POISON, 1, 29.5, Abilities.SWARM, Abilities.NONE, Abilities.SNIPER, 395, 65, 90, 40, 45, 80, 75, 45, 70, 198, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal", "", Type.BUG, Type.POISON, 1, 29.5, Abilities.SWARM, Abilities.NONE, Abilities.SNIPER, 395, 65, 90, 40, 45, 80, 75, 45, 70, 198, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.BUG, Type.POISON, 1.4, 40.5, Abilities.ADAPTABILITY, Abilities.NONE, Abilities.ADAPTABILITY, 495, 65, 150, 40, 15, 80, 145, 45, 70, 198), ), new PokemonSpecies(Species.PIDGEY, 1, false, false, false, "Tiny Bird Pokémon", Type.NORMAL, Type.FLYING, 0.3, 1.8, Abilities.KEEN_EYE, Abilities.TANGLED_FEET, Abilities.BIG_PECKS, 251, 40, 45, 40, 35, 35, 56, 255, 70, 50, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.PIDGEOTTO, 1, false, false, false, "Bird Pokémon", Type.NORMAL, Type.FLYING, 1.1, 30, Abilities.KEEN_EYE, Abilities.TANGLED_FEET, Abilities.BIG_PECKS, 349, 63, 60, 55, 50, 50, 71, 120, 70, 122, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.PIDGEOT, 1, false, false, false, "Bird Pokémon", Type.NORMAL, Type.FLYING, 1.5, 39.5, Abilities.KEEN_EYE, Abilities.TANGLED_FEET, Abilities.BIG_PECKS, 479, 83, 80, 75, 70, 70, 101, 45, 70, 216, GrowthRate.MEDIUM_SLOW, 50, false, true, - new PokemonForm("Normal", "", Type.NORMAL, Type.FLYING, 1.5, 39.5, Abilities.KEEN_EYE, Abilities.TANGLED_FEET, Abilities.BIG_PECKS, 479, 83, 80, 75, 70, 70, 101, 45, 70, 216, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.NORMAL, Type.FLYING, 2.2, 50.5, Abilities.NO_GUARD, Abilities.NO_GUARD, Abilities.NO_GUARD, 579, 83, 80, 80, 135, 80, 121, 45, 70, 216), + new PokemonSpecies(Species.PIDGEOT, 1, false, false, false, "Bird Pokémon", Type.NORMAL, Type.FLYING, 1.5, 39.5, Abilities.KEEN_EYE, Abilities.TANGLED_FEET, Abilities.BIG_PECKS, 479, 83, 80, 75, 70, 70, 101, 45, 70, 240, GrowthRate.MEDIUM_SLOW, 50, false, true, + new PokemonForm("Normal", "", Type.NORMAL, Type.FLYING, 1.5, 39.5, Abilities.KEEN_EYE, Abilities.TANGLED_FEET, Abilities.BIG_PECKS, 479, 83, 80, 75, 70, 70, 101, 45, 70, 240, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.NORMAL, Type.FLYING, 2.2, 50.5, Abilities.NO_GUARD, Abilities.NO_GUARD, Abilities.NO_GUARD, 579, 83, 80, 80, 135, 80, 121, 45, 70, 240), ), new PokemonSpecies(Species.RATTATA, 1, false, false, false, "Mouse Pokémon", Type.NORMAL, null, 0.3, 3.5, Abilities.RUN_AWAY, Abilities.GUTS, Abilities.HUSTLE, 253, 30, 56, 35, 25, 35, 72, 255, 70, 51, GrowthRate.MEDIUM_FAST, 50, true), new PokemonSpecies(Species.RATICATE, 1, false, false, false, "Mouse Pokémon", Type.NORMAL, null, 0.7, 18.5, Abilities.RUN_AWAY, Abilities.GUTS, Abilities.HUSTLE, 413, 55, 81, 60, 50, 70, 97, 127, 70, 145, GrowthRate.MEDIUM_FAST, 50, true), @@ -1108,12 +1223,12 @@ export function initSpecies() { ), new PokemonSpecies(Species.BELLSPROUT, 1, false, false, false, "Flower Pokémon", Type.GRASS, Type.POISON, 0.7, 4, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.GLUTTONY, 300, 50, 75, 35, 70, 30, 40, 255, 70, 60, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.WEEPINBELL, 1, false, false, false, "Flycatcher Pokémon", Type.GRASS, Type.POISON, 1, 6.4, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.GLUTTONY, 390, 65, 90, 50, 85, 45, 55, 120, 70, 137, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.VICTREEBEL, 1, false, false, false, "Flycatcher Pokémon", Type.GRASS, Type.POISON, 1.7, 15.5, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.GLUTTONY, 490, 80, 105, 65, 100, 70, 70, 45, 70, 221, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.VICTREEBEL, 1, false, false, false, "Flycatcher Pokémon", Type.GRASS, Type.POISON, 1.7, 15.5, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.GLUTTONY, 490, 80, 105, 65, 100, 70, 70, 45, 70, 245, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.TENTACOOL, 1, false, false, false, "Jellyfish Pokémon", Type.WATER, Type.POISON, 0.9, 45.5, Abilities.CLEAR_BODY, Abilities.LIQUID_OOZE, Abilities.RAIN_DISH, 335, 40, 40, 35, 50, 100, 70, 190, 50, 67, GrowthRate.SLOW, 50, false), new PokemonSpecies(Species.TENTACRUEL, 1, false, false, false, "Jellyfish Pokémon", Type.WATER, Type.POISON, 1.6, 55, Abilities.CLEAR_BODY, Abilities.LIQUID_OOZE, Abilities.RAIN_DISH, 515, 80, 70, 65, 80, 120, 100, 60, 50, 180, GrowthRate.SLOW, 50, false), new PokemonSpecies(Species.GEODUDE, 1, false, false, false, "Rock Pokémon", Type.ROCK, Type.GROUND, 0.4, 20, Abilities.ROCK_HEAD, Abilities.STURDY, Abilities.SAND_VEIL, 300, 40, 80, 100, 30, 30, 20, 255, 70, 60, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.GRAVELER, 1, false, false, false, "Rock Pokémon", Type.ROCK, Type.GROUND, 1, 105, Abilities.ROCK_HEAD, Abilities.STURDY, Abilities.SAND_VEIL, 390, 55, 95, 115, 45, 45, 35, 120, 70, 137, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.GOLEM, 1, false, false, false, "Megaton Pokémon", Type.ROCK, Type.GROUND, 1.4, 300, Abilities.ROCK_HEAD, Abilities.STURDY, Abilities.SAND_VEIL, 495, 80, 120, 130, 55, 65, 45, 45, 70, 223, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.GOLEM, 1, false, false, false, "Megaton Pokémon", Type.ROCK, Type.GROUND, 1.4, 300, Abilities.ROCK_HEAD, Abilities.STURDY, Abilities.SAND_VEIL, 495, 80, 120, 130, 55, 65, 45, 45, 70, 248, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.PONYTA, 1, false, false, false, "Fire Horse Pokémon", Type.FIRE, null, 1, 30, Abilities.RUN_AWAY, Abilities.FLASH_FIRE, Abilities.FLAME_BODY, 410, 50, 85, 55, 65, 65, 90, 190, 50, 82, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.RAPIDASH, 1, false, false, false, "Fire Horse Pokémon", Type.FIRE, null, 1.7, 95, Abilities.RUN_AWAY, Abilities.FLASH_FIRE, Abilities.FLAME_BODY, 500, 65, 100, 70, 80, 80, 105, 60, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.SLOWPOKE, 1, false, false, false, "Dopey Pokémon", Type.WATER, Type.PSYCHIC, 1.2, 36, Abilities.OBLIVIOUS, Abilities.OWN_TEMPO, Abilities.REGENERATOR, 315, 90, 65, 65, 40, 40, 15, 190, 50, 63, GrowthRate.MEDIUM_FAST, 50, false), @@ -1227,13 +1342,13 @@ export function initSpecies() { new PokemonSpecies(Species.MEW, 1, false, false, true, "New Species Pokémon", Type.PSYCHIC, null, 0.4, 4, Abilities.SYNCHRONIZE, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 45, 100, 300, GrowthRate.MEDIUM_SLOW, null, false), new PokemonSpecies(Species.CHIKORITA, 2, false, false, false, "Leaf Pokémon", Type.GRASS, null, 0.9, 6.4, Abilities.OVERGROW, Abilities.NONE, Abilities.LEAF_GUARD, 318, 45, 49, 65, 49, 65, 45, 45, 70, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.BAYLEEF, 2, false, false, false, "Leaf Pokémon", Type.GRASS, null, 1.2, 15.8, Abilities.OVERGROW, Abilities.NONE, Abilities.LEAF_GUARD, 405, 60, 62, 80, 63, 80, 60, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.MEGANIUM, 2, false, false, false, "Herb Pokémon", Type.GRASS, null, 1.8, 100.5, Abilities.OVERGROW, Abilities.NONE, Abilities.LEAF_GUARD, 525, 80, 82, 100, 83, 100, 80, 45, 70, 236, GrowthRate.MEDIUM_SLOW, 87.5, true), + new PokemonSpecies(Species.MEGANIUM, 2, false, false, false, "Herb Pokémon", Type.GRASS, null, 1.8, 100.5, Abilities.OVERGROW, Abilities.NONE, Abilities.LEAF_GUARD, 525, 80, 82, 100, 83, 100, 80, 45, 70, 263, GrowthRate.MEDIUM_SLOW, 87.5, true), new PokemonSpecies(Species.CYNDAQUIL, 2, false, false, false, "Fire Mouse Pokémon", Type.FIRE, null, 0.5, 7.9, Abilities.BLAZE, Abilities.NONE, Abilities.FLASH_FIRE, 309, 39, 52, 43, 60, 50, 65, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.QUILAVA, 2, false, false, false, "Volcano Pokémon", Type.FIRE, null, 0.9, 19, Abilities.BLAZE, Abilities.NONE, Abilities.FLASH_FIRE, 405, 58, 64, 58, 80, 65, 80, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.TYPHLOSION, 2, false, false, false, "Volcano Pokémon", Type.FIRE, null, 1.7, 79.5, Abilities.BLAZE, Abilities.NONE, Abilities.FLASH_FIRE, 534, 78, 84, 78, 109, 85, 100, 45, 70, 240, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.TYPHLOSION, 2, false, false, false, "Volcano Pokémon", Type.FIRE, null, 1.7, 79.5, Abilities.BLAZE, Abilities.NONE, Abilities.FLASH_FIRE, 534, 78, 84, 78, 109, 85, 100, 45, 70, 267, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.TOTODILE, 2, false, false, false, "Big Jaw Pokémon", Type.WATER, null, 0.6, 9.5, Abilities.TORRENT, Abilities.NONE, Abilities.SHEER_FORCE, 314, 50, 65, 64, 44, 48, 43, 45, 70, 63, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.CROCONAW, 2, false, false, false, "Big Jaw Pokémon", Type.WATER, null, 1.1, 25, Abilities.TORRENT, Abilities.NONE, Abilities.SHEER_FORCE, 405, 65, 80, 80, 59, 63, 58, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.FERALIGATR, 2, false, false, false, "Big Jaw Pokémon", Type.WATER, null, 2.3, 88.8, Abilities.TORRENT, Abilities.NONE, Abilities.SHEER_FORCE, 530, 85, 105, 100, 79, 83, 78, 45, 70, 239, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.FERALIGATR, 2, false, false, false, "Big Jaw Pokémon", Type.WATER, null, 2.3, 88.8, Abilities.TORRENT, Abilities.NONE, Abilities.SHEER_FORCE, 530, 85, 105, 100, 79, 83, 78, 45, 70, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.SENTRET, 2, false, false, false, "Scout Pokémon", Type.NORMAL, null, 0.8, 6, Abilities.RUN_AWAY, Abilities.KEEN_EYE, Abilities.FRISK, 215, 35, 46, 34, 35, 45, 20, 255, 70, 43, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.FURRET, 2, false, false, false, "Long Body Pokémon", Type.NORMAL, null, 1.8, 32.5, Abilities.RUN_AWAY, Abilities.KEEN_EYE, Abilities.FRISK, 415, 85, 76, 64, 45, 55, 90, 90, 70, 145, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.HOOTHOOT, 2, false, false, false, "Owl Pokémon", Type.NORMAL, Type.FLYING, 0.7, 21.2, Abilities.INSOMNIA, Abilities.KEEN_EYE, Abilities.TINTED_LENS, 262, 60, 30, 30, 36, 56, 50, 255, 50, 52, GrowthRate.MEDIUM_FAST, 50, false), @@ -1257,9 +1372,9 @@ export function initSpecies() { new PokemonSpecies(Species.XATU, 2, false, false, false, "Mystic Pokémon", Type.PSYCHIC, Type.FLYING, 1.5, 15, Abilities.SYNCHRONIZE, Abilities.EARLY_BIRD, Abilities.MAGIC_BOUNCE, 470, 65, 75, 70, 95, 70, 95, 75, 50, 165, GrowthRate.MEDIUM_FAST, 50, true), new PokemonSpecies(Species.MAREEP, 2, false, false, false, "Wool Pokémon", Type.ELECTRIC, null, 0.6, 7.8, Abilities.STATIC, Abilities.NONE, Abilities.PLUS, 280, 55, 40, 40, 65, 45, 35, 235, 70, 56, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.FLAAFFY, 2, false, false, false, "Wool Pokémon", Type.ELECTRIC, null, 0.8, 13.3, Abilities.STATIC, Abilities.NONE, Abilities.PLUS, 365, 70, 55, 55, 80, 60, 45, 120, 70, 128, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.AMPHAROS, 2, false, false, false, "Light Pokémon", Type.ELECTRIC, null, 1.4, 61.5, Abilities.STATIC, Abilities.NONE, Abilities.PLUS, 510, 90, 75, 85, 115, 90, 55, 45, 70, 230, GrowthRate.MEDIUM_SLOW, 50, false, true, - new PokemonForm("Normal", "", Type.ELECTRIC, null, 1.4, 61.5, Abilities.STATIC, Abilities.NONE, Abilities.PLUS, 510, 90, 75, 85, 115, 90, 55, 45, 70, 230, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.ELECTRIC, Type.DRAGON, 1.4, 61.5, Abilities.MOLD_BREAKER, Abilities.NONE, Abilities.MOLD_BREAKER, 610, 90, 95, 105, 165, 110, 45, 45, 70, 230), + new PokemonSpecies(Species.AMPHAROS, 2, false, false, false, "Light Pokémon", Type.ELECTRIC, null, 1.4, 61.5, Abilities.STATIC, Abilities.NONE, Abilities.PLUS, 510, 90, 75, 85, 115, 90, 55, 45, 70, 255, GrowthRate.MEDIUM_SLOW, 50, false, true, + new PokemonForm("Normal", "", Type.ELECTRIC, null, 1.4, 61.5, Abilities.STATIC, Abilities.NONE, Abilities.PLUS, 510, 90, 75, 85, 115, 90, 55, 45, 70, 255, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.ELECTRIC, Type.DRAGON, 1.4, 61.5, Abilities.MOLD_BREAKER, Abilities.NONE, Abilities.MOLD_BREAKER, 610, 90, 95, 105, 165, 110, 45, 45, 70, 255), ), new PokemonSpecies(Species.BELLOSSOM, 2, false, false, false, "Flower Pokémon", Type.GRASS, null, 0.4, 5.8, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.HEALER, 490, 75, 80, 95, 90, 100, 50, 45, 50, 245, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.MARILL, 2, false, false, false, "Aqua Mouse Pokémon", Type.WATER, Type.FAIRY, 0.4, 8.5, Abilities.THICK_FAT, Abilities.HUGE_POWER, Abilities.SAP_SIPPER, 250, 70, 20, 50, 20, 50, 40, 190, 50, 88, GrowthRate.FAST, 50, false), @@ -1268,7 +1383,7 @@ export function initSpecies() { new PokemonSpecies(Species.POLITOED, 2, false, false, false, "Frog Pokémon", Type.WATER, null, 1.1, 33.9, Abilities.WATER_ABSORB, Abilities.DAMP, Abilities.DRIZZLE, 500, 90, 75, 75, 90, 100, 70, 45, 50, 250, GrowthRate.MEDIUM_SLOW, 50, true), new PokemonSpecies(Species.HOPPIP, 2, false, false, false, "Cottonweed Pokémon", Type.GRASS, Type.FLYING, 0.4, 0.5, Abilities.CHLOROPHYLL, Abilities.LEAF_GUARD, Abilities.INFILTRATOR, 250, 35, 35, 40, 35, 55, 50, 255, 70, 50, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.SKIPLOOM, 2, false, false, false, "Cottonweed Pokémon", Type.GRASS, Type.FLYING, 0.6, 1, Abilities.CHLOROPHYLL, Abilities.LEAF_GUARD, Abilities.INFILTRATOR, 340, 55, 45, 50, 45, 65, 80, 120, 70, 119, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.JUMPLUFF, 2, false, false, false, "Cottonweed Pokémon", Type.GRASS, Type.FLYING, 0.8, 3, Abilities.CHLOROPHYLL, Abilities.LEAF_GUARD, Abilities.INFILTRATOR, 460, 75, 55, 70, 55, 95, 110, 45, 70, 207, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.JUMPLUFF, 2, false, false, false, "Cottonweed Pokémon", Type.GRASS, Type.FLYING, 0.8, 3, Abilities.CHLOROPHYLL, Abilities.LEAF_GUARD, Abilities.INFILTRATOR, 460, 75, 55, 70, 55, 95, 110, 45, 70, 230, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.AIPOM, 2, false, false, false, "Long Tail Pokémon", Type.NORMAL, null, 0.8, 11.5, Abilities.RUN_AWAY, Abilities.PICKUP, Abilities.SKILL_LINK, 360, 55, 70, 55, 40, 55, 85, 45, 70, 72, GrowthRate.FAST, 50, true), new PokemonSpecies(Species.SUNKERN, 2, false, false, false, "Seed Pokémon", Type.GRASS, null, 0.3, 1.8, Abilities.CHLOROPHYLL, Abilities.SOLAR_POWER, Abilities.EARLY_BIRD, 180, 30, 30, 30, 30, 30, 30, 235, 70, 36, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.SUNFLORA, 2, false, false, false, "Sun Pokémon", Type.GRASS, null, 0.8, 8.5, Abilities.CHLOROPHYLL, Abilities.SOLAR_POWER, Abilities.EARLY_BIRD, 425, 75, 75, 55, 105, 85, 30, 120, 70, 149, GrowthRate.MEDIUM_SLOW, 50, false), @@ -1362,7 +1477,7 @@ export function initSpecies() { new PokemonSpecies(Species.ELEKID, 2, false, false, false, "Electric Pokémon", Type.ELECTRIC, null, 0.6, 23.5, Abilities.STATIC, Abilities.NONE, Abilities.VITAL_SPIRIT, 360, 45, 63, 37, 65, 55, 95, 45, 50, 72, GrowthRate.MEDIUM_FAST, 75, false), new PokemonSpecies(Species.MAGBY, 2, false, false, false, "Live Coal Pokémon", Type.FIRE, null, 0.7, 21.4, Abilities.FLAME_BODY, Abilities.NONE, Abilities.VITAL_SPIRIT, 365, 45, 75, 37, 70, 55, 83, 45, 50, 73, GrowthRate.MEDIUM_FAST, 75, false), new PokemonSpecies(Species.MILTANK, 2, false, false, false, "Milk Cow Pokémon", Type.NORMAL, null, 1.2, 75.5, Abilities.THICK_FAT, Abilities.SCRAPPY, Abilities.SAP_SIPPER, 490, 95, 80, 105, 40, 70, 100, 45, 50, 172, GrowthRate.SLOW, 0, false), - new PokemonSpecies(Species.BLISSEY, 2, false, false, false, "Happiness Pokémon", Type.NORMAL, null, 1.5, 46.8, Abilities.NATURAL_CURE, Abilities.SERENE_GRACE, Abilities.HEALER, 540, 255, 10, 10, 75, 135, 55, 30, 140, 635, GrowthRate.FAST, 0, false), + new PokemonSpecies(Species.BLISSEY, 2, false, false, false, "Happiness Pokémon", Type.NORMAL, null, 1.5, 46.8, Abilities.NATURAL_CURE, Abilities.SERENE_GRACE, Abilities.HEALER, 540, 255, 10, 10, 75, 135, 55, 30, 140, 608, GrowthRate.FAST, 0, false), new PokemonSpecies(Species.RAIKOU, 2, true, false, false, "Thunder Pokémon", Type.ELECTRIC, null, 1.9, 178, Abilities.PRESSURE, Abilities.NONE, Abilities.INNER_FOCUS, 580, 90, 85, 75, 115, 100, 115, 3, 35, 290, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.ENTEI, 2, true, false, false, "Volcano Pokémon", Type.FIRE, null, 2.1, 198, Abilities.PRESSURE, Abilities.NONE, Abilities.INNER_FOCUS, 580, 115, 115, 85, 90, 75, 100, 3, 35, 290, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.SUICUNE, 2, true, false, false, "Aurora Pokémon", Type.WATER, null, 2, 187, Abilities.PRESSURE, Abilities.NONE, Abilities.INNER_FOCUS, 580, 100, 75, 115, 90, 115, 85, 3, 35, 290, GrowthRate.SLOW, null, false), @@ -1399,9 +1514,9 @@ export function initSpecies() { new PokemonSpecies(Species.LINOONE, 3, false, false, false, "Rushing Pokémon", Type.NORMAL, null, 0.5, 32.5, Abilities.PICKUP, Abilities.GLUTTONY, Abilities.QUICK_FEET, 420, 78, 70, 61, 50, 61, 100, 90, 50, 147, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.WURMPLE, 3, false, false, false, "Worm Pokémon", Type.BUG, null, 0.3, 3.6, Abilities.SHIELD_DUST, Abilities.NONE, Abilities.RUN_AWAY, 195, 45, 45, 35, 20, 30, 20, 255, 70, 56, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.SILCOON, 3, false, false, false, "Cocoon Pokémon", Type.BUG, null, 0.6, 10, Abilities.SHED_SKIN, Abilities.NONE, Abilities.SHED_SKIN, 205, 50, 35, 55, 25, 25, 15, 120, 70, 72, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.BEAUTIFLY, 3, false, false, false, "Butterfly Pokémon", Type.BUG, Type.FLYING, 1, 28.4, Abilities.SWARM, Abilities.NONE, Abilities.RIVALRY, 395, 60, 70, 50, 100, 50, 65, 45, 70, 178, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.BEAUTIFLY, 3, false, false, false, "Butterfly Pokémon", Type.BUG, Type.FLYING, 1, 28.4, Abilities.SWARM, Abilities.NONE, Abilities.RIVALRY, 395, 60, 70, 50, 100, 50, 65, 45, 70, 198, GrowthRate.MEDIUM_FAST, 50, true), new PokemonSpecies(Species.CASCOON, 3, false, false, false, "Cocoon Pokémon", Type.BUG, null, 0.7, 11.5, Abilities.SHED_SKIN, Abilities.NONE, Abilities.SHED_SKIN, 205, 50, 35, 55, 25, 25, 15, 120, 70, 72, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.DUSTOX, 3, false, false, false, "Poison Moth Pokémon", Type.BUG, Type.POISON, 1.2, 31.6, Abilities.SHIELD_DUST, Abilities.NONE, Abilities.COMPOUND_EYES, 385, 60, 50, 70, 50, 90, 65, 45, 70, 173, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(Species.DUSTOX, 3, false, false, false, "Poison Moth Pokémon", Type.BUG, Type.POISON, 1.2, 31.6, Abilities.SHIELD_DUST, Abilities.NONE, Abilities.COMPOUND_EYES, 385, 60, 50, 70, 50, 90, 65, 45, 70, 193, GrowthRate.MEDIUM_FAST, 50, true), new PokemonSpecies(Species.LOTAD, 3, false, false, false, "Water Weed Pokémon", Type.WATER, Type.GRASS, 0.5, 2.6, Abilities.SWIFT_SWIM, Abilities.RAIN_DISH, Abilities.OWN_TEMPO, 220, 40, 30, 30, 40, 50, 30, 255, 50, 44, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.LOMBRE, 3, false, false, false, "Jolly Pokémon", Type.WATER, Type.GRASS, 1.2, 32.5, Abilities.SWIFT_SWIM, Abilities.RAIN_DISH, Abilities.OWN_TEMPO, 340, 60, 50, 50, 60, 70, 50, 120, 50, 119, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.LUDICOLO, 3, false, false, false, "Carefree Pokémon", Type.WATER, Type.GRASS, 1.5, 55, Abilities.SWIFT_SWIM, Abilities.RAIN_DISH, Abilities.OWN_TEMPO, 480, 80, 70, 70, 90, 100, 70, 45, 50, 240, GrowthRate.MEDIUM_SLOW, 50, true), @@ -1424,7 +1539,7 @@ export function initSpecies() { new PokemonSpecies(Species.BRELOOM, 3, false, false, false, "Mushroom Pokémon", Type.GRASS, Type.FIGHTING, 1.2, 39.2, Abilities.EFFECT_SPORE, Abilities.POISON_HEAL, Abilities.TECHNICIAN, 460, 60, 130, 80, 60, 60, 70, 90, 70, 161, GrowthRate.FLUCTUATING, 50, false), new PokemonSpecies(Species.SLAKOTH, 3, false, false, false, "Slacker Pokémon", Type.NORMAL, null, 0.8, 24, Abilities.TRUANT, Abilities.NONE, Abilities.STALL, 280, 60, 60, 60, 35, 35, 30, 255, 70, 56, GrowthRate.SLOW, 50, false), //Custom Hidden new PokemonSpecies(Species.VIGOROTH, 3, false, false, false, "Wild Monkey Pokémon", Type.NORMAL, null, 1.4, 46.5, Abilities.VITAL_SPIRIT, Abilities.NONE, Abilities.INSOMNIA, 440, 80, 80, 80, 55, 55, 90, 120, 70, 154, GrowthRate.SLOW, 50, false), //Custom Hidden - new PokemonSpecies(Species.SLAKING, 3, false, false, false, "Lazy Pokémon", Type.NORMAL, null, 2, 130.5, Abilities.TRUANT, Abilities.NONE, Abilities.STALL, 670, 150, 160, 100, 95, 65, 100, 45, 70, 252, GrowthRate.SLOW, 50, false), //Custom Hidden + new PokemonSpecies(Species.SLAKING, 3, false, false, false, "Lazy Pokémon", Type.NORMAL, null, 2, 130.5, Abilities.TRUANT, Abilities.NONE, Abilities.STALL, 670, 150, 160, 100, 95, 65, 100, 45, 70, 285, GrowthRate.SLOW, 50, false), //Custom Hidden new PokemonSpecies(Species.NINCADA, 3, false, false, false, "Trainee Pokémon", Type.BUG, Type.GROUND, 0.5, 5.5, Abilities.COMPOUND_EYES, Abilities.NONE, Abilities.RUN_AWAY, 266, 31, 45, 90, 30, 30, 40, 255, 50, 53, GrowthRate.ERRATIC, 50, false), new PokemonSpecies(Species.NINJASK, 3, false, false, false, "Ninja Pokémon", Type.BUG, Type.FLYING, 0.8, 12, Abilities.SPEED_BOOST, Abilities.NONE, Abilities.INFILTRATOR, 456, 61, 90, 45, 50, 50, 160, 120, 50, 160, GrowthRate.ERRATIC, 50, false), new PokemonSpecies(Species.SHEDINJA, 3, false, false, false, "Shed Pokémon", Type.BUG, Type.GHOST, 0.8, 1.2, Abilities.WONDER_GUARD, Abilities.NONE, Abilities.NONE, 236, 1, 90, 45, 30, 30, 40, 45, 50, 83, GrowthRate.ERRATIC, null, false), @@ -1580,24 +1695,24 @@ export function initSpecies() { new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.DRAGON, Type.FLYING, 10.8, 392, Abilities.DELTA_STREAM, Abilities.NONE, Abilities.NONE, 780, 105, 180, 100, 180, 100, 115, 45, 0, 340), ), new PokemonSpecies(Species.JIRACHI, 3, false, false, true, "Wish Pokémon", Type.STEEL, Type.PSYCHIC, 0.3, 1.1, Abilities.SERENE_GRACE, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 3, 100, 300, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.DEOXYS, 3, false, false, true, "DNA Pokémon", Type.PSYCHIC, null, 1.7, 60.8, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 600, 50, 150, 50, 150, 50, 150, 3, 0, 270, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal Forme", "normal", Type.PSYCHIC, null, 1.7, 60.8, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 600, 50, 150, 50, 150, 50, 150, 3, 0, 270, false, "", true), - new PokemonForm("Attack Forme", "attack", Type.PSYCHIC, null, 1.7, 60.8, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 600, 50, 180, 20, 180, 20, 150, 3, 0, 270), - new PokemonForm("Defense Forme", "defense", Type.PSYCHIC, null, 1.7, 60.8, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 600, 50, 70, 160, 70, 160, 90, 3, 0, 270), - new PokemonForm("Speed Forme", "speed", Type.PSYCHIC, null, 1.7, 60.8, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 600, 50, 95, 90, 95, 90, 180, 3, 0, 270), + new PokemonSpecies(Species.DEOXYS, 3, false, false, true, "DNA Pokémon", Type.PSYCHIC, null, 1.7, 60.8, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 600, 50, 150, 50, 150, 50, 150, 3, 0, 300, GrowthRate.SLOW, null, false, true, + new PokemonForm("Normal Forme", "normal", Type.PSYCHIC, null, 1.7, 60.8, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 600, 50, 150, 50, 150, 50, 150, 3, 0, 300, false, "", true), + new PokemonForm("Attack Forme", "attack", Type.PSYCHIC, null, 1.7, 60.8, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 600, 50, 180, 20, 180, 20, 150, 3, 0, 300), + new PokemonForm("Defense Forme", "defense", Type.PSYCHIC, null, 1.7, 60.8, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 600, 50, 70, 160, 70, 160, 90, 3, 0, 300), + new PokemonForm("Speed Forme", "speed", Type.PSYCHIC, null, 1.7, 60.8, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 600, 50, 95, 90, 95, 90, 180, 3, 0, 300), ), new PokemonSpecies(Species.TURTWIG, 4, false, false, false, "Tiny Leaf Pokémon", Type.GRASS, null, 0.4, 10.2, Abilities.OVERGROW, Abilities.NONE, Abilities.SHELL_ARMOR, 318, 55, 68, 64, 45, 55, 31, 45, 70, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.GROTLE, 4, false, false, false, "Grove Pokémon", Type.GRASS, null, 1.1, 97, Abilities.OVERGROW, Abilities.NONE, Abilities.SHELL_ARMOR, 405, 75, 89, 85, 55, 65, 36, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.TORTERRA, 4, false, false, false, "Continent Pokémon", Type.GRASS, Type.GROUND, 2.2, 310, Abilities.OVERGROW, Abilities.NONE, Abilities.SHELL_ARMOR, 525, 95, 109, 105, 75, 85, 56, 45, 70, 236, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.TORTERRA, 4, false, false, false, "Continent Pokémon", Type.GRASS, Type.GROUND, 2.2, 310, Abilities.OVERGROW, Abilities.NONE, Abilities.SHELL_ARMOR, 525, 95, 109, 105, 75, 85, 56, 45, 70, 263, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.CHIMCHAR, 4, false, false, false, "Chimp Pokémon", Type.FIRE, null, 0.5, 6.2, Abilities.BLAZE, Abilities.NONE, Abilities.IRON_FIST, 309, 44, 58, 44, 58, 44, 61, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.MONFERNO, 4, false, false, false, "Playful Pokémon", Type.FIRE, Type.FIGHTING, 0.9, 22, Abilities.BLAZE, Abilities.NONE, Abilities.IRON_FIST, 405, 64, 78, 52, 78, 52, 81, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.INFERNAPE, 4, false, false, false, "Flame Pokémon", Type.FIRE, Type.FIGHTING, 1.2, 55, Abilities.BLAZE, Abilities.NONE, Abilities.IRON_FIST, 534, 76, 104, 71, 104, 71, 108, 45, 70, 240, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.INFERNAPE, 4, false, false, false, "Flame Pokémon", Type.FIRE, Type.FIGHTING, 1.2, 55, Abilities.BLAZE, Abilities.NONE, Abilities.IRON_FIST, 534, 76, 104, 71, 104, 71, 108, 45, 70, 267, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.PIPLUP, 4, false, false, false, "Penguin Pokémon", Type.WATER, null, 0.4, 5.2, Abilities.TORRENT, Abilities.NONE, Abilities.COMPETITIVE, 314, 53, 51, 53, 61, 56, 40, 45, 70, 63, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.PRINPLUP, 4, false, false, false, "Penguin Pokémon", Type.WATER, null, 0.8, 23, Abilities.TORRENT, Abilities.NONE, Abilities.COMPETITIVE, 405, 64, 66, 68, 81, 76, 50, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.EMPOLEON, 4, false, false, false, "Emperor Pokémon", Type.WATER, Type.STEEL, 1.7, 84.5, Abilities.TORRENT, Abilities.NONE, Abilities.COMPETITIVE, 530, 84, 86, 88, 111, 101, 60, 45, 70, 239, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.EMPOLEON, 4, false, false, false, "Emperor Pokémon", Type.WATER, Type.STEEL, 1.7, 84.5, Abilities.TORRENT, Abilities.NONE, Abilities.COMPETITIVE, 530, 84, 86, 88, 111, 101, 60, 45, 70, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.STARLY, 4, false, false, false, "Starling Pokémon", Type.NORMAL, Type.FLYING, 0.3, 2, Abilities.KEEN_EYE, Abilities.NONE, Abilities.RECKLESS, 245, 40, 55, 30, 30, 30, 60, 255, 70, 49, GrowthRate.MEDIUM_SLOW, 50, true), new PokemonSpecies(Species.STARAVIA, 4, false, false, false, "Starling Pokémon", Type.NORMAL, Type.FLYING, 0.6, 15.5, Abilities.INTIMIDATE, Abilities.NONE, Abilities.RECKLESS, 340, 55, 75, 50, 40, 40, 80, 120, 70, 119, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(Species.STARAPTOR, 4, false, false, false, "Predator Pokémon", Type.NORMAL, Type.FLYING, 1.2, 24.9, Abilities.INTIMIDATE, Abilities.NONE, Abilities.RECKLESS, 485, 85, 120, 70, 50, 60, 100, 45, 70, 218, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(Species.STARAPTOR, 4, false, false, false, "Predator Pokémon", Type.NORMAL, Type.FLYING, 1.2, 24.9, Abilities.INTIMIDATE, Abilities.NONE, Abilities.RECKLESS, 485, 85, 120, 70, 50, 60, 100, 45, 70, 243, GrowthRate.MEDIUM_SLOW, 50, true), new PokemonSpecies(Species.BIDOOF, 4, false, false, false, "Plump Mouse Pokémon", Type.NORMAL, null, 0.5, 20, Abilities.SIMPLE, Abilities.UNAWARE, Abilities.MOODY, 250, 59, 45, 40, 35, 40, 31, 255, 70, 50, GrowthRate.MEDIUM_FAST, 50, true), new PokemonSpecies(Species.BIBAREL, 4, false, false, false, "Beaver Pokémon", Type.NORMAL, Type.WATER, 1, 31.5, Abilities.SIMPLE, Abilities.UNAWARE, Abilities.MOODY, 410, 79, 85, 60, 55, 60, 71, 127, 70, 144, GrowthRate.MEDIUM_FAST, 50, true), new PokemonSpecies(Species.KRICKETOT, 4, false, false, false, "Cricket Pokémon", Type.BUG, null, 0.3, 2.2, Abilities.SHED_SKIN, Abilities.NONE, Abilities.RUN_AWAY, 194, 37, 25, 41, 25, 41, 25, 255, 70, 39, GrowthRate.MEDIUM_SLOW, 50, true), @@ -1712,11 +1827,11 @@ export function initSpecies() { new PokemonSpecies(Species.FROSLASS, 4, false, false, false, "Snow Land Pokémon", Type.ICE, Type.GHOST, 1.3, 26.6, Abilities.SNOW_CLOAK, Abilities.NONE, Abilities.CURSED_BODY, 480, 70, 80, 70, 80, 70, 110, 75, 50, 168, GrowthRate.MEDIUM_FAST, 0, false), new PokemonSpecies(Species.ROTOM, 4, false, false, false, "Plasma Pokémon", Type.ELECTRIC, Type.GHOST, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 440, 50, 50, 77, 95, 77, 91, 45, 50, 154, GrowthRate.MEDIUM_FAST, null, false, false, new PokemonForm("Normal", "", Type.ELECTRIC, Type.GHOST, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 440, 50, 50, 77, 95, 77, 91, 45, 50, 154, false, null, true), - new PokemonForm("Heat", "heat", Type.ELECTRIC, Type.FIRE, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 154, false, null, true), - new PokemonForm("Wash", "wash", Type.ELECTRIC, Type.WATER, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 154, false, null, true), - new PokemonForm("Frost", "frost", Type.ELECTRIC, Type.ICE, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 154, false, null, true), - new PokemonForm("Fan", "fan", Type.ELECTRIC, Type.FLYING, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 154, false, null, true), - new PokemonForm("Mow", "mow", Type.ELECTRIC, Type.GRASS, 0.3, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 154, false, null, true), + new 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, 182, 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, 182, 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, 182, 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, 182, 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, 182, 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), @@ -1736,44 +1851,44 @@ export function initSpecies() { new PokemonForm("Origin Forme", "origin", Type.GHOST, Type.DRAGON, 6.9, 650, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 680, 150, 120, 100, 120, 100, 90, 3, 0, 340), ), new PokemonSpecies(Species.CRESSELIA, 4, true, false, false, "Lunar Pokémon", Type.PSYCHIC, null, 1.5, 85.6, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 580, 120, 70, 110, 75, 120, 85, 3, 100, 300, GrowthRate.SLOW, 0, false), - new PokemonSpecies(Species.PHIONE, 4, false, false, true, "Sea Drifter Pokémon", Type.WATER, null, 0.4, 3.1, Abilities.HYDRATION, Abilities.NONE, Abilities.NONE, 480, 80, 80, 80, 80, 80, 80, 30, 70, 216, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.MANAPHY, 4, false, false, true, "Seafaring Pokémon", Type.WATER, null, 0.3, 1.4, Abilities.HYDRATION, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 3, 70, 270, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.DARKRAI, 4, false, false, true, "Pitch-Black Pokémon", Type.DARK, null, 1.5, 50.5, Abilities.BAD_DREAMS, Abilities.NONE, Abilities.NONE, 600, 70, 90, 90, 135, 90, 125, 3, 0, 270, GrowthRate.SLOW, null, false), - new PokemonSpecies(Species.SHAYMIN, 4, false, false, true, "Gratitude Pokémon", Type.GRASS, null, 0.2, 2.1, Abilities.NATURAL_CURE, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 45, 100, 270, GrowthRate.MEDIUM_SLOW, null, false, true, - new PokemonForm("Land Forme", "land", Type.GRASS, null, 0.2, 2.1, Abilities.NATURAL_CURE, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 45, 100, 270, false, null, true), - new PokemonForm("Sky Forme", "sky", Type.GRASS, Type.FLYING, 0.4, 5.2, Abilities.SERENE_GRACE, Abilities.NONE, Abilities.NONE, 600, 100, 103, 75, 120, 75, 127, 45, 100, 270), + new PokemonSpecies(Species.PHIONE, 4, false, false, true, "Sea Drifter Pokémon", Type.WATER, null, 0.4, 3.1, Abilities.HYDRATION, Abilities.NONE, Abilities.NONE, 480, 80, 80, 80, 80, 80, 80, 30, 70, 240, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.MANAPHY, 4, false, false, true, "Seafaring Pokémon", Type.WATER, null, 0.3, 1.4, Abilities.HYDRATION, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 3, 70, 300, 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, 300, 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, 300, 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, 300, 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, 300), ), - new PokemonSpecies(Species.ARCEUS, 4, false, false, true, "Alpha Pokémon", Type.NORMAL, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "normal", Type.NORMAL, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324, false, null, true), - new PokemonForm("Fighting", "fighting", Type.FIGHTING, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), - new PokemonForm("Flying", "flying", Type.FLYING, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), - new PokemonForm("Poison", "poison", Type.POISON, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), - new PokemonForm("Ground", "ground", Type.GROUND, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), - new PokemonForm("Rock", "rock", Type.ROCK, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), - new PokemonForm("Bug", "bug", Type.BUG, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), - new PokemonForm("Ghost", "ghost", Type.GHOST, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), - new PokemonForm("Steel", "steel", Type.STEEL, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), - new PokemonForm("Fire", "fire", Type.FIRE, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), - new PokemonForm("Water", "water", Type.WATER, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), - new PokemonForm("Grass", "grass", Type.GRASS, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), - new PokemonForm("Electric", "electric", Type.ELECTRIC, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), - new PokemonForm("Psychic", "psychic", Type.PSYCHIC, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), - new PokemonForm("Ice", "ice", Type.ICE, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), - new PokemonForm("Dragon", "dragon", Type.DRAGON, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), - new PokemonForm("Dark", "dark", Type.DARK, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), - new PokemonForm("Fairy", "fairy", Type.FAIRY, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), - new PokemonForm("???", "unknown", Type.UNKNOWN, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 324), + new PokemonSpecies(Species.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, 360, GrowthRate.SLOW, null, false, true, + new PokemonForm("Normal", "normal", Type.NORMAL, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360, false, null, true), + new PokemonForm("Fighting", "fighting", Type.FIGHTING, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Flying", "flying", Type.FLYING, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Poison", "poison", Type.POISON, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Ground", "ground", Type.GROUND, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Rock", "rock", Type.ROCK, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Bug", "bug", Type.BUG, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Ghost", "ghost", Type.GHOST, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Steel", "steel", Type.STEEL, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Fire", "fire", Type.FIRE, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Water", "water", Type.WATER, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Grass", "grass", Type.GRASS, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Electric", "electric", Type.ELECTRIC, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Psychic", "psychic", Type.PSYCHIC, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Ice", "ice", Type.ICE, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Dragon", "dragon", Type.DRAGON, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Dark", "dark", Type.DARK, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Fairy", "fairy", Type.FAIRY, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("???", "unknown", Type.UNKNOWN, null, 3.2, 320, Abilities.MULTITYPE, Abilities.NONE, Abilities.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360, false, null, false, true), ), new PokemonSpecies(Species.VICTINI, 5, false, false, true, "Victory Pokémon", Type.PSYCHIC, Type.FIRE, 0.4, 4, Abilities.VICTORY_STAR, Abilities.NONE, Abilities.NONE, 600, 100, 100, 100, 100, 100, 100, 3, 100, 300, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.SNIVY, 5, false, false, false, "Grass Snake Pokémon", Type.GRASS, null, 0.6, 8.1, Abilities.OVERGROW, Abilities.NONE, Abilities.CONTRARY, 308, 45, 45, 55, 45, 55, 63, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.SERVINE, 5, false, false, false, "Grass Snake Pokémon", Type.GRASS, null, 0.8, 16, Abilities.OVERGROW, Abilities.NONE, Abilities.CONTRARY, 413, 60, 60, 75, 60, 75, 83, 45, 70, 145, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.SERPERIOR, 5, false, false, false, "Regal Pokémon", Type.GRASS, null, 3.3, 63, Abilities.OVERGROW, Abilities.NONE, Abilities.CONTRARY, 528, 75, 75, 95, 75, 95, 113, 45, 70, 238, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.SERPERIOR, 5, false, false, false, "Regal Pokémon", Type.GRASS, null, 3.3, 63, Abilities.OVERGROW, Abilities.NONE, Abilities.CONTRARY, 528, 75, 75, 95, 75, 95, 113, 45, 70, 264, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.TEPIG, 5, false, false, false, "Fire Pig Pokémon", Type.FIRE, null, 0.5, 9.9, Abilities.BLAZE, Abilities.NONE, Abilities.THICK_FAT, 308, 65, 63, 45, 45, 45, 45, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.PIGNITE, 5, false, false, false, "Fire Pig Pokémon", Type.FIRE, Type.FIGHTING, 1, 55.5, Abilities.BLAZE, Abilities.NONE, Abilities.THICK_FAT, 418, 90, 93, 55, 70, 55, 55, 45, 70, 146, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.EMBOAR, 5, false, false, false, "Mega Fire Pig Pokémon", Type.FIRE, Type.FIGHTING, 1.6, 150, Abilities.BLAZE, Abilities.NONE, Abilities.RECKLESS, 528, 110, 123, 65, 100, 65, 65, 45, 70, 238, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.EMBOAR, 5, false, false, false, "Mega Fire Pig Pokémon", Type.FIRE, Type.FIGHTING, 1.6, 150, Abilities.BLAZE, Abilities.NONE, Abilities.RECKLESS, 528, 110, 123, 65, 100, 65, 65, 45, 70, 264, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.OSHAWOTT, 5, false, false, false, "Sea Otter Pokémon", Type.WATER, null, 0.5, 5.9, Abilities.TORRENT, Abilities.NONE, Abilities.SHELL_ARMOR, 308, 55, 55, 45, 63, 45, 45, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.DEWOTT, 5, false, false, false, "Discipline Pokémon", Type.WATER, null, 0.8, 24.5, Abilities.TORRENT, Abilities.NONE, Abilities.SHELL_ARMOR, 413, 75, 75, 60, 83, 60, 60, 45, 70, 145, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.SAMUROTT, 5, false, false, false, "Formidable Pokémon", Type.WATER, null, 1.5, 94.6, Abilities.TORRENT, Abilities.NONE, Abilities.SHELL_ARMOR, 528, 95, 100, 85, 108, 70, 70, 45, 70, 238, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.SAMUROTT, 5, false, false, false, "Formidable Pokémon", Type.WATER, null, 1.5, 94.6, Abilities.TORRENT, Abilities.NONE, Abilities.SHELL_ARMOR, 528, 95, 100, 85, 108, 70, 70, 45, 70, 264, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.PATRAT, 5, false, false, false, "Scout Pokémon", Type.NORMAL, null, 0.5, 11.6, Abilities.RUN_AWAY, Abilities.KEEN_EYE, Abilities.ANALYTIC, 255, 45, 55, 39, 35, 39, 42, 255, 70, 51, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.WATCHOG, 5, false, false, false, "Lookout Pokémon", Type.NORMAL, null, 1.1, 27, Abilities.ILLUMINATE, Abilities.KEEN_EYE, Abilities.ANALYTIC, 420, 60, 85, 69, 60, 69, 77, 255, 70, 147, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.LILLIPUP, 5, false, false, false, "Puppy Pokémon", Type.NORMAL, null, 0.4, 4.1, Abilities.VITAL_SPIRIT, Abilities.PICKUP, Abilities.RUN_AWAY, 275, 45, 60, 45, 25, 45, 55, 255, 50, 55, GrowthRate.MEDIUM_SLOW, 50, false), @@ -1815,7 +1930,7 @@ export function initSpecies() { new PokemonSpecies(Species.SAWK, 5, false, false, false, "Karate Pokémon", Type.FIGHTING, null, 1.4, 51, Abilities.STURDY, Abilities.INNER_FOCUS, Abilities.MOLD_BREAKER, 465, 75, 125, 75, 30, 75, 85, 45, 50, 163, GrowthRate.MEDIUM_FAST, 100, false), new PokemonSpecies(Species.SEWADDLE, 5, false, false, false, "Sewing Pokémon", Type.BUG, Type.GRASS, 0.3, 2.5, Abilities.SWARM, Abilities.CHLOROPHYLL, Abilities.OVERCOAT, 310, 45, 53, 70, 40, 60, 42, 255, 70, 62, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.SWADLOON, 5, false, false, false, "Leaf-Wrapped Pokémon", Type.BUG, Type.GRASS, 0.5, 7.3, Abilities.LEAF_GUARD, Abilities.CHLOROPHYLL, Abilities.OVERCOAT, 380, 55, 63, 90, 50, 80, 42, 120, 70, 133, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(Species.LEAVANNY, 5, false, false, false, "Nurturing Pokémon", Type.BUG, Type.GRASS, 1.2, 20.5, Abilities.SWARM, Abilities.CHLOROPHYLL, Abilities.OVERCOAT, 500, 75, 103, 80, 70, 80, 92, 45, 70, 225, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(Species.LEAVANNY, 5, false, false, false, "Nurturing Pokémon", Type.BUG, Type.GRASS, 1.2, 20.5, Abilities.SWARM, Abilities.CHLOROPHYLL, Abilities.OVERCOAT, 500, 75, 103, 80, 70, 80, 92, 45, 70, 250, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.VENIPEDE, 5, false, false, false, "Centipede Pokémon", Type.BUG, Type.POISON, 0.4, 5.3, Abilities.POISON_POINT, Abilities.SWARM, Abilities.SPEED_BOOST, 260, 30, 45, 59, 30, 39, 57, 255, 50, 52, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.WHIRLIPEDE, 5, false, false, false, "Curlipede Pokémon", Type.BUG, Type.POISON, 1.2, 58.5, Abilities.POISON_POINT, Abilities.SWARM, Abilities.SPEED_BOOST, 360, 40, 55, 99, 40, 79, 47, 120, 50, 126, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.SCOLIPEDE, 5, false, false, false, "Megapede Pokémon", Type.BUG, Type.POISON, 2.5, 200.5, Abilities.POISON_POINT, Abilities.SWARM, Abilities.SPEED_BOOST, 485, 60, 100, 89, 55, 69, 112, 45, 50, 243, GrowthRate.MEDIUM_SLOW, 50, false), @@ -1834,7 +1949,7 @@ export function initSpecies() { new PokemonSpecies(Species.DARUMAKA, 5, false, false, false, "Zen Charm Pokémon", Type.FIRE, null, 0.6, 37.5, Abilities.HUSTLE, Abilities.NONE, Abilities.INNER_FOCUS, 315, 70, 90, 45, 15, 45, 50, 120, 50, 63, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.DARMANITAN, 5, false, false, false, "Blazing Pokémon", Type.FIRE, null, 1.3, 92.9, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.ZEN_MODE, 480, 105, 140, 55, 30, 55, 95, 60, 50, 168, GrowthRate.MEDIUM_SLOW, 50, false, true, new PokemonForm("Standard Mode", "", Type.FIRE, null, 1.3, 92.9, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.ZEN_MODE, 480, 105, 140, 55, 30, 55, 95, 60, 50, 168, false, null, true), - new PokemonForm("Zen Mode", "zen", Type.FIRE, Type.PSYCHIC, 1.3, 92.9, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.ZEN_MODE, 540, 105, 30, 105, 140, 105, 55, 60, 50, 168), + new PokemonForm("Zen Mode", "zen", Type.FIRE, Type.PSYCHIC, 1.3, 92.9, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.ZEN_MODE, 540, 105, 30, 105, 140, 105, 55, 60, 50, 189), ), new PokemonSpecies(Species.MARACTUS, 5, false, false, false, "Cactus Pokémon", Type.GRASS, null, 1, 28, Abilities.WATER_ABSORB, Abilities.CHLOROPHYLL, Abilities.STORM_DRAIN, 461, 75, 86, 67, 106, 67, 60, 255, 50, 161, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.DWEBBLE, 5, false, false, false, "Rock Inn Pokémon", Type.BUG, Type.ROCK, 0.3, 14.5, Abilities.STURDY, Abilities.SHELL_ARMOR, Abilities.WEAK_ARMOR, 325, 50, 65, 85, 35, 35, 55, 190, 50, 65, GrowthRate.MEDIUM_FAST, 50, false), @@ -1897,7 +2012,7 @@ export function initSpecies() { new PokemonSpecies(Species.KLINKLANG, 5, false, false, false, "Gear Pokémon", Type.STEEL, null, 0.6, 81, Abilities.PLUS, Abilities.MINUS, Abilities.CLEAR_BODY, 520, 60, 100, 115, 70, 85, 90, 30, 50, 260, GrowthRate.MEDIUM_SLOW, null, false), new PokemonSpecies(Species.TYNAMO, 5, false, false, false, "EleFish Pokémon", Type.ELECTRIC, null, 0.2, 0.3, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 275, 35, 55, 40, 45, 40, 60, 190, 70, 55, GrowthRate.SLOW, 50, false), new PokemonSpecies(Species.EELEKTRIK, 5, false, false, false, "EleFish Pokémon", Type.ELECTRIC, null, 1.2, 22, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 405, 65, 85, 70, 75, 70, 40, 60, 70, 142, GrowthRate.SLOW, 50, false), - new PokemonSpecies(Species.EELEKTROSS, 5, false, false, false, "EleFish Pokémon", Type.ELECTRIC, null, 2.1, 80.5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 515, 85, 115, 80, 105, 80, 50, 30, 70, 232, GrowthRate.SLOW, 50, false), + new PokemonSpecies(Species.EELEKTROSS, 5, false, false, false, "EleFish Pokémon", Type.ELECTRIC, null, 2.1, 80.5, Abilities.LEVITATE, Abilities.NONE, Abilities.NONE, 515, 85, 115, 80, 105, 80, 50, 30, 70, 258, GrowthRate.SLOW, 50, false), new PokemonSpecies(Species.ELGYEM, 5, false, false, false, "Cerebral Pokémon", Type.PSYCHIC, null, 0.5, 9, Abilities.TELEPATHY, Abilities.SYNCHRONIZE, Abilities.ANALYTIC, 335, 55, 55, 55, 85, 55, 30, 255, 50, 67, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.BEHEEYEM, 5, false, false, false, "Cerebral Pokémon", Type.PSYCHIC, null, 1, 34.5, Abilities.TELEPATHY, Abilities.SYNCHRONIZE, Abilities.ANALYTIC, 485, 75, 75, 75, 125, 95, 40, 90, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.LITWICK, 5, false, false, false, "Candle Pokémon", Type.GHOST, Type.FIRE, 0.3, 3.1, Abilities.FLASH_FIRE, Abilities.FLAME_BODY, Abilities.INFILTRATOR, 275, 50, 30, 55, 65, 55, 20, 190, 50, 55, GrowthRate.MEDIUM_SLOW, 50, false), @@ -1950,16 +2065,16 @@ export function initSpecies() { ), new PokemonSpecies(Species.KYUREM, 5, false, true, false, "Boundary Pokémon", Type.DRAGON, Type.ICE, 3, 325, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 660, 125, 130, 90, 130, 90, 95, 3, 0, 330, GrowthRate.SLOW, null, false, true, new PokemonForm("Normal", "", Type.DRAGON, Type.ICE, 3, 325, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 660, 125, 130, 90, 130, 90, 95, 3, 0, 330, false, null, true), - new PokemonForm("Black", "black", Type.DRAGON, Type.ICE, 3.3, 325, Abilities.TERAVOLT, Abilities.NONE, Abilities.NONE, 700, 125, 170, 100, 120, 90, 95, 3, 0, 330), - new PokemonForm("White", "white", Type.DRAGON, Type.ICE, 3.6, 325, Abilities.TURBOBLAZE, Abilities.NONE, Abilities.NONE, 700, 125, 120, 90, 170, 100, 95, 3, 0, 330), + new PokemonForm("Black", "black", Type.DRAGON, Type.ICE, 3.3, 325, Abilities.TERAVOLT, Abilities.NONE, Abilities.NONE, 700, 125, 170, 100, 120, 90, 95, 3, 0, 350), + new PokemonForm("White", "white", Type.DRAGON, Type.ICE, 3.6, 325, Abilities.TURBOBLAZE, Abilities.NONE, Abilities.NONE, 700, 125, 120, 90, 170, 100, 95, 3, 0, 350), ), new PokemonSpecies(Species.KELDEO, 5, false, false, true, "Colt Pokémon", Type.WATER, Type.FIGHTING, 1.4, 48.5, Abilities.JUSTIFIED, Abilities.NONE, Abilities.NONE, 580, 91, 72, 90, 129, 90, 108, 3, 35, 290, GrowthRate.SLOW, null, false, true, new PokemonForm("Ordinary Form", "ordinary", Type.WATER, Type.FIGHTING, 1.4, 48.5, Abilities.JUSTIFIED, Abilities.NONE, Abilities.NONE, 580, 91, 72, 90, 129, 90, 108, 3, 35, 290, false, null, true), new PokemonForm("Resolute", "resolute", Type.WATER, Type.FIGHTING, 1.4, 48.5, Abilities.JUSTIFIED, Abilities.NONE, Abilities.NONE, 580, 91, 72, 90, 129, 90, 108, 3, 35, 290), ), - new PokemonSpecies(Species.MELOETTA, 5, false, false, true, "Melody Pokémon", Type.NORMAL, Type.PSYCHIC, 0.6, 6.5, Abilities.SERENE_GRACE, Abilities.NONE, Abilities.NONE, 600, 100, 77, 77, 128, 128, 90, 3, 100, 270, GrowthRate.SLOW, null, false, true, - new PokemonForm("Aria Forme", "aria", Type.NORMAL, Type.PSYCHIC, 0.6, 6.5, Abilities.SERENE_GRACE, Abilities.NONE, Abilities.NONE, 600, 100, 77, 77, 128, 128, 90, 3, 100, 270, false, null, true), - new PokemonForm("Pirouette Forme", "pirouette", Type.NORMAL, Type.FIGHTING, 0.6, 6.5, Abilities.SERENE_GRACE, Abilities.NONE, Abilities.NONE, 600, 100, 128, 90, 77, 77, 128, 3, 100, 270, false, null, true), + new PokemonSpecies(Species.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, 300, GrowthRate.SLOW, null, false, true, + new PokemonForm("Aria Forme", "aria", Type.NORMAL, Type.PSYCHIC, 0.6, 6.5, Abilities.SERENE_GRACE, Abilities.NONE, Abilities.NONE, 600, 100, 77, 77, 128, 128, 90, 3, 100, 300, 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, 300, false, null, true), ), new PokemonSpecies(Species.GENESECT, 5, false, false, true, "Paleozoic Pokémon", Type.BUG, Type.STEEL, 1.5, 82.5, Abilities.DOWNLOAD, Abilities.NONE, Abilities.NONE, 600, 71, 120, 95, 120, 95, 99, 3, 0, 300, GrowthRate.SLOW, null, false, true, new PokemonForm("Normal", "", Type.BUG, Type.STEEL, 1.5, 82.5, Abilities.DOWNLOAD, Abilities.NONE, Abilities.NONE, 600, 71, 120, 95, 120, 95, 99, 3, 0, 300, false, null, true), @@ -1970,10 +2085,10 @@ export function initSpecies() { ), new PokemonSpecies(Species.CHESPIN, 6, false, false, false, "Spiny Nut Pokémon", Type.GRASS, null, 0.4, 9, Abilities.OVERGROW, Abilities.NONE, Abilities.BULLETPROOF, 313, 56, 61, 65, 48, 45, 38, 45, 70, 63, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.QUILLADIN, 6, false, false, false, "Spiny Armor Pokémon", Type.GRASS, null, 0.7, 29, Abilities.OVERGROW, Abilities.NONE, Abilities.BULLETPROOF, 405, 61, 78, 95, 56, 58, 57, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.CHESNAUGHT, 6, false, false, false, "Spiny Armor Pokémon", Type.GRASS, Type.FIGHTING, 1.6, 90, Abilities.OVERGROW, Abilities.NONE, Abilities.BULLETPROOF, 530, 88, 107, 122, 74, 75, 64, 45, 70, 239, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.CHESNAUGHT, 6, false, false, false, "Spiny Armor Pokémon", Type.GRASS, Type.FIGHTING, 1.6, 90, Abilities.OVERGROW, Abilities.NONE, Abilities.BULLETPROOF, 530, 88, 107, 122, 74, 75, 64, 45, 70, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.FENNEKIN, 6, false, false, false, "Fox Pokémon", Type.FIRE, null, 0.4, 9.4, Abilities.BLAZE, Abilities.NONE, Abilities.MAGICIAN, 307, 40, 45, 40, 62, 60, 60, 45, 70, 61, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.BRAIXEN, 6, false, false, false, "Fox Pokémon", Type.FIRE, null, 1, 14.5, Abilities.BLAZE, Abilities.NONE, Abilities.MAGICIAN, 409, 59, 59, 58, 90, 70, 73, 45, 70, 143, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(Species.DELPHOX, 6, false, false, false, "Fox Pokémon", Type.FIRE, Type.PSYCHIC, 1.5, 39, Abilities.BLAZE, Abilities.NONE, Abilities.MAGICIAN, 534, 75, 69, 72, 114, 100, 104, 45, 70, 240, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(Species.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, 267, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.FROAKIE, 6, false, false, false, "Bubble Frog Pokémon", Type.WATER, null, 0.3, 7, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 314, 41, 56, 40, 62, 44, 71, 45, 70, 63, GrowthRate.MEDIUM_SLOW, 87.5, false, false, new PokemonForm("Normal", "", Type.WATER, null, 0.3, 7, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 314, 41, 56, 40, 62, 44, 71, 45, 70, 63, false, null, true), new PokemonForm("Battle Bond", "battle-bond", Type.WATER, null, 0.3, 7, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 314, 41, 56, 40, 62, 44, 71, 45, 70, 63, false, "", true), @@ -1982,10 +2097,10 @@ export function initSpecies() { new PokemonForm("Normal", "", Type.WATER, null, 0.6, 10.9, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 405, 54, 63, 52, 83, 56, 97, 45, 70, 142, false, null, true), new PokemonForm("Battle Bond", "battle-bond", Type.WATER, null, 0.6, 10.9, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 405, 54, 63, 52, 83, 56, 97, 45, 70, 142, false, "", true), ), - new PokemonSpecies(Species.GRENINJA, 6, false, false, false, "Ninja Pokémon", Type.WATER, Type.DARK, 1.5, 40, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 530, 72, 95, 67, 103, 71, 122, 45, 70, 239, GrowthRate.MEDIUM_SLOW, 87.5, false, false, - new PokemonForm("Normal", "", Type.WATER, Type.DARK, 1.5, 40, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 530, 72, 95, 67, 103, 71, 122, 45, 70, 239, false, null, true), - new PokemonForm("Battle Bond", "battle-bond", Type.WATER, Type.DARK, 1.5, 40, Abilities.BATTLE_BOND, Abilities.NONE, Abilities.BATTLE_BOND, 530, 72, 95, 67, 103, 71, 122, 45, 70, 239, false, "", true), - new PokemonForm("Ash", "ash", Type.WATER, Type.DARK, 1.5, 40, Abilities.BATTLE_BOND, Abilities.NONE, Abilities.BATTLE_BOND, 640, 72, 145, 67, 153, 71, 132, 45, 70, 239), + new PokemonSpecies(Species.GRENINJA, 6, false, false, false, "Ninja Pokémon", Type.WATER, Type.DARK, 1.5, 40, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 530, 72, 95, 67, 103, 71, 122, 45, 70, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, false, + new PokemonForm("Normal", "", Type.WATER, Type.DARK, 1.5, 40, Abilities.TORRENT, Abilities.NONE, Abilities.PROTEAN, 530, 72, 95, 67, 103, 71, 122, 45, 70, 265, false, null, true), + new PokemonForm("Battle Bond", "battle-bond", Type.WATER, Type.DARK, 1.5, 40, Abilities.BATTLE_BOND, Abilities.NONE, Abilities.BATTLE_BOND, 530, 72, 95, 67, 103, 71, 122, 45, 70, 265, false, "", true), + new PokemonForm("Ash", "ash", Type.WATER, Type.DARK, 1.5, 40, Abilities.BATTLE_BOND, Abilities.NONE, Abilities.BATTLE_BOND, 640, 72, 145, 67, 153, 71, 132, 45, 70, 265), ), new PokemonSpecies(Species.BUNNELBY, 6, false, false, false, "Digging Pokémon", Type.NORMAL, null, 0.4, 5, Abilities.PICKUP, Abilities.CHEEK_POUCH, Abilities.HUGE_POWER, 237, 38, 36, 38, 32, 36, 57, 255, 50, 47, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.DIGGERSBY, 6, false, false, false, "Digging Pokémon", Type.NORMAL, Type.GROUND, 1, 42.4, Abilities.PICKUP, Abilities.CHEEK_POUCH, Abilities.HUGE_POWER, 423, 85, 56, 77, 50, 77, 78, 127, 50, 148, GrowthRate.MEDIUM_FAST, 50, false), @@ -2036,27 +2151,27 @@ export function initSpecies() { new PokemonForm("Fancy Pattern", "fancy", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), new PokemonForm("Poké Ball Pattern", "poke-ball", Type.BUG, null, 0.3, 8.4, Abilities.SHED_SKIN, Abilities.NONE, Abilities.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), ), - new PokemonSpecies(Species.VIVILLON, 6, false, false, false, "Scale Pokémon", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Meadow Pattern", "meadow", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("Icy Snow Pattern", "icy-snow", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("Polar Pattern", "polar", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("Tundra Pattern", "tundra", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("Continental Pattern", "continental", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("Garden Pattern", "garden", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("Elegant Pattern", "elegant", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("Modern Pattern", "modern", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("Marine Pattern", "marine", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("Archipelago Pattern", "archipelago", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("High Plains Pattern", "high-plains", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("Sandstorm Pattern", "sandstorm", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("River Pattern", "river", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("Monsoon Pattern", "monsoon", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("Savanna Pattern", "savanna", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("Sun Pattern", "sun", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("Ocean Pattern", "ocean", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("Jungle Pattern", "jungle", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("Fancy Pattern", "fancy", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), - new PokemonForm("Poké Ball Pattern", "poke-ball", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 185, false, null, true), + new PokemonSpecies(Species.VIVILLON, 6, false, false, false, "Scale Pokémon", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Meadow Pattern", "meadow", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Icy Snow Pattern", "icy-snow", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Polar Pattern", "polar", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Tundra Pattern", "tundra", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Continental Pattern", "continental", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Garden Pattern", "garden", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Elegant Pattern", "elegant", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Modern Pattern", "modern", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Marine Pattern", "marine", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Archipelago Pattern", "archipelago", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("High Plains Pattern", "high-plains", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Sandstorm Pattern", "sandstorm", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("River Pattern", "river", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Monsoon Pattern", "monsoon", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Savanna Pattern", "savanna", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Sun Pattern", "sun", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Ocean Pattern", "ocean", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Jungle Pattern", "jungle", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Fancy Pattern", "fancy", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Poké Ball Pattern", "poke-ball", Type.BUG, Type.FLYING, 1.2, 17, Abilities.SHIELD_DUST, Abilities.COMPOUND_EYES, Abilities.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), ), new PokemonSpecies(Species.LITLEO, 6, false, false, false, "Lion Cub Pokémon", Type.FIRE, Type.NORMAL, 0.6, 13.5, Abilities.RIVALRY, Abilities.UNNERVE, Abilities.MOXIE, 369, 62, 50, 58, 73, 54, 72, 220, 70, 74, GrowthRate.MEDIUM_SLOW, 12.5, false), new PokemonSpecies(Species.PYROAR, 6, false, false, false, "Royal Pokémon", Type.FIRE, Type.NORMAL, 1.5, 81.5, Abilities.RIVALRY, Abilities.UNNERVE, Abilities.MOXIE, 507, 86, 68, 72, 109, 66, 106, 65, 70, 177, GrowthRate.MEDIUM_SLOW, 12.5, true), @@ -2074,12 +2189,12 @@ export function initSpecies() { new PokemonForm("Blue Flower", "blue", Type.FAIRY, null, 0.2, 0.9, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 371, 54, 45, 47, 75, 98, 52, 120, 70, 130, false, null, true), new PokemonForm("White Flower", "white", Type.FAIRY, null, 0.2, 0.9, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 371, 54, 45, 47, 75, 98, 52, 120, 70, 130, false, null, true), ), - new PokemonSpecies(Species.FLORGES, 6, false, false, false, "Garden Pokémon", Type.FAIRY, null, 1.1, 10, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 248, GrowthRate.MEDIUM_FAST, 0, false, false, - new PokemonForm("Red Flower", "red", Type.FAIRY, null, 1.1, 10, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 248, false, null, true), - new PokemonForm("Yellow Flower", "yellow", Type.FAIRY, null, 1.1, 10, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 248, false, null, true), - new PokemonForm("Orange Flower", "orange", Type.FAIRY, null, 1.1, 10, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 248, false, null, true), - new PokemonForm("Blue Flower", "blue", Type.FAIRY, null, 1.1, 10, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 248, false, null, true), - new PokemonForm("White Flower", "white", Type.FAIRY, null, 1.1, 10, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 248, false, null, true), + new PokemonSpecies(Species.FLORGES, 6, false, false, false, "Garden Pokémon", Type.FAIRY, null, 1.1, 10, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 276, GrowthRate.MEDIUM_FAST, 0, false, false, + new PokemonForm("Red Flower", "red", Type.FAIRY, null, 1.1, 10, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 276, false, null, true), + new PokemonForm("Yellow Flower", "yellow", Type.FAIRY, null, 1.1, 10, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 276, false, null, true), + new PokemonForm("Orange Flower", "orange", Type.FAIRY, null, 1.1, 10, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 276, false, null, true), + new PokemonForm("Blue Flower", "blue", Type.FAIRY, null, 1.1, 10, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 276, false, null, true), + new PokemonForm("White Flower", "white", Type.FAIRY, null, 1.1, 10, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 276, false, null, true), ), new PokemonSpecies(Species.SKIDDO, 6, false, false, false, "Mount Pokémon", Type.GRASS, null, 0.9, 31, Abilities.SAP_SIPPER, Abilities.NONE, Abilities.GRASS_PELT, 350, 66, 65, 48, 62, 57, 52, 200, 70, 70, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.GOGOAT, 6, false, false, false, "Mount Pokémon", Type.GRASS, null, 1.7, 91, Abilities.SAP_SIPPER, Abilities.NONE, Abilities.GRASS_PELT, 531, 123, 100, 62, 97, 81, 68, 45, 70, 186, GrowthRate.MEDIUM_FAST, 50, false), @@ -2159,19 +2274,19 @@ export function initSpecies() { new PokemonSpecies(Species.YVELTAL, 6, false, true, false, "Destruction Pokémon", Type.DARK, Type.FLYING, 5.8, 203, Abilities.DARK_AURA, Abilities.NONE, Abilities.NONE, 680, 126, 131, 95, 131, 98, 99, 45, 0, 340, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.ZYGARDE, 6, false, true, false, "Order Pokémon", Type.DRAGON, Type.GROUND, 5, 305, Abilities.AURA_BREAK, Abilities.NONE, Abilities.NONE, 600, 108, 100, 121, 81, 95, 95, 3, 0, 300, GrowthRate.SLOW, null, false, false, new PokemonForm("50% Forme", "50", Type.DRAGON, Type.GROUND, 5, 305, Abilities.AURA_BREAK, Abilities.NONE, Abilities.NONE, 600, 108, 100, 121, 81, 95, 95, 3, 0, 300, false, "", true), - new PokemonForm("10% Forme", "10", Type.DRAGON, Type.GROUND, 1.2, 33.5, Abilities.AURA_BREAK, Abilities.NONE, Abilities.NONE, 486, 54, 100, 71, 61, 85, 115, 3, 0, 300, false, null, true), + new PokemonForm("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, 243, false, null, true), new PokemonForm("50% Forme Power Construct", "50-pc", Type.DRAGON, Type.GROUND, 5, 305, Abilities.POWER_CONSTRUCT, Abilities.NONE, Abilities.NONE, 600, 108, 100, 121, 81, 95, 95, 3, 0, 300, false, "", true), - new PokemonForm("10% Forme Power Construct", "10-pc", Type.DRAGON, Type.GROUND, 1.2, 33.5, Abilities.POWER_CONSTRUCT, Abilities.NONE, Abilities.NONE, 486, 54, 100, 71, 61, 85, 115, 3, 0, 300, false, "10", true), - new PokemonForm("Complete Forme (50% PC)", "complete", Type.DRAGON, Type.GROUND, 4.5, 610, Abilities.POWER_CONSTRUCT, Abilities.NONE, Abilities.NONE, 708, 216, 100, 121, 91, 95, 85, 3, 0, 300), - new PokemonForm("Complete Forme (10% PC)", "10-complete", Type.DRAGON, Type.GROUND, 4.5, 610, Abilities.POWER_CONSTRUCT, Abilities.NONE, Abilities.NONE, 708, 216, 100, 121, 91, 95, 85, 3, 0, 300, false, "complete"), + new 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, 243, false, "10", true), + new PokemonForm("Complete Forme (50% PC)", "complete", Type.DRAGON, Type.GROUND, 4.5, 610, Abilities.POWER_CONSTRUCT, Abilities.NONE, Abilities.NONE, 708, 216, 100, 121, 91, 95, 85, 3, 0, 354), + new PokemonForm("Complete Forme (10% PC)", "10-complete", Type.DRAGON, Type.GROUND, 4.5, 610, Abilities.POWER_CONSTRUCT, Abilities.NONE, Abilities.NONE, 708, 216, 100, 121, 91, 95, 85, 3, 0, 354, false, "complete"), ), new PokemonSpecies(Species.DIANCIE, 6, false, false, true, "Jewel Pokémon", Type.ROCK, Type.FAIRY, 0.7, 8.8, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.NONE, 600, 50, 100, 150, 100, 150, 50, 3, 50, 300, GrowthRate.SLOW, null, false, true, new PokemonForm("Normal", "", Type.ROCK, Type.FAIRY, 0.7, 8.8, Abilities.CLEAR_BODY, Abilities.NONE, Abilities.NONE, 600, 50, 100, 150, 100, 150, 50, 3, 50, 300, false, null, true), new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.ROCK, Type.FAIRY, 1.1, 27.8, Abilities.MAGIC_BOUNCE, Abilities.NONE, Abilities.NONE, 700, 50, 160, 110, 160, 110, 110, 3, 50, 300), ), - new PokemonSpecies(Species.HOOPA, 6, false, false, true, "Mischief Pokémon", Type.PSYCHIC, Type.GHOST, 0.5, 9, Abilities.MAGICIAN, Abilities.NONE, Abilities.NONE, 600, 80, 110, 60, 150, 130, 70, 3, 100, 270, GrowthRate.SLOW, null, false, false, - new PokemonForm("Hoopa Confined", "", Type.PSYCHIC, Type.GHOST, 0.5, 9, Abilities.MAGICIAN, Abilities.NONE, Abilities.NONE, 600, 80, 110, 60, 150, 130, 70, 3, 100, 270, false, null, true), - new PokemonForm("Hoopa Unbound", "unbound", Type.PSYCHIC, Type.DARK, 6.5, 490, Abilities.MAGICIAN, Abilities.NONE, Abilities.NONE, 680, 80, 160, 60, 170, 130, 80, 3, 100, 270), + new PokemonSpecies(Species.HOOPA, 6, false, false, true, "Mischief Pokémon", Type.PSYCHIC, Type.GHOST, 0.5, 9, Abilities.MAGICIAN, Abilities.NONE, Abilities.NONE, 600, 80, 110, 60, 150, 130, 70, 3, 100, 300, GrowthRate.SLOW, null, false, false, + new PokemonForm("Hoopa Confined", "", Type.PSYCHIC, Type.GHOST, 0.5, 9, Abilities.MAGICIAN, Abilities.NONE, Abilities.NONE, 600, 80, 110, 60, 150, 130, 70, 3, 100, 300, false, null, true), + new PokemonForm("Hoopa Unbound", "unbound", Type.PSYCHIC, Type.DARK, 6.5, 490, Abilities.MAGICIAN, Abilities.NONE, Abilities.NONE, 680, 80, 160, 60, 170, 130, 80, 3, 100, 340), ), new PokemonSpecies(Species.VOLCANION, 6, false, false, true, "Steam Pokémon", Type.FIRE, Type.WATER, 1.7, 195, Abilities.WATER_ABSORB, Abilities.NONE, Abilities.NONE, 600, 80, 110, 120, 130, 90, 70, 3, 100, 300, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.ROWLET, 7, false, false, false, "Grass Quill Pokémon", Type.GRASS, Type.FLYING, 0.3, 1.5, Abilities.OVERGROW, Abilities.NONE, Abilities.LONG_REACH, 320, 68, 55, 55, 50, 50, 42, 45, 50, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), @@ -2185,7 +2300,7 @@ export function initSpecies() { new PokemonSpecies(Species.PRIMARINA, 7, false, false, false, "Soloist Pokémon", Type.WATER, Type.FAIRY, 1.8, 44, Abilities.TORRENT, Abilities.NONE, Abilities.LIQUID_VOICE, 530, 80, 74, 74, 126, 116, 60, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.PIKIPEK, 7, false, false, false, "Woodpecker Pokémon", Type.NORMAL, Type.FLYING, 0.3, 1.2, Abilities.KEEN_EYE, Abilities.SKILL_LINK, Abilities.PICKUP, 265, 35, 75, 30, 30, 30, 65, 255, 70, 53, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.TRUMBEAK, 7, false, false, false, "Bugle Beak Pokémon", Type.NORMAL, Type.FLYING, 0.6, 14.8, Abilities.KEEN_EYE, Abilities.SKILL_LINK, Abilities.PICKUP, 355, 55, 85, 50, 40, 50, 75, 120, 70, 124, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.TOUCANNON, 7, false, false, false, "Cannon Pokémon", Type.NORMAL, Type.FLYING, 1.1, 26, Abilities.KEEN_EYE, Abilities.SKILL_LINK, Abilities.SHEER_FORCE, 485, 80, 120, 75, 75, 75, 60, 45, 70, 218, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.TOUCANNON, 7, false, false, false, "Cannon Pokémon", Type.NORMAL, Type.FLYING, 1.1, 26, Abilities.KEEN_EYE, Abilities.SKILL_LINK, Abilities.SHEER_FORCE, 485, 80, 120, 75, 75, 75, 60, 45, 70, 243, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.YUNGOOS, 7, false, false, false, "Loitering Pokémon", Type.NORMAL, null, 0.4, 6, Abilities.STAKEOUT, Abilities.STRONG_JAW, Abilities.ADAPTABILITY, 253, 48, 70, 30, 30, 30, 45, 255, 70, 51, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.GUMSHOOS, 7, false, false, false, "Stakeout Pokémon", Type.NORMAL, null, 0.7, 14.2, Abilities.STAKEOUT, Abilities.STRONG_JAW, Abilities.ADAPTABILITY, 418, 88, 110, 60, 55, 60, 45, 127, 70, 146, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.GRUBBIN, 7, false, false, false, "Larva Pokémon", Type.BUG, null, 0.4, 4.4, Abilities.SWARM, Abilities.NONE, Abilities.NONE, 300, 47, 62, 45, 55, 45, 46, 255, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), @@ -2212,7 +2327,7 @@ export function initSpecies() { ), new PokemonSpecies(Species.WISHIWASHI, 7, false, false, false, "Small Fry Pokémon", Type.WATER, null, 0.2, 0.3, Abilities.SCHOOLING, Abilities.NONE, Abilities.NONE, 175, 45, 20, 20, 25, 25, 40, 60, 50, 61, GrowthRate.FAST, 50, false, false, new PokemonForm("Solo Form", "", Type.WATER, null, 0.2, 0.3, Abilities.SCHOOLING, Abilities.NONE, Abilities.NONE, 175, 45, 20, 20, 25, 25, 40, 60, 50, 61, false, null, true), - new PokemonForm("School", "school", Type.WATER, null, 8.2, 78.6, Abilities.SCHOOLING, Abilities.NONE, Abilities.NONE, 620, 45, 140, 130, 140, 135, 30, 60, 50, 61), + new PokemonForm("School", "school", Type.WATER, null, 8.2, 78.6, Abilities.SCHOOLING, Abilities.NONE, Abilities.NONE, 620, 45, 140, 130, 140, 135, 30, 60, 50, 217), ), new PokemonSpecies(Species.MAREANIE, 7, false, false, false, "Brutal Star Pokémon", Type.POISON, Type.WATER, 0.4, 8, Abilities.MERCILESS, Abilities.LIMBER, Abilities.REGENERATOR, 305, 50, 53, 62, 43, 52, 45, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.TOXAPEX, 7, false, false, false, "Brutal Star Pokémon", Type.POISON, Type.WATER, 0.7, 14.5, Abilities.MERCILESS, Abilities.LIMBER, Abilities.REGENERATOR, 495, 50, 63, 152, 53, 142, 35, 75, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), @@ -2268,13 +2383,13 @@ export function initSpecies() { 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 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, 175, 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, 175, 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, 175, 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, 175, 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, 175, 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, 175, 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, 175, 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), @@ -2306,9 +2421,9 @@ export function initSpecies() { new PokemonSpecies(Species.GUZZLORD, 7, true, false, false, "Junkivore Pokémon", Type.DARK, Type.DRAGON, 5.5, 888, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 223, 101, 53, 97, 53, 43, 45, 0, 285, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.NECROZMA, 7, false, true, false, "Prism Pokémon", Type.PSYCHIC, null, 2.4, 230, Abilities.PRISM_ARMOR, Abilities.NONE, Abilities.NONE, 600, 97, 107, 101, 127, 89, 79, 255, 0, 300, GrowthRate.SLOW, null, false, false, new PokemonForm("Normal", "", Type.PSYCHIC, null, 2.4, 230, Abilities.PRISM_ARMOR, Abilities.NONE, Abilities.NONE, 600, 97, 107, 101, 127, 89, 79, 255, 0, 300, false, null, true), - new PokemonForm("Dusk Mane", "dusk-mane", Type.PSYCHIC, Type.STEEL, 3.8, 460, Abilities.PRISM_ARMOR, Abilities.NONE, Abilities.NONE, 680, 97, 157, 127, 113, 109, 77, 255, 0, 300), - new PokemonForm("Dawn Wings", "dawn-wings", Type.PSYCHIC, Type.GHOST, 4.2, 350, Abilities.PRISM_ARMOR, Abilities.NONE, Abilities.NONE, 680, 97, 113, 109, 157, 127, 77, 255, 0, 300), - new PokemonForm("Ultra", "ultra", Type.PSYCHIC, Type.DRAGON, 7.5, 230, Abilities.NEUROFORCE, Abilities.NONE, Abilities.NONE, 754, 97, 167, 97, 167, 97, 129, 255, 0, 300), + new PokemonForm("Dusk Mane", "dusk-mane", Type.PSYCHIC, Type.STEEL, 3.8, 460, Abilities.PRISM_ARMOR, Abilities.NONE, Abilities.NONE, 680, 97, 157, 127, 113, 109, 77, 255, 0, 340), + new PokemonForm("Dawn Wings", "dawn-wings", Type.PSYCHIC, Type.GHOST, 4.2, 350, Abilities.PRISM_ARMOR, Abilities.NONE, Abilities.NONE, 680, 97, 113, 109, 157, 127, 77, 255, 0, 340), + new PokemonForm("Ultra", "ultra", Type.PSYCHIC, Type.DRAGON, 7.5, 230, Abilities.NEUROFORCE, Abilities.NONE, Abilities.NONE, 754, 97, 167, 97, 167, 97, 129, 255, 0, 377), ), new PokemonSpecies(Species.MAGEARNA, 7, false, false, true, "Artificial Pokémon", Type.STEEL, Type.FAIRY, 1, 80.5, Abilities.SOUL_HEART, Abilities.NONE, Abilities.NONE, 600, 80, 95, 115, 130, 115, 65, 3, 0, 300, GrowthRate.SLOW, null, false, false, new PokemonForm("Normal", "", Type.STEEL, Type.FAIRY, 1, 80.5, Abilities.SOUL_HEART, Abilities.NONE, Abilities.NONE, 600, 80, 95, 115, 130, 115, 65, 3, 0, 300, false, null, true), @@ -2316,7 +2431,7 @@ export function initSpecies() { ), new PokemonSpecies(Species.MARSHADOW, 7, false, false, true, "Gloomdweller Pokémon", Type.FIGHTING, Type.GHOST, 0.7, 22.2, Abilities.TECHNICIAN, Abilities.NONE, Abilities.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300, GrowthRate.SLOW, null, false, true, new PokemonForm("Normal", "", Type.FIGHTING, Type.GHOST, 0.7, 22.2, Abilities.TECHNICIAN, Abilities.NONE, Abilities.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300, false, null, true), - new PokemonForm("Zenith", "zenith", Type.FIGHTING, Type.GHOST, 0.7, 22.2, Abilities.TECHNICIAN, Abilities.NONE, Abilities.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300) + new PokemonForm("Zenith", "zenith", Type.FIGHTING, Type.GHOST, 0.7, 22.2, Abilities.TECHNICIAN, Abilities.NONE, Abilities.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300, false, null, false, true) ), new PokemonSpecies(Species.POIPOLE, 7, true, false, false, "Poison Pin Pokémon", Type.POISON, null, 0.6, 1.8, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 420, 67, 73, 67, 73, 67, 73, 45, 0, 210, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.NAGANADEL, 7, true, false, false, "Poison Pin Pokémon", Type.POISON, Type.DRAGON, 3.6, 150, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 540, 73, 73, 73, 127, 73, 121, 45, 0, 270, GrowthRate.SLOW, null, false), @@ -2415,11 +2530,11 @@ export function initSpecies() { new PokemonSpecies(Species.GRAPPLOCT, 8, false, false, false, "Jujitsu Pokémon", Type.FIGHTING, null, 1.6, 39, Abilities.LIMBER, Abilities.NONE, Abilities.TECHNICIAN, 480, 80, 118, 90, 70, 80, 42, 45, 50, 168, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.SINISTEA, 8, false, false, false, "Black Tea Pokémon", Type.GHOST, null, 0.1, 0.2, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, GrowthRate.MEDIUM_FAST, null, false, false, new PokemonForm("Phony Form", "phony", Type.GHOST, null, 0.1, 0.2, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, "", true), - new PokemonForm("Antique Form", "antique", Type.GHOST, null, 0.1, 0.2, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, "", true), + new 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, true), ), new PokemonSpecies(Species.POLTEAGEIST, 8, false, false, false, "Black Tea Pokémon", Type.GHOST, null, 0.2, 0.4, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 508, 60, 65, 65, 134, 114, 70, 60, 50, 178, GrowthRate.MEDIUM_FAST, null, false, false, new PokemonForm("Phony Form", "phony", Type.GHOST, null, 0.2, 0.4, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 508, 60, 65, 65, 134, 114, 70, 60, 50, 178, false, "", true), - new PokemonForm("Antique Form", "antique", Type.GHOST, null, 0.2, 0.4, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 508, 60, 65, 65, 134, 114, 70, 60, 50, 178, false, "", true), + new PokemonForm("Antique Form", "antique", Type.GHOST, null, 0.2, 0.4, Abilities.WEAK_ARMOR, Abilities.NONE, Abilities.CURSED_BODY, 508, 60, 65, 65, 134, 114, 70, 60, 50, 178, false, "", true, true), ), new PokemonSpecies(Species.HATENNA, 8, false, false, false, "Calm Pokémon", Type.PSYCHIC, null, 0.4, 3.4, Abilities.HEALER, Abilities.ANTICIPATION, Abilities.MAGIC_BOUNCE, 265, 42, 30, 45, 56, 53, 39, 235, 50, 53, GrowthRate.SLOW, 0, false), new PokemonSpecies(Species.HATTREM, 8, false, false, false, "Serene Pokémon", Type.PSYCHIC, null, 0.6, 4.8, Abilities.HEALER, Abilities.ANTICIPATION, Abilities.MAGIC_BOUNCE, 370, 57, 40, 65, 86, 73, 49, 120, 50, 130, GrowthRate.SLOW, 0, false), @@ -2487,11 +2602,11 @@ export function initSpecies() { new PokemonSpecies(Species.DRAGAPULT, 8, false, false, false, "Stealth Pokémon", Type.DRAGON, Type.GHOST, 3, 50, Abilities.CLEAR_BODY, Abilities.INFILTRATOR, Abilities.CURSED_BODY, 600, 88, 120, 75, 100, 75, 142, 45, 50, 300, GrowthRate.SLOW, 50, false), new PokemonSpecies(Species.ZACIAN, 8, false, true, false, "Warrior Pokémon", Type.FAIRY, null, 2.8, 110, Abilities.INTREPID_SWORD, Abilities.NONE, Abilities.NONE, 660, 92, 120, 115, 80, 115, 138, 10, 0, 335, GrowthRate.SLOW, null, false, false, new PokemonForm("Hero of Many Battles", "hero-of-many-battles", Type.FAIRY, null, 2.8, 110, Abilities.INTREPID_SWORD, Abilities.NONE, Abilities.NONE, 660, 92, 120, 115, 80, 115, 138, 10, 0, 335, false, "", true), - new PokemonForm("Crowned", "crowned", Type.FAIRY, Type.STEEL, 2.8, 355, Abilities.INTREPID_SWORD, Abilities.NONE, Abilities.NONE, 700, 92, 150, 115, 80, 115, 148, 10, 0, 335), + new 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, 360), ), new PokemonSpecies(Species.ZAMAZENTA, 8, false, true, false, "Warrior Pokémon", Type.FIGHTING, null, 2.9, 210, Abilities.DAUNTLESS_SHIELD, Abilities.NONE, Abilities.NONE, 660, 92, 120, 115, 80, 115, 138, 10, 0, 335, GrowthRate.SLOW, null, false, false, new PokemonForm("Hero of Many Battles", "hero-of-many-battles", Type.FIGHTING, null, 2.9, 210, Abilities.DAUNTLESS_SHIELD, Abilities.NONE, Abilities.NONE, 660, 92, 120, 115, 80, 115, 138, 10, 0, 335, false, "", true), - new PokemonForm("Crowned", "crowned", Type.FIGHTING, Type.STEEL, 2.9, 785, Abilities.DAUNTLESS_SHIELD, Abilities.NONE, Abilities.NONE, 700, 92, 120, 140, 80, 140, 128, 10, 0, 335), + new 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, 360), ), new PokemonSpecies(Species.ETERNATUS, 8, false, true, false, "Gigantic Pokémon", Type.POISON, Type.DRAGON, 20, 950, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 690, 140, 85, 95, 145, 95, 130, 255, 0, 345, GrowthRate.SLOW, null, false, true, new PokemonForm("Normal", "", Type.POISON, Type.DRAGON, 20, 950, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 690, 140, 85, 95, 145, 95, 130, 255, 0, 345, false, null, true), @@ -2514,8 +2629,8 @@ export function initSpecies() { new PokemonSpecies(Species.SPECTRIER, 8, true, false, false, "Swift Horse Pokémon", Type.GHOST, null, 2, 44.5, Abilities.GRIM_NEIGH, Abilities.NONE, Abilities.NONE, 580, 100, 65, 60, 145, 80, 130, 3, 35, 290, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.CALYREX, 8, false, true, false, "King Pokémon", Type.PSYCHIC, Type.GRASS, 1.1, 7.7, Abilities.UNNERVE, Abilities.NONE, Abilities.NONE, 500, 100, 80, 80, 80, 80, 80, 3, 100, 250, GrowthRate.SLOW, null, false, true, new PokemonForm("Normal", "", Type.PSYCHIC, Type.GRASS, 1.1, 7.7, Abilities.UNNERVE, Abilities.NONE, Abilities.NONE, 500, 100, 80, 80, 80, 80, 80, 3, 100, 250, false, null, true), - new PokemonForm("Ice", "ice", Type.PSYCHIC, Type.ICE, 2.4, 809.1, Abilities.AS_ONE_GLASTRIER, Abilities.NONE, Abilities.NONE, 680, 100, 165, 150, 85, 130, 50, 3, 100, 250), - new PokemonForm("Shadow", "shadow", Type.PSYCHIC, Type.GHOST, 2.4, 53.6, Abilities.AS_ONE_SPECTRIER, Abilities.NONE, Abilities.NONE, 680, 100, 85, 80, 165, 100, 150, 3, 100, 250), + new PokemonForm("Ice", "ice", Type.PSYCHIC, Type.ICE, 2.4, 809.1, Abilities.AS_ONE_GLASTRIER, Abilities.NONE, Abilities.NONE, 680, 100, 165, 150, 85, 130, 50, 3, 100, 340), + new PokemonForm("Shadow", "shadow", Type.PSYCHIC, Type.GHOST, 2.4, 53.6, Abilities.AS_ONE_SPECTRIER, Abilities.NONE, Abilities.NONE, 680, 100, 85, 80, 165, 100, 150, 3, 100, 340), ), new PokemonSpecies(Species.WYRDEER, 8, false, false, false, "Big Horn Pokémon", Type.NORMAL, Type.PSYCHIC, 1.8, 95.1, Abilities.INTIMIDATE, Abilities.FRISK, Abilities.SAP_SIPPER, 525, 103, 105, 72, 105, 75, 65, 135, 50, 263, GrowthRate.SLOW, 50, false), new PokemonSpecies(Species.KLEAVOR, 8, false, false, false, "Axe Pokémon", Type.BUG, Type.ROCK, 1.8, 89, Abilities.SWARM, Abilities.SHEER_FORCE, Abilities.SHARPNESS, 500, 70, 135, 95, 45, 70, 85, 115, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), @@ -2700,8 +2815,8 @@ export function initSpecies() { new PokemonSpecies(Species.IRON_CROWN, 9, false, false, false, "Paradox Pokémon", Type.STEEL, Type.PSYCHIC, 1.6, 156, Abilities.QUARK_DRIVE, Abilities.NONE, Abilities.NONE, 590, 90, 72, 100, 122, 108, 98, 10, 0, 295, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.TERAPAGOS, 9, false, true, false, "Tera Pokémon", Type.NORMAL, null, 0.2, 6.5, Abilities.TERA_SHIFT, Abilities.NONE, Abilities.NONE, 450, 90, 65, 85, 65, 85, 60, 5, 50, 90, GrowthRate.SLOW, 50, false, false, new PokemonForm("Normal Form", "", Type.NORMAL, null, 0.2, 6.5, Abilities.TERA_SHIFT, Abilities.NONE, Abilities.NONE, 450, 90, 65, 85, 65, 85, 60, 5, 50, 90, false, null, true), - new PokemonForm("Terastal Form", "terastal", Type.NORMAL, null, 0.3, 16, Abilities.TERA_SHELL, Abilities.NONE, Abilities.NONE, 600, 95, 95, 110, 105, 110, 85, 5, 50, 90), - new PokemonForm("Stellar Form", "stellar", Type.NORMAL, null, 1.7, 77, Abilities.TERAFORM_ZERO, Abilities.NONE, Abilities.NONE, 700, 160, 105, 110, 130, 110, 85, 5, 50, 90), + new PokemonForm("Terastal Form", "terastal", Type.NORMAL, null, 0.3, 16, Abilities.TERA_SHELL, Abilities.NONE, Abilities.NONE, 600, 95, 95, 110, 105, 110, 85, 5, 50, 120), + new PokemonForm("Stellar Form", "stellar", Type.NORMAL, null, 1.7, 77, Abilities.TERAFORM_ZERO, Abilities.NONE, Abilities.NONE, 700, 160, 105, 110, 130, 110, 85, 5, 50, 140), ), new PokemonSpecies(Species.PECHARUNT, 9, false, false, true, "Subjugation Pokémon", Type.POISON, Type.GHOST, 0.3, 0.3, Abilities.POISON_PUPPETEER, Abilities.NONE, Abilities.NONE, 600, 88, 88, 160, 88, 88, 88, 3, 0, 300, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.ALOLA_RATTATA, 7, false, false, false, "Mouse Pokémon", Type.DARK, Type.NORMAL, 0.3, 3.8, Abilities.GLUTTONY, Abilities.HUSTLE, Abilities.THICK_FAT, 253, 30, 56, 35, 25, 35, 72, 255, 70, 51, GrowthRate.MEDIUM_FAST, 50, false), @@ -2722,7 +2837,7 @@ export function initSpecies() { new PokemonSpecies(Species.ALOLA_MUK, 7, false, false, false, "Sludge Pokémon", Type.POISON, Type.DARK, 1, 52, Abilities.POISON_TOUCH, Abilities.GLUTTONY, Abilities.POWER_OF_ALCHEMY, 500, 105, 105, 75, 65, 100, 50, 75, 70, 175, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.ALOLA_EXEGGUTOR, 7, false, false, false, "Coconut Pokémon", Type.GRASS, Type.DRAGON, 10.9, 415.6, Abilities.FRISK, Abilities.NONE, Abilities.HARVEST, 530, 95, 105, 85, 125, 75, 45, 45, 50, 186, GrowthRate.SLOW, 50, false), new PokemonSpecies(Species.ALOLA_MAROWAK, 7, false, false, false, "Bone Keeper Pokémon", Type.FIRE, Type.GHOST, 1, 34, Abilities.CURSED_BODY, Abilities.LIGHTNING_ROD, Abilities.ROCK_HEAD, 425, 60, 80, 110, 50, 80, 45, 75, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.ETERNAL_FLOETTE, 6, true, false, false, "Single Bloom Pokémon", Type.FAIRY, null, 0.2, 0.9, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 551, 74, 65, 67, 125, 128, 92, 120, 70, 130, GrowthRate.MEDIUM_FAST, 0, false), //Marked as Sub-Legend, for casing purposes + new PokemonSpecies(Species.ETERNAL_FLOETTE, 6, true, false, false, "Single Bloom Pokémon", Type.FAIRY, null, 0.2, 0.9, Abilities.FLOWER_VEIL, Abilities.NONE, Abilities.SYMBIOSIS, 551, 74, 65, 67, 125, 128, 92, 120, 70, 243, GrowthRate.MEDIUM_FAST, 0, false), //Marked as Sub-Legend, for casing purposes new PokemonSpecies(Species.GALAR_MEOWTH, 8, false, false, false, "Scratch Cat Pokémon", Type.STEEL, null, 0.4, 7.5, Abilities.PICKUP, Abilities.TOUGH_CLAWS, Abilities.UNNERVE, 290, 50, 65, 55, 40, 40, 40, 255, 50, 58, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.GALAR_PONYTA, 8, false, false, false, "Fire Horse Pokémon", Type.PSYCHIC, null, 0.8, 24, Abilities.RUN_AWAY, Abilities.PASTEL_VEIL, Abilities.ANTICIPATION, 410, 50, 85, 55, 65, 65, 90, 190, 50, 82, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.GALAR_RAPIDASH, 8, false, false, false, "Fire Horse Pokémon", Type.PSYCHIC, Type.FAIRY, 1.7, 80, Abilities.RUN_AWAY, Abilities.PASTEL_VEIL, Abilities.ANTICIPATION, 500, 65, 100, 70, 80, 80, 105, 60, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), @@ -2767,7 +2882,7 @@ export function initSpecies() { new PokemonForm("Aqua Breed", "aqua", Type.FIGHTING, Type.WATER, 1.4, 110, Abilities.INTIMIDATE, Abilities.ANGER_POINT, Abilities.CUD_CHEW, 490, 75, 110, 105, 30, 70, 100, 45, 50, 172, false, null, true), ), new PokemonSpecies(Species.PALDEA_WOOPER, 9, false, false, false, "Water Fish Pokémon", Type.POISON, Type.GROUND, 0.4, 11, Abilities.POISON_POINT, Abilities.WATER_ABSORB, Abilities.UNAWARE, 210, 55, 45, 45, 25, 25, 15, 255, 50, 42, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.BLOODMOON_URSALUNA, 9, true, false, false, "Peat Pokémon", Type.GROUND, Type.NORMAL, 2.7, 333, Abilities.MINDS_EYE, Abilities.NONE, Abilities.NONE, 555, 113, 70, 120, 135, 65, 52, 75, 50, 275, GrowthRate.MEDIUM_FAST, 50, false), //Marked as Sub-Legend, for casing purposes + new PokemonSpecies(Species.BLOODMOON_URSALUNA, 9, true, false, false, "Peat Pokémon", Type.GROUND, Type.NORMAL, 2.7, 333, Abilities.MINDS_EYE, Abilities.NONE, Abilities.NONE, 555, 113, 70, 120, 135, 65, 52, 75, 50, 278, GrowthRate.MEDIUM_FAST, 50, false), //Marked as Sub-Legend, for casing purposes ); } diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index 016a2c9bca6..564518845dc 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -581,107 +581,107 @@ export class TrainerConfig { switch (team) { case "rocket": { return { - [TrainerPoolTier.COMMON]: [ Species.RATTATA, Species.KOFFING, Species.EKANS, Species.ZUBAT, Species.MAGIKARP, Species.HOUNDOUR, Species.ONIX, Species.CUBONE, Species.GROWLITHE, Species.MURKROW, Species.GASTLY, Species.EXEGGCUTE, Species.VOLTORB, Species.DROWZEE, Species.VILEPLUME ], - [TrainerPoolTier.UNCOMMON]: [ Species.PORYGON, Species.MANKEY, Species.MAGNEMITE, Species.ALOLA_SANDSHREW, Species.ALOLA_MEOWTH, Species.ALOLA_GRIMER, Species.ALOLA_GEODUDE, Species.PALDEA_TAUROS, Species.OMANYTE, Species.KABUTO, Species.MAGBY, Species.ELEKID ], - [TrainerPoolTier.RARE]: [ Species.DRATINI, Species.LARVITAR ] + [TrainerPoolTier.COMMON]: [ Species.RATICATE, Species.ARBOK, Species.VILEPLUME, Species.ARCANINE, Species.GENGAR, Species.HYPNO, Species.ELECTRODE, Species.EXEGGUTOR, Species.CUBONE, Species.KOFFING, Species.GYARADOS, Species.CROBAT, Species.STEELIX, Species.HOUNDOOM, Species.HONCHKROW ], + [TrainerPoolTier.UNCOMMON]: [ Species.OMASTAR, Species.KABUTOPS, Species.MAGNEZONE, Species.ELECTIVIRE, Species.MAGMORTAR, Species.PORYGON_Z, Species.ANNIHILAPE, Species.ALOLA_SANDSLASH, Species.ALOLA_PERSIAN, Species.ALOLA_GOLEM, Species.ALOLA_MUK, Species.PALDEA_TAUROS ], + [TrainerPoolTier.RARE]: [ Species.DRAGONITE, Species.TYRANITAR ] }; } case "magma": { return { - [TrainerPoolTier.COMMON]: [ Species.GROWLITHE, Species.SLUGMA, Species.SOLROCK, Species.HIPPOPOTAS, Species.BALTOY, Species.ROLYCOLY, Species.GLIGAR, Species.TORKOAL, Species.HOUNDOUR, Species.MAGBY ], - [TrainerPoolTier.UNCOMMON]: [ Species.TRAPINCH, Species.SILICOBRA, Species.RHYHORN, Species.ANORITH, Species.LILEEP, Species.HISUI_GROWLITHE, Species.TURTONATOR, Species.ARON, Species.TOEDSCOOL ], - [TrainerPoolTier.RARE]: [ Species.CAPSAKID, Species.CHARCADET ] + [TrainerPoolTier.COMMON]: [ Species.ARCANINE, Species.MAGCARGO, Species.HOUNDOOM, Species.TORKOAL, Species.SOLROCK, Species.CLAYDOL, Species.HIPPOWDON, Species.MAGMORTAR, Species.GLISCOR, Species.COALOSSAL ], + [TrainerPoolTier.UNCOMMON]: [ Species.AGGRON, Species.FLYGON, Species.CRADILY, Species.ARMALDO, Species.RHYPERIOR, Species.TURTONATOR, Species.SANDACONDA, Species.TOEDSCRUEL, Species.HISUI_ARCANINE ], + [TrainerPoolTier.RARE]: [ Species.CHARCADET, Species.SCOVILLAIN ] }; } case "aqua": { return { - [TrainerPoolTier.COMMON]: [ Species.CORPHISH, Species.SPHEAL, Species.CLAMPERL, Species.CHINCHOU, Species.WOOPER, Species.WINGULL, Species.TENTACOOL, Species.AZURILL, Species.LOTAD, Species.WAILMER, Species.REMORAID, Species.BARBOACH ], - [TrainerPoolTier.UNCOMMON]: [ Species.MANTYKE, Species.HISUI_QWILFISH, Species.ARROKUDA, Species.DHELMISE, Species.CLOBBOPUS, Species.FEEBAS, Species.PALDEA_WOOPER, Species.HORSEA, Species.SKRELP ], - [TrainerPoolTier.RARE]: [ Species.DONDOZO, Species.BASCULEGION ] + [TrainerPoolTier.COMMON]: [ Species.TENTACRUEL, Species.LANTURN, Species.AZUMARILL, Species.QUAGSIRE, Species.OCTILLERY, Species.LUDICOLO, Species.PELIPPER, Species.WAILORD, Species.WHISCASH, Species.CRAWDAUNT, Species.WALREIN, Species.CLAMPERL ], + [TrainerPoolTier.UNCOMMON]: [ Species.QUAGSIRE, Species.MANTINE, Species.KINGDRA, Species.MILOTIC, Species.DRAGALGE, Species.DHELMISE, Species.BARRASKEWDA, Species.GRAPPLOCT, Species.OVERQWIL ], + [TrainerPoolTier.RARE]: [ Species.BASCULEGION, Species.DONDOZO ] }; } case "galactic": { return { - [TrainerPoolTier.COMMON]: [ Species.BRONZOR, Species.SWINUB, Species.YANMA, Species.LICKITUNG, Species.TANGELA, Species.MAGBY, Species.ELEKID, Species.SKORUPI, Species.ZUBAT, Species.MURKROW, Species.MAGIKARP, Species.VOLTORB ], - [TrainerPoolTier.UNCOMMON]: [ Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH, Species.SNEASEL, Species.DUSKULL, Species.ROTOM, Species.HISUI_VOLTORB, Species.GLIGAR, Species.ABRA ], - [TrainerPoolTier.RARE]: [ Species.URSALUNA, Species.HISUI_LILLIGANT, Species.SPIRITOMB, Species.HISUI_SNEASEL ] + [TrainerPoolTier.COMMON]: [ Species.ELECTRODE, Species.GYARADOS, Species.CROBAT, Species.HONCHKROW, Species.BRONZONG, Species.DRAPION, Species.LICKILICKY, Species.TANGROWTH, Species.ELECTIVIRE, Species.MAGMORTAR, Species.YANMEGA, Species.MAMOSWINE ], + [TrainerPoolTier.UNCOMMON]: [ Species.ALAKAZAM, Species.WEAVILE, Species.GLISCOR, Species.DUSKNOIR, Species.ROTOM, Species.OVERQWIL, Species.HISUI_ARCANINE, Species.HISUI_ELECTRODE ], + [TrainerPoolTier.RARE]: [ Species.SPIRITOMB, Species.URSALUNA, Species.SNEASLER, Species.HISUI_LILLIGANT ] }; } case "plasma": { return { - [TrainerPoolTier.COMMON]: [ Species.YAMASK, Species.ROGGENROLA, Species.JOLTIK, Species.TYMPOLE, Species.FRILLISH, Species.FERROSEED, Species.SANDILE, Species.TIMBURR, Species.DARUMAKA, Species.FOONGUS, Species.CUBCHOO, Species.VANILLITE ], - [TrainerPoolTier.UNCOMMON]: [ Species.PAWNIARD, Species.VULLABY, Species.ZORUA, Species.DRILBUR, Species.KLINK, Species.TYNAMO, Species.GALAR_DARUMAKA, Species.GOLETT, Species.MIENFOO, Species.DURANT, Species.SIGILYPH ], - [TrainerPoolTier.RARE]: [ Species.HISUI_ZORUA, Species.AXEW, Species.DEINO, Species.HISUI_BRAVIARY ] + [TrainerPoolTier.COMMON]: [ Species.GIGALITH, Species.CONKELDURR, Species.SEISMITOAD, Species.KROOKODILE, Species.DARMANITAN, Species.COFAGRIGUS, Species.VANILLUXE, Species.AMOONGUSS, Species.JELLICENT, Species.GALVANTULA, Species.FERROTHORN, Species.BEARTIC ], + [TrainerPoolTier.UNCOMMON]: [ Species.EXCADRILL, Species.SIGILYPH, Species.ZOROARK, Species.KLINKLANG, Species.EELEKTROSS, Species.MIENSHAO, Species.GOLURK, Species.BISHARP, Species.MANDIBUZZ, Species.DURANT, Species.GALAR_DARMANITAN ], + [TrainerPoolTier.RARE]: [ Species.HAXORUS, Species.HYDREIGON, Species.HISUI_ZOROARK, Species.HISUI_BRAVIARY ] }; } case "plasma_2": { return { - [TrainerPoolTier.COMMON]: [ Species.MAGNEMITE, Species.GRIMER, Species.VOLTORB, Species.PORYGON, Species.BRONZOR, Species.MUNNA, Species.SOLOSIS, Species.JOLTIK, Species.FERROSEED, Species.TYNAMO, Species.ELGYEM ], - [TrainerPoolTier.UNCOMMON]: [ Species.BELDUM, Species.ROTOM, Species.TIRTOUGA, Species.ARCHEN, Species.GOLETT, Species.DURANT, Species.GRUBBIN, Species.BLIPBUG, Species.VAROOM, Species.ALOLA_GRIMER, Species.HISUI_VOLTORB ], - [TrainerPoolTier.RARE]: [ Species.ELEKID, Species.MAGBY, Species.PAWNIARD, Species.DURALUDON ] + [TrainerPoolTier.COMMON]: [ Species.MUK, Species.ELECTRODE, Species.BRONZONG, Species.MAGNEZONE, Species.PORYGON_Z, Species.MUSHARNA, Species.REUNICLUS, Species.GALVANTULA, Species.FERROTHORN, Species.EELEKTROSS, Species.BEHEEYEM ], + [TrainerPoolTier.UNCOMMON]: [ Species.METAGROSS, Species.ROTOM, Species.CARRACOSTA, Species.ARCHEOPS, Species.GOLURK, Species.DURANT, Species.VIKAVOLT, Species.ORBEETLE, Species.REVAVROOM, Species.ALOLA_MUK, Species.HISUI_ELECTRODE ], + [TrainerPoolTier.RARE]: [ Species.ELECTIVIRE, Species.MAGMORTAR, Species.BISHARP, Species.ARCHALUDON ] }; } case "flare": { return { - [TrainerPoolTier.COMMON]: [ Species.FLETCHLING, Species.LITLEO, Species.INKAY, Species.FOONGUS, Species.HELIOPTILE, Species.ELECTRIKE, Species.SKORUPI, Species.PURRLOIN, Species.CLAWITZER, Species.PANCHAM, Species.ESPURR, Species.BUNNELBY ], - [TrainerPoolTier.UNCOMMON]: [ Species.LITWICK, Species.SNEASEL, Species.PUMPKABOO, Species.PHANTUMP, Species.HONEDGE, Species.BINACLE, Species.HOUNDOUR, Species.SKRELP, Species.SLIGGOO ], - [TrainerPoolTier.RARE]: [ Species.NOIBAT, Species.HISUI_AVALUGG, Species.HISUI_SLIGGOO ] + [TrainerPoolTier.COMMON]: [ Species.MANECTRIC, Species.DRAPION, Species.LIEPARD, Species.AMOONGUSS, Species.DIGGERSBY, Species.TALONFLAME, Species.PYROAR, Species.PANGORO, Species.MEOWSTIC, Species.MALAMAR, Species.CLAWITZER, Species.HELIOLISK ], + [TrainerPoolTier.UNCOMMON]: [ Species.HOUNDOOM, Species.WEAVILE, Species.CHANDELURE, Species.AEGISLASH, Species.BARBARACLE, Species.DRAGALGE, Species.GOODRA, Species.TREVENANT, Species.GOURGEIST ], + [TrainerPoolTier.RARE]: [ Species.NOIVERN, Species.HISUI_GOODRA, Species.HISUI_AVALUGG ] }; } case "aether": { return { - [TrainerPoolTier.COMMON]: [ Species.BRUXISH, Species.SLOWPOKE, Species.BALTOY, Species.EXEGGCUTE, Species.ABRA, Species.ALOLA_RAICHU, Species.ELGYEM, Species.NATU, Species.BLIPBUG, Species.GIRAFARIG, Species.ORANGURU ], - [TrainerPoolTier.UNCOMMON]: [ Species.GALAR_SLOWPOKE, Species.MEDITITE, Species.BELDUM, Species.HATENNA, Species.INKAY, Species.RALTS, Species.GALAR_MR_MIME ], - [TrainerPoolTier.RARE]: [ Species.ARMAROUGE, Species.HISUI_BRAVIARY, Species.PORYGON ] + [TrainerPoolTier.COMMON]: [ Species.ALAKAZAM, Species.SLOWBRO, Species.EXEGGUTOR, Species.XATU, Species.CLAYDOL, Species.BEHEEYEM, Species.ORANGURU, Species.BRUXISH, Species.ORBEETLE, Species.FARIGIRAF, Species.ALOLA_RAICHU ], + [TrainerPoolTier.UNCOMMON]: [ Species.KIRLIA, Species.MEDICHAM, Species.METAGROSS, Species.MALAMAR, Species.HATTERENE, Species.MR_RIME, Species.GALAR_SLOWKING ], + [TrainerPoolTier.RARE]: [ Species.PORYGON_Z, Species.ARMAROUGE, Species.HISUI_BRAVIARY ] }; } case "skull": { return { - [TrainerPoolTier.COMMON]: [ Species.MAREANIE, Species.ALOLA_GRIMER, Species.GASTLY, Species.ZUBAT, Species.FOMANTIS, Species.VENIPEDE, Species.BUDEW, Species.KOFFING, Species.STUNKY, Species.CROAGUNK, Species.NIDORAN_F ], - [TrainerPoolTier.UNCOMMON]: [ Species.GALAR_SLOWPOKE, Species.SKORUPI, Species.PALDEA_WOOPER, Species.VULLABY, Species.HISUI_QWILFISH, Species.GLIMMET ], - [TrainerPoolTier.RARE]: [ Species.SKRELP, Species.HISUI_SNEASEL ] + [TrainerPoolTier.COMMON]: [ Species.NIDOQUEEN, Species.GENGAR, Species.KOFFING, Species.CROBAT, Species.ROSERADE, Species.SKUNTANK, Species.TOXICROAK, Species.SCOLIPEDE, Species.TOXAPEX, Species.LURANTIS, Species.ALOLA_MUK ], + [TrainerPoolTier.UNCOMMON]: [ Species.DRAPION, Species.MANDIBUZZ, Species.OVERQWIL, Species.GLIMMORA, Species.CLODSIRE, Species.GALAR_SLOWBRO ], + [TrainerPoolTier.RARE]: [ Species.DRAGALGE, Species.SNEASLER ] }; } case "macro": { return { - [TrainerPoolTier.COMMON]: [ Species.HATENNA, Species.FEEBAS, Species.BOUNSWEET, Species.SALANDIT, Species.GALAR_PONYTA, Species.GOTHITA, Species.FROSLASS, Species.VULPIX, Species.FRILLISH, Species.ODDISH, Species.SINISTEA ], - [TrainerPoolTier.UNCOMMON]: [ Species.VULLABY, Species.MAREANIE, Species.ALOLA_VULPIX, Species.TOGEPI, Species.GALAR_CORSOLA, Species.APPLIN ], - [TrainerPoolTier.RARE]: [ Species.TINKATINK, Species.HISUI_LILLIGANT ] + [TrainerPoolTier.COMMON]: [ Species.NINETALES, Species.BELLOSSOM, Species.MILOTIC, Species.FROSLASS, Species.GOTHITELLE, Species.JELLICENT, Species.SALAZZLE, Species.TSAREENA, Species.POLTEAGEIST, Species.HATTERENE, Species.GALAR_RAPIDASH ], + [TrainerPoolTier.UNCOMMON]: [ Species.TOGEKISS, Species.MANDIBUZZ, Species.TOXAPEX, Species.APPLETUN, Species.CURSOLA, Species.ALOLA_NINETALES ], + [TrainerPoolTier.RARE]: [ Species.TINKATON, Species.HISUI_LILLIGANT ] }; } case "star_1": { return { - [TrainerPoolTier.COMMON]: [ Species.MURKROW, Species.SEEDOT, Species.CACNEA, Species.STUNKY, Species.SANDILE, Species.NYMBLE, Species.MASCHIFF, Species.GALAR_ZIGZAGOON ], - [TrainerPoolTier.UNCOMMON]: [ Species.UMBREON, Species.SNEASEL, Species.CORPHISH, Species.ZORUA, Species.INKAY, Species.BOMBIRDIER ], - [TrainerPoolTier.RARE]: [ Species.DEINO, Species.SPRIGATITO ] + [TrainerPoolTier.COMMON]: [ Species.SHIFTRY, Species.CACTURNE, Species.HONCHKROW, Species.SKUNTANK, Species.KROOKODILE, Species.OBSTAGOON, Species.LOKIX, Species.MABOSSTIFF ], + [TrainerPoolTier.UNCOMMON]: [ Species.UMBREON, Species.CRAWDAUNT, Species.WEAVILE, Species.ZOROARK, Species.MALAMAR, Species.BOMBIRDIER ], + [TrainerPoolTier.RARE]: [ Species.HYDREIGON, Species.MEOWSCARADA ] }; } case "star_2": { return { - [TrainerPoolTier.COMMON]: [ Species.GROWLITHE, Species.HOUNDOUR, Species.NUMEL, Species.LITWICK, Species.FLETCHLING, Species.LITLEO, Species.ROLYCOLY, Species.CAPSAKID ], - [TrainerPoolTier.UNCOMMON]: [ Species.PONYTA, Species.FLAREON, Species.MAGBY, Species.TORKOAL, Species.SALANDIT, Species.TURTONATOR ], - [TrainerPoolTier.RARE]: [ Species.LARVESTA, Species.FUECOCO ] + [TrainerPoolTier.COMMON]: [ Species.ARCANINE, Species.HOUNDOOM, Species.CAMERUPT, Species.CHANDELURE, Species.TALONFLAME, Species.PYROAR, Species.COALOSSAL, Species.SCOVILLAIN ], + [TrainerPoolTier.UNCOMMON]: [ Species.RAPIDASH, Species.FLAREON, Species.TORKOAL, Species.MAGMORTAR, Species.SALAZZLE, Species.TURTONATOR ], + [TrainerPoolTier.RARE]: [ Species.VOLCARONA, Species.SKELEDIRGE ] }; } case "star_3": { return { - [TrainerPoolTier.COMMON]: [ Species.ZUBAT, Species.GRIMER, Species.STUNKY, Species.FOONGUS, Species.MAREANIE, Species.TOXEL, Species.SHROODLE, Species.PALDEA_WOOPER ], - [TrainerPoolTier.UNCOMMON]: [ Species.GASTLY, Species.SEVIPER, Species.SKRELP, Species.ALOLA_GRIMER, Species.GALAR_SLOWPOKE, Species.HISUI_QWILFISH ], - [TrainerPoolTier.RARE]: [ Species.GLIMMET, Species.BULBASAUR ] + [TrainerPoolTier.COMMON]: [ Species.MUK, Species.CROBAT, Species.SKUNTANK, Species.AMOONGUSS, Species.TOXAPEX, Species.TOXTRICITY, Species.GRAFAIAI, Species.CLODSIRE ], + [TrainerPoolTier.UNCOMMON]: [ Species.GENGAR, Species.SEVIPER, Species.DRAGALGE, Species.OVERQWIL, Species.ALOLA_MUK, Species.GALAR_SLOWBRO ], + [TrainerPoolTier.RARE]: [ Species.GLIMMORA, Species.VENUSAUR ] }; } case "star_4": { return { - [TrainerPoolTier.COMMON]: [ Species.CLEFFA, Species.IGGLYBUFF, Species.AZURILL, Species.COTTONEE, Species.FLABEBE, Species.HATENNA, Species.IMPIDIMP, Species.TINKATINK ], - [TrainerPoolTier.UNCOMMON]: [ Species.TOGEPI, Species.GARDEVOIR, Species.SYLVEON, Species.KLEFKI, Species.MIMIKYU, Species.ALOLA_VULPIX ], - [TrainerPoolTier.RARE]: [ Species.GALAR_PONYTA, Species.POPPLIO ] + [TrainerPoolTier.COMMON]: [ Species.CLEFABLE, Species.WIGGLYTUFF, Species.AZUMARILL, Species.WHIMSICOTT, Species.FLORGES, Species.HATTERENE, Species.GRIMMSNARL, Species.TINKATON ], + [TrainerPoolTier.UNCOMMON]: [ Species.TOGEKISS, Species.GARDEVOIR, Species.SYLVEON, Species.KLEFKI, Species.MIMIKYU, Species.ALOLA_NINETALES ], + [TrainerPoolTier.RARE]: [ Species.GALAR_RAPIDASH, Species.PRIMARINA ] }; } case "star_5": { return { - [TrainerPoolTier.COMMON]: [ Species.SHROOMISH, Species.MAKUHITA, Species.MEDITITE, Species.CROAGUNK, Species.SCRAGGY, Species.MIENFOO, Species.PAWMI, Species.PALDEA_TAUROS ], - [TrainerPoolTier.UNCOMMON]: [ Species.RIOLU, Species.TIMBURR, Species.HAWLUCHA, Species.PASSIMIAN, Species.FALINKS, Species.FLAMIGO ], - [TrainerPoolTier.RARE]: [ Species.JANGMO_O, Species.QUAXLY ] + [TrainerPoolTier.COMMON]: [ Species.BRELOOM, Species.HARIYAMA, Species.MEDICHAM, Species.TOXICROAK, Species.SCRAFTY, Species.MIENSHAO, Species.PAWMOT, Species.PALDEA_TAUROS ], + [TrainerPoolTier.UNCOMMON]: [ Species.LUCARIO, Species.CONKELDURR, Species.HAWLUCHA, Species.PASSIMIAN, Species.FALINKS, Species.FLAMIGO ], + [TrainerPoolTier.RARE]: [ Species.KOMMO_O, Species.QUAQUAVAL ] }; } } @@ -1500,9 +1500,9 @@ export const trainerConfigs: TrainerConfigs = { ), [TrainerType.ROCKET_GRUNT]: new TrainerConfig(++t).setHasGenders("Rocket Grunt Female").setHasDouble("Rocket Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.WEEDLE, Species.RATTATA, Species.EKANS, Species.SANDSHREW, Species.ZUBAT, Species.GEODUDE, Species.KOFFING, Species.GRIMER, Species.ODDISH, Species.SLOWPOKE ], - [TrainerPoolTier.UNCOMMON]: [ Species.GYARADOS, Species.LICKITUNG, Species.TAUROS, Species.MANKEY, Species.SCYTHER, Species.ELEKID, Species.MAGBY, Species.CUBONE, Species.GROWLITHE, Species.MURKROW, Species.GASTLY, Species.EXEGGCUTE, Species.VOLTORB, Species.MAGNEMITE ], - [TrainerPoolTier.RARE]: [ Species.PORYGON, Species.ALOLA_RATTATA, Species.ALOLA_SANDSHREW, Species.ALOLA_MEOWTH, Species.ALOLA_GRIMER, Species.ALOLA_GEODUDE, Species.PALDEA_TAUROS, Species.OMANYTE, Species.KABUTO ], + [TrainerPoolTier.COMMON]: [ Species.WEEDLE, Species.RATTATA, Species.EKANS, Species.SANDSHREW, Species.ZUBAT, Species.ODDISH, Species.GEODUDE, Species.SLOWPOKE, Species.GRIMER, Species.KOFFING ], + [TrainerPoolTier.UNCOMMON]: [ Species.MANKEY, Species.GROWLITHE, Species.MAGNEMITE, Species.GASTLY, Species.VOLTORB, Species.EXEGGCUTE, Species.CUBONE, Species.LICKITUNG, Species.SCYTHER, Species.TAUROS, Species.GYARADOS, Species.MURKROW, Species.ELEKID, Species.MAGBY ], + [TrainerPoolTier.RARE]: [ Species.PORYGON, Species.OMANYTE, Species.KABUTO, Species.ALOLA_RATTATA, Species.ALOLA_SANDSHREW, Species.ALOLA_MEOWTH, Species.ALOLA_GEODUDE, Species.ALOLA_GRIMER, Species.PALDEA_TAUROS ], [TrainerPoolTier.SUPER_RARE]: [ Species.DRATINI, Species.LARVITAR ] }), [TrainerType.ARCHER]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("rocket_admin", "rocket", [ Species.HOUNDOOM ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), @@ -1511,71 +1511,71 @@ export const trainerConfigs: TrainerConfigs = { [TrainerType.PETREL]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("rocket_admin", "rocket", [ Species.WEEZING ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.MAGMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Magma Grunt Female").setHasDouble("Magma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.SLUGMA, Species.POOCHYENA, Species.NUMEL, Species.ZIGZAGOON, Species.DIGLETT, Species.MAGBY, Species.TORKOAL, Species.GROWLITHE, Species.BALTOY ], - [TrainerPoolTier.UNCOMMON]: [ Species.SOLROCK, Species.HIPPOPOTAS, Species.SANDACONDA, Species.PHANPY, Species.ROLYCOLY, Species.GLIGAR, Species.RHYHORN, Species.HEATMOR ], - [TrainerPoolTier.RARE]: [ Species.TRAPINCH, Species.LILEEP, Species.ANORITH, Species.HISUI_GROWLITHE, Species.TURTONATOR, Species.ARON, Species.TOEDSCOOL ], - [TrainerPoolTier.SUPER_RARE]: [ Species.CAPSAKID, Species.CHARCADET ] + [TrainerPoolTier.COMMON]: [ Species.DIGLETT, Species.GROWLITHE, Species.SLUGMA, Species.MAGBY, Species.POOCHYENA, Species.ZIGZAGOON, Species.NUMEL, Species.TORKOAL, Species.BALTOY ], + [TrainerPoolTier.UNCOMMON]: [ Species.RHYHORN, Species.GLIGAR, Species.PHANPY, Species.SOLROCK, Species.HIPPOPOTAS, Species.HEATMOR, Species.ROLYCOLY, Species.SILICOBRA ], + [TrainerPoolTier.RARE]: [ Species.ARON, Species.TRAPINCH, Species.LILEEP, Species.ANORITH, Species.TURTONATOR, Species.TOEDSCOOL, Species.HISUI_GROWLITHE ], + [TrainerPoolTier.SUPER_RARE]: [ Species.CHARCADET, Species.CAPSAKID ] }), [TrainerType.TABITHA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("magma_admin", "magma", [ Species.CAMERUPT ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.COURTNEY]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("magma_admin_female", "magma", [ Species.CAMERUPT ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.AQUA_GRUNT]: new TrainerConfig(++t).setHasGenders("Aqua Grunt Female").setHasDouble("Aqua Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.CARVANHA, Species.WAILMER, Species.ZIGZAGOON, Species.LOTAD, Species.CORPHISH, Species.SPHEAL, Species.REMORAID, Species.QWILFISH, Species.BARBOACH ], - [TrainerPoolTier.UNCOMMON]: [ Species.CLAMPERL, Species.CHINCHOU, Species.WOOPER, Species.WINGULL, Species.TENTACOOL, Species.AZURILL, Species.CLOBBOPUS, Species.HORSEA ], - [TrainerPoolTier.RARE]: [ Species.MANTYKE, Species.DHELMISE, Species.HISUI_QWILFISH, Species.ARROKUDA, Species.PALDEA_WOOPER, Species.SKRELP ], - [TrainerPoolTier.SUPER_RARE]: [ Species.DONDOZO, Species.BASCULEGION ] + [TrainerPoolTier.COMMON]: [ Species.QWILFISH, Species.REMORAID, Species.ZIGZAGOON, Species.LOTAD, Species.CARVANHA, Species.WAILMER, Species.BARBOACH, Species.CORPHISH, Species.SPHEAL ], + [TrainerPoolTier.UNCOMMON]: [ Species.TENTACOOL, Species.HORSEA, Species.CHINCHOU, Species.WOOPER, Species.WINGULL, Species.AZURILL, Species.CLAMPERL, Species.CLOBBOPUS ], + [TrainerPoolTier.RARE]: [ Species.MANTYKE, Species.SKRELP, Species.DHELMISE, Species.ARROKUDA, Species.HISUI_QWILFISH, Species.PALDEA_WOOPER ], + [TrainerPoolTier.SUPER_RARE]: [ Species.BASCULEGION, Species.DONDOZO ] }), [TrainerType.MATT]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("aqua_admin", "aqua", [ Species.SHARPEDO ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.SHELLY]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("aqua_admin_female", "aqua", [ Species.SHARPEDO ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.GALACTIC_GRUNT]: new TrainerConfig(++t).setHasGenders("Galactic Grunt Female").setHasDouble("Galactic Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.GLAMEOW, Species.STUNKY, Species.CROAGUNK, Species.SHINX, Species.WURMPLE, Species.BRONZOR, Species.DRIFLOON, Species.BURMY, Species.CARNIVINE ], - [TrainerPoolTier.UNCOMMON]: [ Species.LICKITUNG, Species.RHYHORN, Species.TANGELA, Species.ZUBAT, Species.YANMA, Species.SKORUPI, Species.GLIGAR, Species.SWINUB ], - [TrainerPoolTier.RARE]: [ Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH, Species.SNEASEL, Species.ELEKID, Species.MAGBY, Species.DUSKULL ], - [TrainerPoolTier.SUPER_RARE]: [ Species.ROTOM, Species.SPIRITOMB, Species.HISUI_SNEASEL ] + [TrainerPoolTier.COMMON]: [ Species.WURMPLE, Species.SHINX, Species.BURMY, Species.DRIFLOON, Species.GLAMEOW, Species.STUNKY, Species.BRONZOR, Species.CROAGUNK, Species.CARNIVINE ], + [TrainerPoolTier.UNCOMMON]: [ Species.ZUBAT, Species.LICKITUNG, Species.RHYHORN, Species.TANGELA, Species.YANMA, Species.GLIGAR, Species.SWINUB, Species.SKORUPI ], + [TrainerPoolTier.RARE]: [ Species.SNEASEL, Species.ELEKID, Species.MAGBY, Species.DUSKULL, Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH ], + [TrainerPoolTier.SUPER_RARE]: [ Species.SPIRITOMB, Species.ROTOM, Species.HISUI_SNEASEL ] }), [TrainerType.JUPITER]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander_female", "galactic", [ Species.SKUNTANK ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.MARS]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander_female", "galactic", [ Species.PURUGLY ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.SATURN]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander", "galactic", [ Species.TOXICROAK ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.PLASMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Plasma Grunt Female").setHasDouble("Plasma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.PATRAT, Species.LILLIPUP, Species.PURRLOIN, Species.SCRAFTY, Species.WOOBAT, Species.VANILLITE, Species.SANDILE, Species.TRUBBISH, Species.TYMPOLE ], - [TrainerPoolTier.UNCOMMON]: [ Species.FRILLISH, Species.VENIPEDE, Species.GOLETT, Species.TIMBURR, Species.DARUMAKA, Species.FOONGUS, Species.JOLTIK, Species.CUBCHOO, Species.KLINK ], - [TrainerPoolTier.RARE]: [ Species.PAWNIARD, Species.RUFFLET, Species.VULLABY, Species.ZORUA, Species.DRILBUR, Species.MIENFOO, Species.DURANT, Species.BOUFFALANT ], - [TrainerPoolTier.SUPER_RARE]: [ Species.DRUDDIGON, Species.HISUI_ZORUA, Species.AXEW, Species.DEINO ] + [TrainerPoolTier.COMMON]: [ Species.PATRAT, Species.LILLIPUP, Species.PURRLOIN, Species.WOOBAT, Species.TYMPOLE, Species.SANDILE, Species.SCRAGGY, Species.TRUBBISH, Species.VANILLITE ], + [TrainerPoolTier.UNCOMMON]: [ Species.TIMBURR, Species.VENIPEDE, Species.DARUMAKA, Species.FOONGUS, Species.FRILLISH, Species.JOLTIK, Species.KLINK, Species.CUBCHOO, Species.GOLETT ], + [TrainerPoolTier.RARE]: [ Species.DRILBUR, Species.ZORUA, Species.MIENFOO, Species.PAWNIARD, Species.BOUFFALANT, Species.RUFFLET, Species.VULLABY, Species.DURANT ], + [TrainerPoolTier.SUPER_RARE]: [ Species.AXEW, Species.DRUDDIGON, Species.DEINO, Species.HISUI_ZORUA ] }), [TrainerType.ZINZOLIN]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("plasma_sage", "plasma", [ Species.CRYOGONAL ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.COLRESS]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("plasma_boss", "plasma_2", [ Species.KLINKLANG ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_colress").setMixedBattleBgm("battle_colress").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.FLARE_GRUNT]: new TrainerConfig(++t).setHasGenders("Flare Grunt Female").setHasDouble("Flare Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.FLETCHLING, Species.LITLEO, Species.PONYTA, Species.INKAY, Species.HOUNDOUR, Species.SKORUPI, Species.SCRAFTY, Species.CROAGUNK, Species.SCATTERBUG, Species.ESPURR ], - [TrainerPoolTier.UNCOMMON]: [ Species.HELIOPTILE, Species.ELECTRIKE, Species.SKRELP, Species.PANCHAM, Species.PURRLOIN, Species.POOCHYENA, Species.BINACLE, Species.CLAUNCHER, Species.PUMPKABOO, Species.PHANTUMP, Species.FOONGUS ], - [TrainerPoolTier.RARE]: [ Species.LITWICK, Species.SNEASEL, Species.PAWNIARD, Species.SLIGGOO ], + [TrainerPoolTier.COMMON]: [ Species.PONYTA, Species.HOUNDOUR, Species.SKORUPI, Species.CROAGUNK, Species.SCRAGGY, Species.FLETCHLING, Species.SCATTERBUG, Species.LITLEO, Species.ESPURR, Species.INKAY ], + [TrainerPoolTier.UNCOMMON]: [ Species.POOCHYENA, Species.ELECTRIKE, Species.PURRLOIN, Species.FOONGUS, Species.PANCHAM, Species.BINACLE, Species.SKRELP, Species.CLAUNCHER, Species.HELIOPTILE, Species.PHANTUMP, Species.PUMPKABOO ], + [TrainerPoolTier.RARE]: [ Species.SNEASEL, Species.LITWICK, Species.PAWNIARD, Species.SLIGGOO ], [TrainerPoolTier.SUPER_RARE]: [ Species.NOIBAT, Species.HISUI_SLIGGOO, Species.HISUI_AVALUGG ] }), [TrainerType.BRYONY]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("flare_admin_female", "flare", [ Species.LIEPARD ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.XEROSIC]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("flare_admin", "flare", [ Species.MALAMAR ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.AETHER_GRUNT]: new TrainerConfig(++t).setHasGenders("Aether Grunt Female").setHasDouble("Aether Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aether_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.PIKIPEK, Species.ROCKRUFF, Species.ALOLA_DIGLETT, Species.ALOLA_EXEGGUTOR, Species.YUNGOOS, Species.CORSOLA, Species.ALOLA_GEODUDE, Species.ALOLA_RAICHU, Species.BOUNSWEET, Species.LILLIPUP, Species.KOMALA, Species.MORELULL, Species.COMFEY, Species.TOGEDEMARU ], - [TrainerPoolTier.UNCOMMON]: [ Species.POLIWAG, Species.STUFFUL, Species.ORANGURU, Species.PASSIMIAN, Species.BRUXISH, Species.MINIOR, Species.WISHIWASHI, Species.ALOLA_SANDSHREW, Species.ALOLA_VULPIX, Species.CRABRAWLER, Species.CUTIEFLY, Species.ORICORIO, Species.MUDBRAY, Species.PYUKUMUKU, Species.ALOLA_MAROWAK ], - [TrainerPoolTier.RARE]: [ Species.GALAR_CORSOLA, Species.TURTONATOR, Species.MIMIKYU, Species.MAGNEMITE, Species.DRAMPA ], - [TrainerPoolTier.SUPER_RARE]: [ Species.JANGMO_O, Species.PORYGON ] + [TrainerPoolTier.COMMON]: [ Species.CORSOLA, Species.LILLIPUP, Species.PIKIPEK, Species.YUNGOOS, Species.ROCKRUFF, Species.MORELULL, Species.BOUNSWEET, Species.COMFEY, Species.KOMALA, Species.TOGEDEMARU, Species.ALOLA_RAICHU, Species.ALOLA_DIGLETT, Species.ALOLA_GEODUDE, Species.ALOLA_EXEGGUTOR ], + [TrainerPoolTier.UNCOMMON]: [ Species.POLIWAG, Species.CRABRAWLER, Species.ORICORIO, Species.CUTIEFLY, Species.WISHIWASHI, Species.MUDBRAY, Species.STUFFUL, Species.ORANGURU, Species.PASSIMIAN, Species.PYUKUMUKU, Species.MINIOR, Species.BRUXISH, Species.ALOLA_SANDSHREW, Species.ALOLA_VULPIX, Species.ALOLA_MAROWAK ], + [TrainerPoolTier.RARE]: [ Species.MAGNEMITE, Species.TURTONATOR, Species.MIMIKYU, Species.DRAMPA, Species.GALAR_CORSOLA ], + [TrainerPoolTier.SUPER_RARE]: [ Species.PORYGON, Species.JANGMO_O ] }), [TrainerType.FABA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("aether_admin", "aether", [ Species.HYPNO ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aether_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.SKULL_GRUNT]: new TrainerConfig(++t).setHasGenders("Skull Grunt Female").setHasDouble("Skull Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_skull_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.SALANDIT, Species.ALOLA_RATTATA, Species.EKANS, Species.ALOLA_MEOWTH, Species.SCRAGGY, Species.KOFFING, Species.ALOLA_GRIMER, Species.MAREANIE, Species.SPINARAK, Species.TRUBBISH, Species.DROWZEE ], - [TrainerPoolTier.UNCOMMON]: [ Species.FOMANTIS, Species.SABLEYE, Species.SANDILE, Species.HOUNDOUR, Species.ALOLA_MAROWAK, Species.GASTLY, Species.PANCHAM, Species.ZUBAT, Species.VENIPEDE, Species.VULLABY ], - [TrainerPoolTier.RARE]: [ Species.SANDYGAST, Species.PAWNIARD, Species.MIMIKYU, Species.DHELMISE, Species.WISHIWASHI, Species.NYMBLE ], + [TrainerPoolTier.COMMON]: [ Species.EKANS, Species.DROWZEE, Species.KOFFING, Species.SPINARAK, Species.SCRAGGY, Species.TRUBBISH, Species.MAREANIE, Species.SALANDIT, Species.ALOLA_RATTATA, Species.ALOLA_MEOWTH, Species.ALOLA_GRIMER ], + [TrainerPoolTier.UNCOMMON]: [ Species.ZUBAT, Species.GASTLY, Species.HOUNDOUR, Species.SABLEYE, Species.VENIPEDE, Species.SANDILE, Species.VULLABY, Species.PANCHAM, Species.FOMANTIS, Species.ALOLA_MAROWAK ], + [TrainerPoolTier.RARE]: [ Species.PAWNIARD, Species.WISHIWASHI, Species.SANDYGAST, Species.MIMIKYU, Species.DHELMISE, Species.NYMBLE ], [TrainerPoolTier.SUPER_RARE]: [ Species.GRUBBIN, Species.DEWPIDER ] }), [TrainerType.PLUMERIA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("skull_admin", "skull", [ Species.SALAZZLE ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_skull_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), [TrainerType.MACRO_GRUNT]: new TrainerConfig(++t).setHasGenders("Macro Grunt Female").setHasDouble("Macro Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_macro_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()) .setSpeciesPools({ - [TrainerPoolTier.COMMON]: [ Species.CUFANT, Species.GALAR_MEOWTH, Species.KLINK, Species.ROOKIDEE, Species.CRAMORANT, Species.GALAR_ZIGZAGOON, Species.SKWOVET, Species.STEELIX, Species.MAWILE, Species.FERROSEED ], - [TrainerPoolTier.UNCOMMON]: [ Species.DRILBUR, Species.MAGNEMITE, Species.HATENNA, Species.ARROKUDA, Species.APPLIN, Species.GALAR_PONYTA, Species.GALAR_YAMASK, Species.SINISTEA, Species.RIOLU ], - [TrainerPoolTier.RARE]: [ Species.FALINKS, Species.BELDUM, Species.GALAR_FARFETCHD, Species.GALAR_MR_MIME, Species.HONEDGE, Species.SCIZOR, Species.GALAR_DARUMAKA ], + [TrainerPoolTier.COMMON]: [ Species.STEELIX, Species.MAWILE, Species.FERROSEED, Species.KLINK, Species.SKWOVET, Species.ROOKIDEE, Species.CRAMORANT, Species.CUFANT, Species.GALAR_MEOWTH, Species.GALAR_ZIGZAGOON ], + [TrainerPoolTier.UNCOMMON]: [ Species.MAGNEMITE, Species.RIOLU, Species.DRILBUR, Species.APPLIN, Species.ARROKUDA, Species.SINISTEA, Species.HATENNA, Species.GALAR_PONYTA, Species.GALAR_YAMASK ], + [TrainerPoolTier.RARE]: [ Species.SCIZOR, Species.BELDUM, Species.HONEDGE, Species.FALINKS, Species.GALAR_FARFETCHD, Species.GALAR_MR_MIME, Species.GALAR_DARUMAKA ], [TrainerPoolTier.SUPER_RARE]: [ Species.DURALUDON, Species.DREEPY ] }), [TrainerType.OLEANA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("macro_admin", "macro", [ Species.GARBODOR ]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_oleana").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(() => getEvilGruntPartyTemplate()), @@ -2225,7 +2225,11 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.DUGTRIO, Species.ALOLA_DUGTRIO ])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.HONCHKROW ])) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.NIDOQUEEN, Species.NIDOKING ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.RHYPERIOR ])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.RHYPERIOR ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.abilityIndex = 1; // Solid Rock + })) .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.KANGASKHAN ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); @@ -2234,20 +2238,32 @@ export const trainerConfigs: TrainerConfigs = { p.generateName(); })), [TrainerType.ROCKET_BOSS_GIOVANNI_2]: new TrainerConfig(++t).setName("Giovanni").initForEvilTeamLeader("Rocket Boss", [], true).setMixedBattleBgm("battle_rocket_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.TYRANITAR, Species.IRON_THORNS ], TrainerSlot.TRAINER, true, p => { + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.TYRANITAR ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HIPPOWDON ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.GARCHOMP, Species.EXCADRILL ])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GASTRODON, Species.SEISMITOAD ], TrainerSlot.TRAINER, true, p => { + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.GASTRODON, Species.SEISMITOAD ], TrainerSlot.TRAINER, true, p => { if (p.species.speciesId === Species.GASTRODON) { p.abilityIndex = 0; // Storm Drain } else if (p.species.speciesId === Species.SEISMITOAD) { p.abilityIndex = 2; // Water Absorb } })) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.GARCHOMP, Species.EXCADRILL ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + if (p.species.speciesId === Species.GARCHOMP) { + p.abilityIndex = 2; // Rough Skin + } else if (p.species.speciesId === Species.EXCADRILL) { + p.abilityIndex = 0; // Sand Rush + } + })) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.RHYPERIOR ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.abilityIndex = 1; // Solid Rock + })) .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.KANGASKHAN ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); @@ -2295,7 +2311,10 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.abilityIndex = 0; // Chlorophyll })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GREAT_TUSK ])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GREAT_TUSK ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ROGUE_BALL; + })) .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.CAMERUPT ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); @@ -2384,7 +2403,10 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); })) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.MAGNEZONE ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.UXIE, Species.MESPRIT, Species.AZELF ])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.UXIE, Species.MESPRIT, Species.AZELF ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ROGUE_BALL; + })) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.HOUNDOOM ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; @@ -2425,7 +2447,10 @@ export const trainerConfigs: TrainerConfigs = { p.formIndex = 0; })) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.KINGAMBIT ])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.VOLCARONA, Species.IRON_MOTH ])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.VOLCARONA, Species.IRON_MOTH ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ROGUE_BALL; + })) .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.HYDREIGON, Species.IRON_JUGULIS ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); @@ -2448,7 +2473,14 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.gender = Gender.MALE; })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.DRAGALGE, Species.CLAWITZER ])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.DRAGALGE, Species.CLAWITZER ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + if (p.species.speciesId === Species.DRAGALGE) { + p.abilityIndex = 2; // Adaptability + } else if (p.species.speciesId === Species.CLAWITZER) { + p.abilityIndex = 0; // Mega Launcher + } + })) .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GALLADE ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.abilityIndex = 1; // Sharpness @@ -2467,7 +2499,14 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.gender = Gender.MALE; })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.DRAGALGE, Species.CLAWITZER ])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.DRAGALGE, Species.CLAWITZER ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + if (p.species.speciesId === Species.DRAGALGE) { + p.abilityIndex = 2; // Adaptability + } else if (p.species.speciesId === Species.CLAWITZER) { + p.abilityIndex = 0; // Mega Launcher + } + })) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.AEGISLASH, Species.HISUI_GOODRA ])) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.IRON_VALIANT ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); @@ -2477,7 +2516,7 @@ export const trainerConfigs: TrainerConfigs = { p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; - p.formIndex = 1; // Mega Gyardos + p.formIndex = 1; // Mega Gyarados p.generateName(); p.gender = Gender.MALE; })) @@ -2597,11 +2636,26 @@ export const trainerConfigs: TrainerConfigs = { p.pokeball = PokeballType.ULTRA_BALL; })), [TrainerType.ROSE]: new TrainerConfig(++t).setName("Rose").initForEvilTeamLeader("Macro Boss", []).setMixedBattleBgm("battle_macro_boss").setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ARCHALUDON ])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.ESCAVALIER, Species.FERROTHORN ])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SIRFETCHD, Species.MR_RIME ])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.CORVIKNIGHT ])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.KLINKLANG, Species.PERRSERKER ])) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ARCHALUDON ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + })) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.ESCAVALIER, Species.FERROTHORN ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + })) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SIRFETCHD, Species.MR_RIME ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + })) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.CORVIKNIGHT ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + })) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.KLINKLANG, Species.PERRSERKER ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + })) .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.COPPERAJAH ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); @@ -2614,13 +2668,21 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ARCHALUDON ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + })) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.AEGISLASH, Species.GHOLDENGO ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; })) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.AEGISLASH, Species.GHOLDENGO ])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.DRACOZOLT, Species.DRACOVISH ], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); - p.abilityIndex = 1; //Strong Jaw Dracovish, Hustle Dracozolt + p.pokeball = PokeballType.ULTRA_BALL; + p.abilityIndex = 1; // Strong Jaw Dracovish, Hustle Dracozolt + })) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.MELMETAL ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; })) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.MELMETAL ])) .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GALAR_ARTICUNO, Species.GALAR_ZAPDOS, Species.GALAR_MOLTRES ], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); @@ -2666,7 +2728,10 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.formIndex = Utils.randSeedInt(5, 1); // Heat, Wash, Frost, Fan, or Mow })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.RAIKOU, Species.ENTEI, Species.SUICUNE ])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.RAIKOU, Species.ENTEI, Species.SUICUNE ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + })) .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.REVAVROOM ], TrainerSlot.TRAINER, true, p => { p.formIndex = Utils.randSeedInt(5, 1); // Random Starmobile form p.generateAndPopulateMoveset(); diff --git a/src/enums/battler-tag-type.ts b/src/enums/battler-tag-type.ts index f28ac37ae27..719b08c5b81 100644 --- a/src/enums/battler-tag-type.ts +++ b/src/enums/battler-tag-type.ts @@ -94,4 +94,5 @@ export enum BattlerTagType { PSYCHO_SHIFT = "PSYCHO_SHIFT", ENDURE_TOKEN = "ENDURE_TOKEN", POWDER = "POWDER", + MAGIC_COAT = "MAGIC_COAT", } diff --git a/src/field/arena.ts b/src/field/arena.ts index a46cce8c127..3e428e2072b 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -44,6 +44,11 @@ export class Arena { public bgm: string; public ignoreAbilities: boolean; public ignoringEffectSource: BattlerIndex | null; + /** + * Saves the number of times a party pokemon faints during a arena encounter. + * {@linkcode globalScene.currentBattle.enemyFaints} is the corresponding faint counter for the enemy (this resets every wave). + */ + public playerFaints: number; private lastTimeOfDay: TimeOfDay; @@ -52,12 +57,13 @@ export class Arena { public readonly eventTarget: EventTarget = new EventTarget(); - constructor(biome: Biome, bgm: string) { + constructor(biome: Biome, bgm: string, playerFaints: number = 0) { this.biomeType = biome; this.tags = []; this.bgm = bgm; this.trainerPool = biomeTrainerPools[biome]; this.updatePoolsForTimeOfDay(); + this.playerFaints = playerFaints; } init() { @@ -698,6 +704,7 @@ export class Arena { this.trySetWeather(WeatherType.NONE, false); } this.trySetTerrain(TerrainType.NONE, false, true); + this.resetPlayerFaintCount(); this.removeAllTags(); } @@ -776,11 +783,17 @@ export class Arena { return 0.000; case Biome.SNOWY_FOREST: return 3.047; + case Biome.END: + return 17.153; default: console.warn(`missing bgm loop-point for biome "${Biome[this.biomeType]}" (=${this.biomeType})`); return 0; } } + + resetPlayerFaintCount(): void { + this.playerFaints = 0; + } } export function getBiomeKey(biome: Biome): string { diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 8caa78aa7c9..5c6fbb34aea 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -7,7 +7,40 @@ import { variantColorCache } from "#app/data/variant"; import { variantData } from "#app/data/variant"; import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from "#app/ui/battle-info"; import type Move from "#app/data/move"; -import { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, VariableMoveTypeAttr, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatStagesAttr, SacrificialAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatStageChangeAttr, RechargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit, OneHitKOAccuracyAttr, RespectAttackTypeImmunityAttr, MoveTarget, CombinedPledgeStabBoostAttr, VariableMoveTypeChartAttr, HpSplitAttr } from "#app/data/move"; +import { + HighCritAttr, + StatChangeBeforeDmgCalcAttr, + HitsTagAttr, + applyMoveAttrs, + FixedDamageAttr, + VariableAtkAttr, + allMoves, + MoveCategory, + TypelessAttr, + CritOnlyAttr, + getMoveTargets, + OneHitKOAttr, + VariableMoveTypeAttr, + VariableDefAttr, + AttackMove, + ModifiedDamageAttr, + VariableMoveTypeMultiplierAttr, + IgnoreOpponentStatStagesAttr, + SacrificialAttr, + VariableMoveCategoryAttr, + CounterDamageAttr, + StatStageChangeAttr, + RechargeAttr, + IgnoreWeatherTypeDebuffAttr, + BypassBurnDamageReductionAttr, + SacrificialAttrOnHit, + OneHitKOAccuracyAttr, + RespectAttackTypeImmunityAttr, + MoveTarget, + CombinedPledgeStabBoostAttr, + VariableMoveTypeChartAttr, + HpSplitAttr +} from "#app/data/move"; import type { PokemonSpeciesForm } from "#app/data/pokemon-species"; import { default as PokemonSpecies, getFusedSpeciesName, getPokemonSpecies, getPokemonSpeciesForm } from "#app/data/pokemon-species"; import { getStarterValueFriendshipCap, speciesStarterCosts } from "#app/data/balance/starters"; @@ -947,11 +980,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param ignoreOppAbility during an attack, determines whether the opposing Pokemon's abilities should be ignored during the stat calculation. * @param isCritical determines whether a critical hit has occurred or not (`false` by default) * @param simulated if `true`, nullifies any effects that produce any changes to game state from triggering + * @param ignoreHeldItems determines whether this Pokemon's held items should be ignored during the stat calculation, default `false` * @returns the final in-battle value of a stat */ - getEffectiveStat(stat: EffectiveStat, opponent?: Pokemon, move?: Move, ignoreAbility: boolean = false, ignoreOppAbility: boolean = false, isCritical: boolean = false, simulated: boolean = true): number { + getEffectiveStat(stat: EffectiveStat, opponent?: Pokemon, move?: Move, ignoreAbility: boolean = false, ignoreOppAbility: boolean = false, isCritical: boolean = false, simulated: boolean = true, ignoreHeldItems: boolean = false): number { const statValue = new Utils.NumberHolder(this.getStat(stat, false)); - globalScene.applyModifiers(StatBoosterModifier, this.isPlayer(), this, stat, statValue); + if (!ignoreHeldItems) { + globalScene.applyModifiers(StatBoosterModifier, this.isPlayer(), this, stat, statValue); + } // The Ruin abilities here are never ignored, but they reveal themselves on summon anyway const fieldApplied = new Utils.BooleanHolder(false); @@ -965,7 +1001,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { applyStatMultiplierAbAttrs(StatMultiplierAbAttr, this, stat, statValue, simulated); } - let ret = statValue.value * this.getStatStageMultiplier(stat, opponent, move, ignoreOppAbility, isCritical, simulated); + let ret = statValue.value * this.getStatStageMultiplier(stat, opponent, move, ignoreOppAbility, isCritical, simulated, ignoreHeldItems); switch (stat) { case Stat.ATK: @@ -1063,6 +1099,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { globalScene.applyModifiers(PokemonBaseStatFlatModifier, this.isPlayer(), this, baseStats); if (this.isFusion()) { const fusionBaseStats = this.getFusionSpeciesForm(true).baseStats; + applyChallenges(globalScene.gameMode, ChallengeType.FLIP_STAT, this, fusionBaseStats); + for (const s of PERMANENT_STATS) { baseStats[s] = Math.ceil((baseStats[s] + fusionBaseStats[s]) / 2); } @@ -1284,6 +1322,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } else if (fusionType1 !== types[0]) { secondType = fusionType1; } + + + if (secondType === Type.UNKNOWN && Utils.isNullOrUndefined(fusionType2)) { // If second pokemon was monotype and shared its primary type + secondType = (customTypes && this.customPokemonData.types.length > 1 && this.customPokemonData.types[1] !== Type.UNKNOWN) + ? this.customPokemonData.types[1] : (speciesForm.type2 ?? Type.UNKNOWN); + } } else { // If not a fusion, just get the second type from the species, checking for permanent changes from ME secondType = (customTypes && this.customPokemonData.types.length > 1 && this.customPokemonData.types[1] !== Type.UNKNOWN) @@ -2487,9 +2531,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param ignoreOppAbility determines whether the effects of the opponent's abilities (i.e. Unaware) should be ignored (`false` by default) * @param isCritical determines whether a critical hit has occurred or not (`false` by default) * @param simulated determines whether effects are applied without altering game state (`true` by default) + * @param ignoreHeldItems determines whether this Pokemon's held items should be ignored during the stat calculation, default `false` * @return the stat stage multiplier to be used for effective stat calculation */ - getStatStageMultiplier(stat: EffectiveStat, opponent?: Pokemon, move?: Move, ignoreOppAbility: boolean = false, isCritical: boolean = false, simulated: boolean = true): number { + getStatStageMultiplier(stat: EffectiveStat, opponent?: Pokemon, move?: Move, ignoreOppAbility: boolean = false, isCritical: boolean = false, simulated: boolean = true, ignoreHeldItems: boolean = false): number { const statStage = new Utils.IntegerHolder(this.getStatStage(stat)); const ignoreStatStage = new Utils.BooleanHolder(false); @@ -2516,7 +2561,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (!ignoreStatStage.value) { const statStageMultiplier = new Utils.NumberHolder(Math.max(2, 2 + statStage.value) / Math.max(2, 2 - statStage.value)); - globalScene.applyModifiers(TempStatStageBoosterModifier, this.isPlayer(), stat, statStageMultiplier); + if (!ignoreHeldItems) { + globalScene.applyModifiers(TempStatStageBoosterModifier, this.isPlayer(), stat, statStageMultiplier); + } return Math.min(statStageMultiplier.value, 4); } return 1; @@ -2895,6 +2942,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { isCritical = false; } + /** + * Applies stat changes from {@linkcode move} and gives it to {@linkcode source} + * before damage calculation + */ + applyMoveAttrs(StatChangeBeforeDmgCalcAttr, source, this, move); + const { cancelled, result, damage: dmg } = this.getAttackDamage(source, move, false, false, isCritical, false); const typeBoost = source.findTag(t => t instanceof TypeBoostTag && t.boostedType === source.getMoveType(move)) as TypeBoostTag; @@ -3234,7 +3287,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } for (const tag of source.summonData.tags) { - if (!tag.isBatonPassable) { + if (!tag.isBatonPassable || (tag.tagType === BattlerTagType.TELEKINESIS && this.species.speciesId === Species.GENGAR && this.getFormKey() === "mega")) { continue; } @@ -3989,6 +4042,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } + if (fusionPixelColors.length === 0) { // ERROR HANDLING IS NOT OPTIONAL BUDDY + console.log("Failed to create fusion palette"); + return; + } + let paletteColors: Map; let fusionPaletteColors: Map; @@ -4002,8 +4060,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { Math.random = originalRandom; - paletteColors = paletteColors!; // tell TS compiler that paletteColors is defined! - fusionPaletteColors = fusionPaletteColors!; // TS compiler that fusionPaletteColors is defined! + paletteColors = paletteColors!; // erroneously tell TS compiler that paletteColors is defined! + fusionPaletteColors = fusionPaletteColors!; // mischievously misinform TS compiler that fusionPaletteColors is defined! const [ palette, fusionPalette ] = [ paletteColors, fusionPaletteColors ] .map(paletteColors => { let keys = Array.from(paletteColors.keys()).sort((a: number, b: number) => paletteColors.get(a)! < paletteColors.get(b)! ? 1 : -1); @@ -4356,8 +4414,12 @@ export class PlayerPokemon extends Pokemon { ].filter(d => !!d); const amount = new Utils.NumberHolder(friendship); globalScene.applyModifier(PokemonFriendshipBoosterModifier, true, this, amount); - const candyFriendshipMultiplier = globalScene.eventManager.getClassicFriendshipMultiplier(); - const starterAmount = new Utils.NumberHolder(Math.floor(amount.value * (globalScene.gameMode.isClassic ? candyFriendshipMultiplier : 1) / (fusionStarterSpeciesId ? 2 : 1))); + const candyFriendshipMultiplier = globalScene.gameMode.isClassic ? globalScene.eventManager.getClassicFriendshipMultiplier() : 1; + const fusionReduction = fusionStarterSpeciesId + ? globalScene.eventManager.areFusionsBoosted() ? 1.5 // Divide candy gain for fusions by 1.5 during events + : 2 // 2 for fusions outside events + : 1; // 1 for non-fused mons + const starterAmount = new Utils.NumberHolder(Math.floor(amount.value * candyFriendshipMultiplier / fusionReduction)); // Add friendship to this PlayerPokemon this.friendship = Math.min(this.friendship + amount.value, 255); diff --git a/src/loading-scene.ts b/src/loading-scene.ts index 023f907a30d..e8f817c1c39 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -5,7 +5,7 @@ import { SceneBase } from "#app/scene-base"; import { WindowVariant, getWindowVariantSuffix } from "#app/ui/ui-theme"; import { isMobile } from "#app/touch-controls"; import * as Utils from "#app/utils"; -import { initPokemonPrevolutions } from "#app/data/balance/pokemon-evolutions"; +import { initPokemonPrevolutions, initPokemonStarters } from "#app/data/balance/pokemon-evolutions"; import { initBiomes } from "#app/data/balance/biomes"; import { initEggMoves } from "#app/data/balance/egg-moves"; import { initPokemonForms } from "#app/data/pokemon-forms"; @@ -103,6 +103,8 @@ export class LoadingScene extends SceneBase { this.loadImage("icon_tera", "ui"); this.loadImage("type_tera", "ui"); this.loadAtlas("type_bgs", "ui"); + this.loadImage("mystery_egg", "ui"); + this.loadImage("normal_memory", "ui"); this.loadImage("dawn_icon_fg", "ui"); this.loadImage("dawn_icon_mg", "ui"); @@ -154,6 +156,7 @@ export class LoadingScene extends SceneBase { this.loadImage("scroll_bar_handle", "ui"); this.loadImage("starter_container_bg", "ui"); this.loadImage("starter_select_bg", "ui"); + this.loadImage("pokedex_summary_bg", "ui"); this.loadImage("select_cursor", "ui"); this.loadImage("select_cursor_highlight", "ui"); this.loadImage("select_cursor_highlight_thick", "ui"); @@ -246,9 +249,9 @@ export class LoadingScene extends SceneBase { } const availableLangs = [ "en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN" ]; if (lang && availableLangs.includes(lang)) { - this.loadImage("yearofthesnakeevent-" + lang, "events"); + this.loadImage("valentines2025event-" + lang, "events"); } else { - this.loadImage("yearofthesnakeevent-en", "events"); + this.loadImage("valentines2025event-en", "events"); } this.loadAtlas("statuses", ""); @@ -354,6 +357,7 @@ export class LoadingScene extends SceneBase { initVouchers(); initStatsKeys(); initPokemonPrevolutions(); + initPokemonStarters(); initBiomes(); initEggMoves(); initPokemonForms(); diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index b65f1b53441..da2ab49e9fc 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -2,7 +2,7 @@ import { globalScene } from "#app/global-scene"; import { EvolutionItem, pokemonEvolutions } from "#app/data/balance/pokemon-evolutions"; import { tmPoolTiers, tmSpecies } from "#app/data/balance/tms"; import { getBerryEffectDescription, getBerryName } from "#app/data/berry"; -import { allMoves, AttackMove, selfStatLowerMoves } from "#app/data/move"; +import { allMoves, AttackMove } from "#app/data/move"; import { getNatureName, getNatureStatMultiplier } from "#app/data/nature"; import { getPokeballCatchMultiplier, getPokeballName, MAX_PER_TYPE_POKEBALLS } from "#app/data/pokeball"; import { FormChangeItem, pokemonFormChanges, SpeciesFormChangeCondition, SpeciesFormChangeItemTrigger } from "#app/data/pokemon-forms"; @@ -1720,7 +1720,16 @@ const modifierPool: ModifierPool = { }, 4), new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 3), new WeightedModifierType(modifierTypes.TERA_SHARD, 1), - new WeightedModifierType(modifierTypes.DNA_SPLICERS, (party: Pokemon[]) => globalScene.gameMode.isSplicedOnly && party.filter(p => !p.fusionSpecies).length > 1 ? 4 : 0), + new WeightedModifierType(modifierTypes.DNA_SPLICERS, (party: Pokemon[]) => { + if (party.filter(p => !p.fusionSpecies).length > 1) { + if (globalScene.gameMode.isSplicedOnly) { + return 4; + } else if (globalScene.gameMode.isClassic && globalScene.eventManager.areFusionsBoosted()) { + return 2; + } + } + return 0; + }, 4), new WeightedModifierType(modifierTypes.VOUCHER, (_party: Pokemon[], rerollCount: number) => !globalScene.gameMode.isDaily ? Math.max(1 - rerollCount, 0) : 0, 1), ].map(m => { m.setTier(ModifierTier.GREAT); return m; @@ -1824,14 +1833,6 @@ const modifierPool: ModifierPool = { return false; }) ? 10 : 0; }, 10), - new WeightedModifierType(modifierTypes.WHITE_HERB, (party: Pokemon[]) => { - const checkedAbilities = [ Abilities.WEAK_ARMOR, Abilities.CONTRARY, Abilities.MOODY, Abilities.ANGER_SHELL, Abilities.COMPETITIVE, Abilities.DEFIANT ]; - const weightMultiplier = party.filter( - p => !p.getHeldItems().some(i => i instanceof ResetNegativeStatStageModifier && i.stackCount >= i.getMaxHeldItemCount(p)) && - (checkedAbilities.some(a => p.hasAbility(a, false, true)) || p.getMoveset(true).some(m => m && selfStatLowerMoves.includes(m.moveId)))).length; - // If a party member has one of the above moves or abilities and doesn't have max herbs, the herb will appear more frequently - return 0 * (weightMultiplier ? 2 : 1) + (weightMultiplier ? weightMultiplier * 0 : 0); - }, 10), new WeightedModifierType(modifierTypes.REVIVER_SEED, 4), new WeightedModifierType(modifierTypes.CANDY_JAR, skipInLastClassicWaveOrDefault(5)), new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 9), @@ -1841,10 +1842,9 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.IV_SCANNER, skipInLastClassicWaveOrDefault(4)), new WeightedModifierType(modifierTypes.EXP_CHARM, skipInLastClassicWaveOrDefault(8)), new WeightedModifierType(modifierTypes.EXP_SHARE, skipInLastClassicWaveOrDefault(10)), - new WeightedModifierType(modifierTypes.EXP_BALANCE, skipInLastClassicWaveOrDefault(3)), new WeightedModifierType(modifierTypes.TERA_ORB, () => Math.min(Math.max(Math.floor(globalScene.currentBattle.waveIndex / 50) * 2, 1), 4), 4), new WeightedModifierType(modifierTypes.QUICK_CLAW, 3), - new WeightedModifierType(modifierTypes.WIDE_LENS, 4), + new WeightedModifierType(modifierTypes.WIDE_LENS, 7), ].map(m => { m.setTier(ModifierTier.ULTRA); return m; }), @@ -1858,8 +1858,7 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.SCOPE_LENS, 4), new WeightedModifierType(modifierTypes.BATON, 2), new WeightedModifierType(modifierTypes.SOUL_DEW, 7), - //new WeightedModifierType(modifierTypes.OVAL_CHARM, 6), - new WeightedModifierType(modifierTypes.CATCHING_CHARM, () => globalScene.gameMode.isDaily || (!globalScene.gameMode.isFreshStartChallenge() && globalScene.gameData.getSpeciesCount(d => !!d.caughtAttr) > 100) ? 4 : 0, 4), + new WeightedModifierType(modifierTypes.CATCHING_CHARM, () => !globalScene.gameMode.isClassic ? 4 : 0, 4), new WeightedModifierType(modifierTypes.ABILITY_CHARM, skipInClassicAfterWave(189, 6)), new WeightedModifierType(modifierTypes.FOCUS_BAND, 5), new WeightedModifierType(modifierTypes.KINGS_ROCK, 3), @@ -1879,7 +1878,7 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.MULTI_LENS, 18), new WeightedModifierType(modifierTypes.VOUCHER_PREMIUM, (_party: Pokemon[], rerollCount: number) => !globalScene.gameMode.isDaily && !globalScene.gameMode.isEndless && !globalScene.gameMode.isSplicedOnly ? Math.max(5 - rerollCount * 2, 0) : 0, 5), - new WeightedModifierType(modifierTypes.DNA_SPLICERS, (party: Pokemon[]) => !globalScene.gameMode.isSplicedOnly && party.filter(p => !p.fusionSpecies).length > 1 ? 24 : 0, 24), + new WeightedModifierType(modifierTypes.DNA_SPLICERS, (party: Pokemon[]) => !(globalScene.gameMode.isClassic && globalScene.eventManager.areFusionsBoosted()) && !globalScene.gameMode.isSplicedOnly && party.filter(p => !p.fusionSpecies).length > 1 ? 24 : 0, 24), new WeightedModifierType(modifierTypes.MINI_BLACK_HOLE, () => (globalScene.gameMode.isDaily || (!globalScene.gameMode.isFreshStartChallenge() && globalScene.gameData.isUnlocked(Unlockables.MINI_BLACK_HOLE))) ? 1 : 0, 1), ].map(m => { m.setTier(ModifierTier.MASTER); return m; @@ -2538,7 +2537,7 @@ export function getPartyLuckValue(party: Pokemon[]): number { return DailyLuck.value; } const eventSpecies = globalScene.eventManager.getEventLuckBoostedSpecies(); - const luck = Phaser.Math.Clamp(party.map(p => p.isAllowedInBattle() ? p.getLuck() + (eventSpecies.includes(p.species.speciesId) ? 1 : 0) : 0) + const luck = Phaser.Math.Clamp(party.map(p => p.isAllowedInBattle() ? p.getLuck() + (eventSpecies.includes(p.species.speciesId) ? 3 : 0) : 0) .reduce((total: number, value: number) => total += value, 0), 0, 14); return Math.min(globalScene.eventManager.getEventLuckBoost() + (luck ?? 0), 14); } diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index 37f88deea7f..d955385ecee 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -165,9 +165,9 @@ export abstract class PersistentModifier extends Modifier { public stackCount: number; public virtualStackCount: number; - constructor(type: ModifierType, stackCount?: number) { + constructor(type: ModifierType, stackCount: number = 1) { super(type); - this.stackCount = stackCount === undefined ? 1 : stackCount; + this.stackCount = stackCount; this.virtualStackCount = 0; } @@ -3295,7 +3295,7 @@ export class ContactHeldItemTransferChanceModifier extends HeldItemTransferModif export class IvScannerModifier extends PersistentModifier { constructor(type: ModifierType, stackCount?: number) { - super(type, stackCount); + super(type); } match(modifier: Modifier): boolean { @@ -3303,7 +3303,7 @@ export class IvScannerModifier extends PersistentModifier { } clone(): IvScannerModifier { - return new IvScannerModifier(this.type, this.stackCount); + return new IvScannerModifier(this.type); } /** @@ -3311,11 +3311,11 @@ export class IvScannerModifier extends PersistentModifier { * @returns always `true` */ override apply(): boolean { - return true; + return true; //Dude are you kidding me } getMaxStackCount(): number { - return 3; + return 1; } } diff --git a/src/phases/egg-hatch-phase.ts b/src/phases/egg-hatch-phase.ts index 2d0aa24dd1f..b2844591e33 100644 --- a/src/phases/egg-hatch-phase.ts +++ b/src/phases/egg-hatch-phase.ts @@ -3,7 +3,6 @@ import { globalScene } from "#app/global-scene"; import type { Egg } from "#app/data/egg"; import { EggCountChangedEvent } from "#app/events/egg"; import type { PlayerPokemon } from "#app/field/pokemon"; -import { getPokemonNameWithAffix } from "#app/messages"; import { Phase } from "#app/phase"; import { achvs } from "#app/system/achv"; import EggCounterContainer from "#app/ui/egg-counter-container"; @@ -356,7 +355,7 @@ export class EggHatchPhase extends Phase { globalScene.playSoundWithoutBgm("evolution_fanfare"); - globalScene.ui.showText(i18next.t("egg:hatchFromTheEgg", { pokemonName: getPokemonNameWithAffix(this.pokemon) }), null, () => { + globalScene.ui.showText(i18next.t("egg:hatchFromTheEgg", { pokemonName: this.pokemon.species.getExpandedSpeciesName() }), null, () => { globalScene.gameData.updateSpeciesDexIvs(this.pokemon.species.speciesId, this.pokemon.ivs); globalScene.gameData.setPokemonCaught(this.pokemon, true, true).then(() => { globalScene.gameData.setEggMoveUnlocked(this.pokemon.species, this.eggMoveIndex).then((value) => { diff --git a/src/phases/encounter-phase.ts b/src/phases/encounter-phase.ts index 7e62ca17f7c..1dd275ab130 100644 --- a/src/phases/encounter-phase.ts +++ b/src/phases/encounter-phase.ts @@ -478,7 +478,7 @@ export class EncounterPhase extends BattlePhase { })); const ivScannerModifier = globalScene.findModifier(m => m instanceof IvScannerModifier); if (ivScannerModifier) { - enemyField.map(p => globalScene.pushPhase(new ScanIvsPhase(p.getBattlerIndex(), Math.min(ivScannerModifier.getStackCount() * 2, 6)))); + enemyField.map(p => globalScene.pushPhase(new ScanIvsPhase(p.getBattlerIndex()))); } } diff --git a/src/phases/evolution-phase.ts b/src/phases/evolution-phase.ts index 533edd320e3..12d2923ec36 100644 --- a/src/phases/evolution-phase.ts +++ b/src/phases/evolution-phase.ts @@ -270,7 +270,7 @@ export class EvolutionPhase extends Phase { globalScene.playSoundWithoutBgm("evolution_fanfare"); evolvedPokemon.destroy(); - globalScene.ui.showText(i18next.t("menu:evolutionDone", { pokemonName: this.preEvolvedPokemonName, evolvedPokemonName: this.pokemon.name }), null, () => this.end(), null, true, Utils.fixedInt(4000)); + globalScene.ui.showText(i18next.t("menu:evolutionDone", { pokemonName: this.preEvolvedPokemonName, evolvedPokemonName: this.pokemon.species.getExpandedSpeciesName() }), null, () => this.end(), null, true, Utils.fixedInt(4000)); globalScene.time.delayedCall(Utils.fixedInt(4250), () => globalScene.playBgm()); }); }); diff --git a/src/phases/faint-phase.ts b/src/phases/faint-phase.ts index 4a0c7ead123..340c5362087 100644 --- a/src/phases/faint-phase.ts +++ b/src/phases/faint-phase.ts @@ -96,10 +96,9 @@ export class FaintPhase extends PokemonPhase { doFaint(): void { const pokemon = this.getPokemon(); - - // Track total times pokemon have been KO'd for supreme overlord/last respects + // Track total times pokemon have been KO'd for Last Respects/Supreme Overlord if (pokemon.isPlayer()) { - globalScene.currentBattle.playerFaints += 1; + globalScene.arena.playerFaints += 1; globalScene.currentBattle.playerFaintsHistory.push({ pokemon: pokemon, turn: globalScene.currentBattle.turn }); } else { globalScene.currentBattle.enemyFaints += 1; @@ -119,7 +118,8 @@ export class FaintPhase extends PokemonPhase { const alivePlayField = globalScene.getField(true); alivePlayField.forEach(p => applyPostKnockOutAbAttrs(PostKnockOutAbAttr, p, pokemon)); if (pokemon.turnData?.attacksReceived?.length) { - const defeatSource = globalScene.getPokemonById(pokemon.turnData.attacksReceived[0].sourceId); + const defeatSource = this.source; + if (defeatSource?.isOnField()) { applyPostVictoryAbAttrs(PostVictoryAbAttr, defeatSource); const pvmove = allMoves[pokemon.turnData.attacksReceived[0].move]; diff --git a/src/phases/game-over-phase.ts b/src/phases/game-over-phase.ts index 5e4e8e1cdf7..d4b529fe00e 100644 --- a/src/phases/game-over-phase.ts +++ b/src/phases/game-over-phase.ts @@ -249,7 +249,8 @@ export class GameOverPhase extends BattlePhase { timestamp: new Date().getTime(), challenges: globalScene.gameMode.challenges.map(c => new ChallengeData(c)), mysteryEncounterType: globalScene.currentBattle.mysteryEncounter?.encounterType ?? -1, - mysteryEncounterSaveData: globalScene.mysteryEncounterSaveData + mysteryEncounterSaveData: globalScene.mysteryEncounterSaveData, + playerFaints: globalScene.arena.playerFaints } as SessionSaveData; } } diff --git a/src/phases/move-effect-phase.ts b/src/phases/move-effect-phase.ts index fff8caf38b5..35fe446fc43 100644 --- a/src/phases/move-effect-phase.ts +++ b/src/phases/move-effect-phase.ts @@ -12,6 +12,7 @@ import { PostAttackAbAttr, PostDamageAbAttr, PostDefendAbAttr, + ReflectStatusMoveAbAttr, TypeImmunityAbAttr, } from "#app/data/ability"; import { ArenaTagSide, ConditionalProtectTag } from "#app/data/arena-tag"; @@ -31,6 +32,7 @@ import { AttackMove, DelayedAttackAttr, FlinchAttr, + getMoveTargets, HitsTagAttr, MissEffectAttr, MoveCategory, @@ -47,7 +49,7 @@ import { } from "#app/data/move"; import { SpeciesFormChangePostMoveTrigger } from "#app/data/pokemon-forms"; import { Type } from "#enums/type"; -import type { PokemonMove } from "#app/field/pokemon"; +import { PokemonMove } from "#app/field/pokemon"; import type Pokemon from "#app/field/pokemon"; import { HitResult, MoveResult } from "#app/field/pokemon"; import { getPokemonNameWithAffix } from "#app/messages"; @@ -60,17 +62,27 @@ import { } from "#app/modifier/modifier"; import { PokemonPhase } from "#app/phases/pokemon-phase"; import { BooleanHolder, executeIf, isNullOrUndefined, NumberHolder } from "#app/utils"; +import { type nil } from "#app/utils"; import { BattlerTagType } from "#enums/battler-tag-type"; import type { Moves } from "#enums/moves"; import i18next from "i18next"; +import type { Phase } from "#app/phase"; +import { ShowAbilityPhase } from "./show-ability-phase"; +import { MovePhase } from "./move-phase"; +import { MoveEndPhase } from "./move-end-phase"; export class MoveEffectPhase extends PokemonPhase { public move: PokemonMove; protected targets: BattlerIndex[]; + protected reflected: boolean = false; - constructor(battlerIndex: BattlerIndex, targets: BattlerIndex[], move: PokemonMove) { + /** + * @param reflected Indicates that the move was reflected by the user due to magic coat or magic bounce + */ + constructor(battlerIndex: BattlerIndex, targets: BattlerIndex[], move: PokemonMove, reflected: boolean = false) { super(battlerIndex); this.move = move; + this.reflected = reflected; /** * In double battles, if the right Pokemon selects a spread move and the left Pokemon dies * with no party members available to switch in, then the right Pokemon takes the index @@ -95,6 +107,13 @@ export class MoveEffectPhase extends PokemonPhase { return super.end(); } + /** If an enemy used this move, set this as last enemy that used move or ability */ + if (!user.isPlayer()) { + globalScene.currentBattle.lastEnemyInvolved = this.fieldIndex; + } else { + globalScene.currentBattle.lastPlayerInvolved = this.fieldIndex; + } + const isDelayedAttack = this.move.getMove().hasAttr(DelayedAttackAttr); /** If the user was somehow removed from the field and it's not a delayed attack, end this phase */ if (!user.isOnField()) { @@ -177,12 +196,14 @@ export class MoveEffectPhase extends PokemonPhase { && (targets[0]?.getAbility()?.getAttrs(TypeImmunityAbAttr)?.[0]?.getImmuneType() === user.getMoveType(move)) && !targets[0]?.getTag(SemiInvulnerableTag); + const mayBounce = move.hasFlag(MoveFlags.REFLECTABLE) && !this.reflected && targets.some(t => t.hasAbilityWithAttr(ReflectStatusMoveAbAttr) || !!t.getTag(BattlerTagType.MAGIC_COAT)); + /** - * If no targets are left for the move to hit (FAIL), or the invoked move is single-target + * If no targets are left for the move to hit (FAIL), or the invoked move is non-reflectable, single-target * (and not random target) and failed the hit check against its target (MISS), log the move * as FAILed or MISSed (depending on the conditions above) and end this phase. */ - if (!hasActiveTargets || (!move.hasAttr(VariableTargetAttr) && !move.isMultiTarget() && !targetHitChecks[this.targets[0]] && !targets[0].getTag(ProtectedTag) && !isImmune)) { + if (!hasActiveTargets || (!mayBounce && !move.hasAttr(VariableTargetAttr) && !move.isMultiTarget() && !targetHitChecks[this.targets[0]] && !targets[0].getTag(ProtectedTag) && !isImmune)) { this.stopMultiHit(); if (hasActiveTargets) { globalScene.queueMessage(i18next.t("battle:attackMissed", { pokemonNameWithAffix: this.getFirstTarget() ? getPokemonNameWithAffix(this.getFirstTarget()!) : "" })); @@ -204,12 +225,21 @@ export class MoveEffectPhase extends PokemonPhase { new MoveAnim(move.id as Moves, user, this.getFirstTarget()!.getBattlerIndex(), playOnEmptyField).play(move.hitsSubstitute(user, this.getFirstTarget()!), () => { /** Has the move successfully hit a target (for damage) yet? */ let hasHit: boolean = false; - for (const target of targets) { - // Prevent ENEMY_SIDE targeted moves from occurring twice in double battles - if (move.moveTarget === MoveTarget.ENEMY_SIDE && target !== targets[targets.length - 1]) { - continue; - } + // Prevent ENEMY_SIDE targeted moves from occurring twice in double battles + // and check which target will magic bounce. + const trueTargets: Pokemon[] = move.moveTarget !== MoveTarget.ENEMY_SIDE ? targets : (() => { + const magicCoatTargets = targets.filter(t => t.getTag(BattlerTagType.MAGIC_COAT) || t.hasAbilityWithAttr(ReflectStatusMoveAbAttr)); + + // only magic coat effect cares about order + if (!mayBounce || magicCoatTargets.length === 0) { + return [ targets[0] ]; + } + return [ magicCoatTargets[0] ]; + })(); + + const queuedPhases: Phase[] = []; + for (const target of trueTargets) { /** The {@linkcode ArenaTagSide} to which the target belongs */ const targetSide = target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; /** Has the invoked move been cancelled by conditional protection (e.g Quick Guard)? */ @@ -222,7 +252,7 @@ export class MoveEffectPhase extends PokemonPhase { } /** Is the target protected by Protect, etc. or a relevant conditional protection effect? */ - const isProtected = ( + const isProtected = !([ MoveTarget.ENEMY_SIDE, MoveTarget.BOTH_SIDES ].includes(this.move.getMove().moveTarget)) && ( bypassIgnoreProtect.value || !this.move.getMove().checkFlag(MoveFlags.IGNORE_PROTECT, user, target)) && (hasConditionalProtectApplied.value @@ -231,13 +261,39 @@ export class MoveEffectPhase extends PokemonPhase { || (this.move.getMove().category !== MoveCategory.STATUS && target.findTags(t => t instanceof DamageProtectedTag).find(t => target.lapseTag(t.tagType)))); + /** Is the target hidden by the effects of its Commander ability? */ + const isCommanding = globalScene.currentBattle.double && target.getAlly()?.getTag(BattlerTagType.COMMANDED)?.getSourcePokemon() === target; + + /** Is the target reflecting status moves from the magic coat move? */ + const isReflecting = !!target.getTag(BattlerTagType.MAGIC_COAT); + + /** Is the target's magic bounce ability not ignored and able to reflect this move? */ + const canMagicBounce = !isReflecting && !move.checkFlag(MoveFlags.IGNORE_ABILITIES, user, target) && target.hasAbilityWithAttr(ReflectStatusMoveAbAttr); + + const semiInvulnerableTag = target.getTag(SemiInvulnerableTag); + + /** Is the target reflecting the effect, not protected, and not in an semi-invulnerable state?*/ + const willBounce = (!isProtected && !this.reflected && !isCommanding + && move.hasFlag(MoveFlags.REFLECTABLE) + && (isReflecting || canMagicBounce) + && !semiInvulnerableTag); + + // If the move will bounce, then queue the bounce and move on to the next target + if (!target.switchOutStatus && willBounce) { + const newTargets = move.isMultiTarget() ? getMoveTargets(target, move.id).targets : [ user.getBattlerIndex() ]; + if (!isReflecting) { + queuedPhases.push(new ShowAbilityPhase(target.getBattlerIndex(), target.getPassiveAbility().hasAttr(ReflectStatusMoveAbAttr))); + } + + queuedPhases.push(new MovePhase(target, newTargets, new PokemonMove(move.id, 0, 0, true), true, true, true)); + continue; + } + /** Is the pokemon immune due to an ablility, and also not in a semi invulnerable state? */ const isImmune = target.hasAbilityWithAttr(TypeImmunityAbAttr) && (target.getAbility()?.getAttrs(TypeImmunityAbAttr)?.[0]?.getImmuneType() === user.getMoveType(move)) - && !target.getTag(SemiInvulnerableTag); + && !semiInvulnerableTag; - /** Is the target hidden by the effects of its Commander ability? */ - const isCommanding = globalScene.currentBattle.double && target.getAlly()?.getTag(BattlerTagType.COMMANDED)?.getSourcePokemon() === target; /** * If the move missed a target, stop all future hits against that target @@ -364,6 +420,10 @@ export class MoveEffectPhase extends PokemonPhase { applyAttrs.push(k); } + // Apply queued phases + if (queuedPhases.length) { + globalScene.appendToPhase(queuedPhases, MoveEndPhase); + } // Apply the move's POST_TARGET effects on the move's last hit, after all targeted effects have resolved const postTarget = (user.turnData.hitsLeft === 1 || !this.getFirstTarget()?.isActive()) ? applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.POST_TARGET, user, null, move) : @@ -579,12 +639,7 @@ export class MoveEffectPhase extends PokemonPhase { } } - if (user.hasAbilityWithAttr(AlwaysHitAbAttr) || target.hasAbilityWithAttr(AlwaysHitAbAttr)) { - return true; - } - - // If the user should ignore accuracy on a target, check who the user targeted last turn and see if they match - if (user.getTag(BattlerTagType.IGNORE_ACCURACY) && (user.getLastXMoves().find(() => true)?.targets || []).indexOf(target.getBattlerIndex()) !== -1) { + if (this.checkBypassAccAndInvuln(target)) { return true; } @@ -592,15 +647,12 @@ export class MoveEffectPhase extends PokemonPhase { return true; } - if (target.getTag(BattlerTagType.TELEKINESIS) && !target.getTag(SemiInvulnerableTag) && !this.move.getMove().hasAttr(OneHitKOAttr)) { + const semiInvulnerableTag = target.getTag(SemiInvulnerableTag); + if (target.getTag(BattlerTagType.TELEKINESIS) && !semiInvulnerableTag && !this.move.getMove().hasAttr(OneHitKOAttr)) { return true; } - const semiInvulnerableTag = target.getTag(SemiInvulnerableTag); - if (semiInvulnerableTag - && !this.move.getMove().getAttrs(HitsTagAttr).some(hta => hta.tagType === semiInvulnerableTag.tagType) - && !(this.move.getMove().hasAttr(ToxicAccuracyAttr) && user.isOfType(Type.POISON)) - ) { + if (semiInvulnerableTag && !this.checkBypassSemiInvuln(semiInvulnerableTag)) { return false; } @@ -616,6 +668,52 @@ export class MoveEffectPhase extends PokemonPhase { return rand < (moveAccuracy * accuracyMultiplier); } + /** + * Check whether the move should bypass *both* the accuracy *and* semi-invulnerable states. + * @param target - The {@linkcode Pokemon} targeted by the invoked move + * @returns `true` if the move should bypass accuracy and semi-invulnerability + * + * Accuracy and semi-invulnerability can be bypassed by: + * - An ability like {@linkcode Abilities.NO_GUARD | No Guard} + * - A poison type using {@linkcode Moves.TOXIC | Toxic} + * - A move like {@linkcode Moves.LOCK_ON | Lock-On} or {@linkcode Moves.MIND_READER | Mind Reader}. + * + * Does *not* check against effects {@linkcode Moves.GLAIVE_RUSH | Glaive Rush} status (which + * should not bypass semi-invulnerability), or interactions like Earthquake hitting against Dig, + * (which should not bypass the accuracy check). + * + * @see {@linkcode hitCheck} + */ + public checkBypassAccAndInvuln(target: Pokemon) { + const user = this.getUserPokemon(); + if (!user) { + return false; + } + if (user.hasAbilityWithAttr(AlwaysHitAbAttr) || target.hasAbilityWithAttr(AlwaysHitAbAttr)) { + return true; + } + if ((this.move.getMove().hasAttr(ToxicAccuracyAttr) && user.isOfType(Type.POISON))) { + return true; + } + // TODO: Fix lock on / mind reader check. + if (user.getTag(BattlerTagType.IGNORE_ACCURACY) && (user.getLastXMoves().find(() => true)?.targets || []).indexOf(target.getBattlerIndex()) !== -1) { + return true; + } + } + + /** + * Check whether the move is able to ignore the given `semiInvulnerableTag` + * @param semiInvulnerableTag - The semiInvulnerbale tag to check against + * @returns `true` if the move can ignore the semi-invulnerable state + */ + public checkBypassSemiInvuln(semiInvulnerableTag: SemiInvulnerableTag | nil): boolean { + if (!semiInvulnerableTag) { + return false; + } + const move = this.move.getMove(); + return move.getAttrs(HitsTagAttr).some(hta => hta.tagType === semiInvulnerableTag.tagType); + } + /** @returns The {@linkcode Pokemon} using this phase's invoked move */ public getUserPokemon(): Pokemon | null { if (this.battlerIndex > BattlerIndex.ENEMY_2) { diff --git a/src/phases/move-phase.ts b/src/phases/move-phase.ts index 5330540c8b2..9d32189edb5 100644 --- a/src/phases/move-phase.ts +++ b/src/phases/move-phase.ts @@ -58,6 +58,7 @@ export class MovePhase extends BattlePhase { protected ignorePp: boolean; protected failed: boolean = false; protected cancelled: boolean = false; + protected reflected: boolean = false; public get pokemon(): Pokemon { return this._pokemon; @@ -84,10 +85,12 @@ export class MovePhase extends BattlePhase { } /** - * @param followUp Indicates that the move being uses is a "follow-up" - for example, a move being used by Metronome or Dancer. + * @param followUp Indicates that the move being used is a "follow-up" - for example, a move being used by Metronome or Dancer. * Follow-ups bypass a few failure conditions, including flinches, sleep/paralysis/freeze and volatile status checks, etc. + * @param reflected Indicates that the move was reflected by Magic Coat or Magic Bounce. + * Reflected moves cannot be reflected again and will not trigger Dancer. */ - constructor(pokemon: Pokemon, targets: BattlerIndex[], move: PokemonMove, followUp: boolean = false, ignorePp: boolean = false) { + constructor(pokemon: Pokemon, targets: BattlerIndex[], move: PokemonMove, followUp: boolean = false, ignorePp: boolean = false, reflected: boolean = false) { super(); this.pokemon = pokemon; @@ -95,6 +98,7 @@ export class MovePhase extends BattlePhase { this.move = move; this.followUp = followUp; this.ignorePp = ignorePp; + this.reflected = reflected; } /** @@ -140,7 +144,7 @@ export class MovePhase extends BattlePhase { } // Check move to see if arena.ignoreAbilities should be true. - if (!this.followUp) { + if (!this.followUp || this.reflected) { if (this.move.getMove().checkFlag(MoveFlags.IGNORE_ABILITIES, this.pokemon, null)) { globalScene.arena.setIgnoreAbilities(true, this.pokemon.getBattlerIndex()); } @@ -335,7 +339,7 @@ export class MovePhase extends BattlePhase { */ if (success) { applyPreAttackAbAttrs(PokemonTypeChangeAbAttr, this.pokemon, null, this.move.getMove()); - globalScene.unshiftPhase(new MoveEffectPhase(this.pokemon.getBattlerIndex(), this.targets, this.move)); + globalScene.unshiftPhase(new MoveEffectPhase(this.pokemon.getBattlerIndex(), this.targets, this.move, this.reflected)); } else { if ([ Moves.ROAR, Moves.WHIRLWIND, Moves.TRICK_OR_TREAT, Moves.FORESTS_CURSE ].includes(this.move.moveId)) { @@ -543,7 +547,7 @@ export class MovePhase extends BattlePhase { return; } - globalScene.queueMessage(i18next.t("battle:useMove", { + globalScene.queueMessage(i18next.t(this.reflected ? "battle:magicCoatActivated" : "battle:useMove", { pokemonNameWithAffix: getPokemonNameWithAffix(this.pokemon), moveName: this.move.getName() }), 500); diff --git a/src/phases/mystery-encounter-phases.ts b/src/phases/mystery-encounter-phases.ts index be07dbfc196..da78f59535f 100644 --- a/src/phases/mystery-encounter-phases.ts +++ b/src/phases/mystery-encounter-phases.ts @@ -396,7 +396,7 @@ export class MysteryEncounterBattlePhase extends Phase { if (encounterMode !== MysteryEncounterMode.TRAINER_BATTLE) { const ivScannerModifier = globalScene.findModifier(m => m instanceof IvScannerModifier); if (ivScannerModifier) { - enemyField.map(p => globalScene.pushPhase(new ScanIvsPhase(p.getBattlerIndex(), Math.min(ivScannerModifier.getStackCount() * 2, 6)))); + enemyField.map(p => globalScene.pushPhase(new ScanIvsPhase(p.getBattlerIndex()))); } } diff --git a/src/phases/scan-ivs-phase.ts b/src/phases/scan-ivs-phase.ts index 519d7913b79..9230844ff9b 100644 --- a/src/phases/scan-ivs-phase.ts +++ b/src/phases/scan-ivs-phase.ts @@ -1,7 +1,6 @@ import { globalScene } from "#app/global-scene"; import type { BattlerIndex } from "#app/battle"; -import { CommonBattleAnim, CommonAnim } from "#app/data/battle-anims"; -import { Stat } from "#app/enums/stat"; +import { PERMANENT_STATS, Stat } from "#app/enums/stat"; import { getPokemonNameWithAffix } from "#app/messages"; import { getTextColor, TextStyle } from "#app/ui/text"; import { Mode } from "#app/ui/ui"; @@ -9,21 +8,14 @@ import i18next from "i18next"; import { PokemonPhase } from "./pokemon-phase"; export class ScanIvsPhase extends PokemonPhase { - private shownIvs: number; - constructor(battlerIndex: BattlerIndex, shownIvs: number) { + constructor(battlerIndex: BattlerIndex) { super(battlerIndex); - - this.shownIvs = shownIvs; } start() { super.start(); - if (!this.shownIvs) { - return this.end(); - } - const pokemon = this.getPokemon(); let enemyIvs: number[] = []; @@ -34,12 +26,11 @@ export class ScanIvsPhase extends PokemonPhase { for (let e = 0; e < enemyField.length; e++) { enemyIvs = enemyField[e].ivs; const currentIvs = globalScene.gameData.dexData[enemyField[e].species.getRootSpeciesId()].ivs; // we are using getRootSpeciesId() here because we want to check against the baby form, not the mid form if it exists - const ivsToShow = globalScene.ui.getMessageHandler().getTopIvs(enemyIvs, this.shownIvs); statsContainer = enemyField[e].getBattleInfo().getStatsValueContainer().list as Phaser.GameObjects.Sprite[]; statsContainerLabels = statsContainer.filter(m => m.name.indexOf("icon_stat_label") >= 0); for (let s = 0; s < statsContainerLabels.length; s++) { const ivStat = Stat[statsContainerLabels[s].frame.name]; - if (enemyIvs[ivStat] > currentIvs[ivStat] && ivsToShow.indexOf(Number(ivStat)) >= 0) { + if (enemyIvs[ivStat] > currentIvs[ivStat] && PERMANENT_STATS.indexOf(Number(ivStat)) >= 0) { const hexColour = enemyIvs[ivStat] === 31 ? getTextColor(TextStyle.PERFECT_IV, false, uiTheme) : getTextColor(TextStyle.SUMMARY_GREEN, false, uiTheme); const hexTextColour = Phaser.Display.Color.HexStringToColor(hexColour).color; statsContainerLabels[s].setTint(hexTextColour); @@ -53,9 +44,7 @@ export class ScanIvsPhase extends PokemonPhase { globalScene.ui.setMode(Mode.CONFIRM, () => { globalScene.ui.setMode(Mode.MESSAGE); globalScene.ui.clearText(); - new CommonBattleAnim(CommonAnim.LOCK_ON, pokemon, pokemon).play(false, () => { - globalScene.ui.getMessageHandler().promptIvs(pokemon.id, pokemon.ivs, this.shownIvs).then(() => this.end()); - }); + globalScene.ui.getMessageHandler().promptIvs(pokemon.id, pokemon.ivs).then(() => this.end()); }, () => { globalScene.ui.setMode(Mode.MESSAGE); globalScene.ui.clearText(); diff --git a/src/phases/show-ability-phase.ts b/src/phases/show-ability-phase.ts index ded480867e1..e0d0ab3cc08 100644 --- a/src/phases/show-ability-phase.ts +++ b/src/phases/show-ability-phase.ts @@ -23,6 +23,13 @@ export class ShowAbilityPhase extends PokemonPhase { const pokemon = this.getPokemon(); if (pokemon) { + if (!pokemon.isPlayer()) { + /** If its an enemy pokemon, list it as last enemy to use ability or move */ + globalScene.currentBattle.lastEnemyInvolved = pokemon.getBattlerIndex() % 2; + } else { + globalScene.currentBattle.lastPlayerInvolved = pokemon.getBattlerIndex() % 2; + } + globalScene.abilityBar.showAbility(this.pokemonName, this.abilityName, this.passive).then(() => { if (pokemon?.battleData) { pokemon.battleData.abilityRevealed = true; diff --git a/src/phases/stat-stage-change-phase.ts b/src/phases/stat-stage-change-phase.ts index 359610b320c..753d1f7cede 100644 --- a/src/phases/stat-stage-change-phase.ts +++ b/src/phases/stat-stage-change-phase.ts @@ -1,7 +1,8 @@ import { globalScene } from "#app/global-scene"; import type { BattlerIndex } from "#app/battle"; -import { applyAbAttrs, applyPostStatStageChangeAbAttrs, applyPreStatStageChangeAbAttrs, PostStatStageChangeAbAttr, ProtectStatAbAttr, StatStageChangeCopyAbAttr, StatStageChangeMultiplierAbAttr } from "#app/data/ability"; +import { applyAbAttrs, applyPostStatStageChangeAbAttrs, applyPreStatStageChangeAbAttrs, PostStatStageChangeAbAttr, ProtectStatAbAttr, ReflectStatStageChangeAbAttr, StatStageChangeCopyAbAttr, StatStageChangeMultiplierAbAttr } from "#app/data/ability"; import { ArenaTagSide, MistTag } from "#app/data/arena-tag"; +import type { ArenaTag } from "#app/data/arena-tag"; import type Pokemon from "#app/field/pokemon"; import { getPokemonNameWithAffix } from "#app/messages"; import { ResetNegativeStatStageModifier } from "#app/modifier/modifier"; @@ -10,6 +11,8 @@ import { NumberHolder, BooleanHolder } from "#app/utils"; import i18next from "i18next"; import { PokemonPhase } from "./pokemon-phase"; import { Stat, type BattleStat, getStatKey, getStatStageChangeDescriptionKey } from "#enums/stat"; +import { OctolockTag } from "#app/data/battler-tags"; +import { ArenaTagType } from "#app/enums/arena-tag-type"; export type StatStageChangeCallback = (target: Pokemon | null, changed: BattleStat[], relativeChanges: number[]) => void; @@ -21,9 +24,11 @@ export class StatStageChangePhase extends PokemonPhase { private ignoreAbilities: boolean; private canBeCopied: boolean; private onChange: StatStageChangeCallback | null; + private comingFromMirrorArmorUser: boolean; + private comingFromStickyWeb: boolean; - constructor(battlerIndex: BattlerIndex, selfTarget: boolean, stats: BattleStat[], stages: number, showMessage: boolean = true, ignoreAbilities: boolean = false, canBeCopied: boolean = true, onChange: StatStageChangeCallback | null = null) { + constructor(battlerIndex: BattlerIndex, selfTarget: boolean, stats: BattleStat[], stages: number, showMessage: boolean = true, ignoreAbilities: boolean = false, canBeCopied: boolean = true, onChange: StatStageChangeCallback | null = null, comingFromMirrorArmorUser: boolean = false, comingFromStickyWeb: boolean = false) { super(battlerIndex); this.selfTarget = selfTarget; @@ -33,6 +38,8 @@ export class StatStageChangePhase extends PokemonPhase { this.ignoreAbilities = ignoreAbilities; this.canBeCopied = canBeCopied; this.onChange = onChange; + this.comingFromMirrorArmorUser = comingFromMirrorArmorUser; + this.comingFromStickyWeb = comingFromStickyWeb; } start() { @@ -41,12 +48,44 @@ export class StatStageChangePhase extends PokemonPhase { if (this.stats.length > 1) { for (let i = 0; i < this.stats.length; i++) { const stat = [ this.stats[i] ]; - globalScene.unshiftPhase(new StatStageChangePhase(this.battlerIndex, this.selfTarget, stat, this.stages, this.showMessage, this.ignoreAbilities, this.canBeCopied, this.onChange)); + globalScene.unshiftPhase(new StatStageChangePhase(this.battlerIndex, this.selfTarget, stat, this.stages, this.showMessage, this.ignoreAbilities, this.canBeCopied, this.onChange, this.comingFromMirrorArmorUser)); } return this.end(); } const pokemon = this.getPokemon(); + let opponentPokemon: Pokemon | undefined; + + /** Gets the position of last enemy or player pokemon that used ability or move, primarily for double battles involving Mirror Armor */ + if (pokemon.isPlayer()) { + /** If this SSCP is not from sticky web, then we find the opponent pokemon that last did something */ + if (!this.comingFromStickyWeb) { + opponentPokemon = globalScene.getEnemyField()[globalScene.currentBattle.lastEnemyInvolved]; + } else { + /** If this SSCP is from sticky web, then check if pokemon that last sucessfully used sticky web is on field */ + const stickyTagID = globalScene.arena.findTagsOnSide( + (t: ArenaTag) => t.tagType === ArenaTagType.STICKY_WEB, + ArenaTagSide.PLAYER)[0].sourceId; + globalScene.getEnemyField().forEach((e) => { + if (e.id === stickyTagID) { + opponentPokemon = e; + } + }); + } + } else { + if (!this.comingFromStickyWeb) { + opponentPokemon = globalScene.getPlayerField()[globalScene.currentBattle.lastPlayerInvolved]; + } else { + const stickyTagID = globalScene.arena.findTagsOnSide( + (t: ArenaTag) => t.tagType === ArenaTagType.STICKY_WEB, + ArenaTagSide.ENEMY)[0].sourceId; + globalScene.getPlayerField().forEach((e) => { + if (e.id === stickyTagID) { + opponentPokemon = e; + } + }); + } + } if (!pokemon.isActive(true)) { return this.end(); @@ -70,6 +109,11 @@ export class StatStageChangePhase extends PokemonPhase { if (!cancelled.value && !this.selfTarget && stages.value < 0) { applyPreStatStageChangeAbAttrs(ProtectStatAbAttr, pokemon, stat, cancelled, simulate); + + /** Potential stat reflection due to Mirror Armor, does not apply to Octolock end of turn effect */ + if (opponentPokemon !== undefined && !pokemon.findTag(t => t instanceof OctolockTag) && !this.comingFromMirrorArmorUser) { + applyPreStatStageChangeAbAttrs(ReflectStatStageChangeAbAttr, pokemon, stat, cancelled, simulate, opponentPokemon, this.stages); + } } // If one stat stage decrease is cancelled, simulate the rest of the applications diff --git a/src/phases/title-phase.ts b/src/phases/title-phase.ts index 4e96214d600..0d486da1998 100644 --- a/src/phases/title-phase.ts +++ b/src/phases/title-phase.ts @@ -77,30 +77,36 @@ export class TitlePhase extends Phase { this.end(); }; const { gameData } = globalScene; + const options: OptionSelectItem[] = []; + options.push({ + label: GameMode.getModeName(GameModes.CLASSIC), + handler: () => { + setModeAndEnd(GameModes.CLASSIC); + return true; + } + }); + options.push({ + label: i18next.t("menu:dailyRun"), + handler: () => { + this.initDailyRun(); + return true; + } + }); if (gameData.isUnlocked(Unlockables.ENDLESS_MODE)) { - const options: OptionSelectItem[] = [ - { - label: GameMode.getModeName(GameModes.CLASSIC), - handler: () => { - setModeAndEnd(GameModes.CLASSIC); - return true; - } - }, - { - label: GameMode.getModeName(GameModes.CHALLENGE), - handler: () => { - setModeAndEnd(GameModes.CHALLENGE); - return true; - } - }, - { - label: GameMode.getModeName(GameModes.ENDLESS), - handler: () => { - setModeAndEnd(GameModes.ENDLESS); - return true; - } + options.push({ + label: GameMode.getModeName(GameModes.CHALLENGE), + handler: () => { + setModeAndEnd(GameModes.CHALLENGE); + return true; } - ]; + }); + options.push({ + label: GameMode.getModeName(GameModes.ENDLESS), + handler: () => { + setModeAndEnd(GameModes.ENDLESS); + return true; + } + }); if (gameData.isUnlocked(Unlockables.SPLICED_ENDLESS_MODE)) { options.push({ label: GameMode.getModeName(GameModes.SPLICED_ENDLESS), @@ -110,22 +116,17 @@ export class TitlePhase extends Phase { } }); } - options.push({ - label: i18next.t("menu:cancel"), - handler: () => { - globalScene.clearPhaseQueue(); - globalScene.pushPhase(new TitlePhase()); - super.end(); - return true; - } - }); - globalScene.ui.showText(i18next.t("menu:selectGameMode"), null, () => globalScene.ui.setOverlayMode(Mode.OPTION_SELECT, { options: options })); - } else { - this.gameMode = GameModes.CLASSIC; - globalScene.ui.setMode(Mode.MESSAGE); - globalScene.ui.clearText(); - this.end(); } + options.push({ + label: i18next.t("menu:cancel"), + handler: () => { + globalScene.clearPhaseQueue(); + globalScene.pushPhase(new TitlePhase()); + super.end(); + return true; + } + }); + globalScene.ui.showText(i18next.t("menu:selectGameMode"), null, () => globalScene.ui.setOverlayMode(Mode.OPTION_SELECT, { options: options })); return true; } }, @@ -142,14 +143,6 @@ export class TitlePhase extends Phase { return true; } }, - { - label: i18next.t("menu:dailyRun"), - handler: () => { - this.initDailyRun(); - return true; - }, - keepOpen: true - }, { label: i18next.t("menu:runHistory"), handler: () => { @@ -192,6 +185,7 @@ export class TitlePhase extends Phase { } initDailyRun(): void { + globalScene.ui.clearText(); globalScene.ui.setMode(Mode.SAVE_SLOT, SaveSlotUiMode.SAVE, (slotId: number) => { globalScene.clearPhaseQueue(); if (slotId === -1) { diff --git a/src/plugins/i18n.ts b/src/plugins/i18n.ts index cc798bc8585..904b51c6dc7 100644 --- a/src/plugins/i18n.ts +++ b/src/plugins/i18n.ts @@ -193,6 +193,7 @@ export async function initI18n(): Promise { "egg", "fightUiHandler", "filterBar", + "filterText", "gameMode", "gameStatsUiHandler", "growth", @@ -203,6 +204,7 @@ export async function initI18n(): Promise { "move", "nature", "pokeball", + "pokedexUiHandler", "pokemon", "pokemonEvolutions", "pokemonForm", diff --git a/src/system/game-data.ts b/src/system/game-data.ts index 7282d2730a4..c16fab9db04 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -141,6 +141,10 @@ export interface SessionSaveData { challenges: ChallengeData[]; mysteryEncounterType: MysteryEncounterType | -1; // Only defined when current wave is ME, mysteryEncounterSaveData: MysteryEncounterSaveData; + /** + * Counts the amount of pokemon fainted in your party during the current arena encounter. + */ + playerFaints: number; } interface Unlocks { @@ -964,7 +968,8 @@ export class GameData { timestamp: new Date().getTime(), challenges: globalScene.gameMode.challenges.map(c => new ChallengeData(c)), mysteryEncounterType: globalScene.currentBattle.mysteryEncounter?.encounterType ?? -1, - mysteryEncounterSaveData: globalScene.mysteryEncounterSaveData + mysteryEncounterSaveData: globalScene.mysteryEncounterSaveData, + playerFaints: globalScene.arena.playerFaints } as SessionSaveData; } @@ -1056,7 +1061,7 @@ export class GameData { globalScene.mysteryEncounterSaveData = new MysteryEncounterSaveData(sessionData.mysteryEncounterSaveData); - globalScene.newArena(sessionData.arena.biome); + globalScene.newArena(sessionData.arena.biome, sessionData.playerFaints); const battleType = sessionData.battleType || 0; const trainerConfig = sessionData.trainer ? trainerConfigs[sessionData.trainer.trainerType] : null; diff --git a/src/system/settings/settings.ts b/src/system/settings/settings.ts index e5662842cd0..b750400d6f5 100644 --- a/src/system/settings/settings.ts +++ b/src/system/settings/settings.ts @@ -9,6 +9,7 @@ import { EaseType } from "#enums/ease-type"; import { MoneyFormat } from "#enums/money-format"; import { PlayerGender } from "#enums/player-gender"; import { ShopCursorTarget } from "#enums/shop-cursor-target"; +import { isLocal } from "#app/utils"; const VOLUME_OPTIONS: SettingOption[] = new Array(11).fill(null).map((_, i) => i ? { value: (i * 10).toString(), @@ -150,6 +151,7 @@ export const SettingKeys = { Show_Stats_on_Level_Up: "SHOW_LEVEL_UP_STATS", Shop_Cursor_Target: "SHOP_CURSOR_TARGET", Command_Cursor_Memory: "COMMAND_CURSOR_MEMORY", + Dex_For_Devs: "DEX_FOR_DEVS", Candy_Upgrade_Notification: "CANDY_UPGRADE_NOTIFICATION", Candy_Upgrade_Display: "CANDY_UPGRADE_DISPLAY", Move_Info: "MOVE_INFO", @@ -691,6 +693,16 @@ export const Setting: Array = [ } ]; +if (isLocal) { + Setting.push({ + key: SettingKeys.Dex_For_Devs, + label: i18next.t("settings:dexForDevs"), + options: OFF_ON, + default: 0, + type: SettingType.GENERAL + }); +} + /** * Return the index of a Setting * @param key SettingKey @@ -828,6 +840,9 @@ export function setSetting(setting: string, value: number): boolean { case SettingKeys.Command_Cursor_Memory: globalScene.commandCursorMemory = Setting[index].options[value].value === "On"; break; + case SettingKeys.Dex_For_Devs: + globalScene.dexForDevs = Setting[index].options[value].value === "On"; + break; case SettingKeys.EXP_Gains_Speed: globalScene.expGainsSpeed = value; break; diff --git a/src/test/abilities/magic_bounce.test.ts b/src/test/abilities/magic_bounce.test.ts new file mode 100644 index 00000000000..2fc460662ca --- /dev/null +++ b/src/test/abilities/magic_bounce.test.ts @@ -0,0 +1,351 @@ +import { BattlerIndex } from "#app/battle"; +import { allAbilities } from "#app/data/ability"; +import { ArenaTagSide } from "#app/data/arena-tag"; +import { allMoves } from "#app/data/move"; +import { ArenaTagType } from "#app/enums/arena-tag-type"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { Stat } from "#app/enums/stat"; +import { StatusEffect } from "#app/enums/status-effect"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Abilities - Magic Bounce", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .ability(Abilities.BALL_FETCH) + .battleType("single") + .moveset( [ Moves.GROWL, Moves.SPLASH ]) + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.MAGIC_BOUNCE) + .enemyMoveset(Moves.SPLASH); + }); + + it("should reflect basic status moves", async () => { + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should not bounce moves while the target is in the semi-invulnerable state", async () => { + await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.override.moveset([ Moves.GROWL ]); + game.override.enemyMoveset( [ Moves.FLY ]); + + game.move.select(Moves.GROWL); + await game.forceEnemyMove(Moves.FLY); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(0); + }); + + it("should individually bounce back multi-target moves", async () => { + game.override.battleType("double"); + game.override.moveset([ Moves.GROWL, Moves.SPLASH ]); + await game.classicMode.startBattle([ Species.MAGIKARP, Species.MAGIKARP ]); + + game.move.select(Moves.GROWL, 0); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to("BerryPhase"); + + const user = game.scene.getPlayerField()[0]; + expect(user.getStatStage(Stat.ATK)).toBe(-2); + }); + + it("should still bounce back a move that would otherwise fail", async () => { + await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.scene.getEnemyPokemon()?.setStatStage(Stat.ATK, -6); + game.override.moveset([ Moves.GROWL ]); + + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should not bounce back a move that was just bounced", async () => { + game.override.ability(Abilities.MAGIC_BOUNCE); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should receive the stat change after reflecting a move back to a mirror armor user", async () => { + game.override.ability(Abilities.MIRROR_ARMOR); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should not bounce back a move from a mold breaker user", async () => { + game.override.ability(Abilities.MOLD_BREAKER); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should bounce back a spread status move against both pokemon", async () => { + game.override.battleType("double"); + game.override.moveset([ Moves.GROWL, Moves.SPLASH ]); + game.override.enemyMoveset([ Moves.SPLASH ]); + await game.classicMode.startBattle([ Species.MAGIKARP, Species.MAGIKARP ]); + + game.move.select(Moves.GROWL, 0); + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerField().every(p => p.getStatStage(Stat.ATK) === -2)).toBeTruthy(); + }); + + it("should only bounce spikes back once in doubles when both targets have magic bounce", async () => { + game.override.battleType("double"); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.override.moveset([ Moves.SPIKES ]); + + game.move.select(Moves.SPIKES); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.PLAYER)!["layers"]).toBe(1); + expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY)).toBeUndefined(); + }); + + it("should bounce spikes even when the target is protected", async () => { + game.override.moveset([ Moves.SPIKES ]); + game.override.enemyMoveset([ Moves.PROTECT ]); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + game.move.select(Moves.SPIKES); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.PLAYER)!["layers"]).toBe(1); + }); + + it("should not bounce spikes when the target is in the semi-invulnerable state", async () => { + game.override.moveset([ Moves.SPIKES ]); + game.override.enemyMoveset([ Moves.FLY ]); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + game.move.select(Moves.SPIKES); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY)!["layers"]).toBe(1); + }); + + it("should not bounce back curse", async() => { + game.override.starterSpecies(Species.GASTLY); + await game.classicMode.startBattle([ Species.GASTLY ]); + game.override.moveset([ Moves.CURSE ]); + + game.move.select(Moves.CURSE); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()!.getTag(BattlerTagType.CURSED)).toBeDefined(); + }); + + it("should not cause encore to be interrupted after bouncing", async () => { + game.override.moveset([ Moves.SPLASH, Moves.GROWL, Moves.ENCORE ]); + game.override.enemyMoveset([ Moves.TACKLE, Moves.GROWL ]); + // game.override.ability(Abilities.MOLD_BREAKER); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + // Give the player MOLD_BREAKER for this turn to bypass Magic Bounce. + vi.spyOn(playerPokemon, "getAbility").mockReturnValue(allAbilities[Abilities.MOLD_BREAKER]); + + // turn 1 + game.move.select(Moves.ENCORE); + await game.forceEnemyMove(Moves.TACKLE); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.toNextTurn(); + expect(enemyPokemon.getTag(BattlerTagType.ENCORE)!["moveId"]).toBe(Moves.TACKLE); + + // turn 2 + vi.spyOn(playerPokemon, "getAbility").mockRestore(); + game.move.select(Moves.GROWL); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.phaseInterceptor.to("BerryPhase"); + expect(enemyPokemon.getTag(BattlerTagType.ENCORE)!["moveId"]).toBe(Moves.TACKLE); + expect(enemyPokemon.getLastXMoves()[0].move).toBe(Moves.TACKLE); + + }); + + // TODO: encore is failing if the last move was virtual. + it.todo("should not cause the bounced move to count for encore", async () => { + game.override.moveset([ Moves.SPLASH, Moves.GROWL, Moves.ENCORE ]); + game.override.enemyMoveset([ Moves.GROWL, Moves.TACKLE ]); + game.override.enemyAbility(Abilities.MAGIC_BOUNCE); + + await game.classicMode.startBattle([ Species.MAGIKARP ]); + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + // turn 1 + game.move.select(Moves.GROWL); + await game.forceEnemyMove(Moves.TACKLE); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.toNextTurn(); + + // Give the player MOLD_BREAKER for this turn to bypass Magic Bounce. + vi.spyOn(playerPokemon, "getAbility").mockReturnValue(allAbilities[Abilities.MOLD_BREAKER]); + + // turn 2 + game.move.select(Moves.ENCORE); + await game.forceEnemyMove(Moves.TACKLE); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.phaseInterceptor.to("BerryPhase"); + expect(enemyPokemon.getTag(BattlerTagType.ENCORE)!["moveId"]).toBe(Moves.TACKLE); + expect(enemyPokemon.getLastXMoves()[0].move).toBe(Moves.TACKLE); + }); + + // TODO: stomping tantrum should consider moves that were bounced. + it.todo("should cause stomping tantrum to double in power when the last move was bounced", async () => { + game.override.battleType("single"); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.override.moveset([ Moves.STOMPING_TANTRUM, Moves.CHARM ]); + + const stomping_tantrum = allMoves[Moves.STOMPING_TANTRUM]; + vi.spyOn(stomping_tantrum, "calculateBattlePower"); + + game.move.select(Moves.CHARM); + await game.toNextTurn(); + + game.move.select(Moves.STOMPING_TANTRUM); + await game.phaseInterceptor.to("BerryPhase"); + expect(stomping_tantrum.calculateBattlePower).toHaveReturnedWith(150); + }); + + // TODO: stomping tantrum should consider moves that were bounced. + it.todo("should properly cause the enemy's stomping tantrum to be doubled in power after bouncing and failing", async () => { + game.override.enemyMoveset([ Moves.STOMPING_TANTRUM, Moves.SPLASH, Moves.CHARM ]); + await game.classicMode.startBattle([ Species.BULBASAUR ]); + + const stomping_tantrum = allMoves[Moves.STOMPING_TANTRUM]; + const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(stomping_tantrum, "calculateBattlePower"); + + game.move.select(Moves.SPORE); + await game.forceEnemyMove(Moves.CHARM); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(enemy.getLastXMoves(1)[0].result).toBe("success"); + + await game.phaseInterceptor.to("BerryPhase"); + expect(stomping_tantrum.calculateBattlePower).toHaveReturnedWith(75); + + await game.toNextTurn(); + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + expect(stomping_tantrum.calculateBattlePower).toHaveReturnedWith(75); + }); + + it("should respect immunities when bouncing a move", async () => { + vi.spyOn(allMoves[Moves.THUNDER_WAVE], "accuracy", "get").mockReturnValue(100); + game.override.moveset([ Moves.THUNDER_WAVE, Moves.GROWL ]); + game.override.ability(Abilities.SOUNDPROOF); + await game.classicMode.startBattle([ Species.PHANPY ]); + + // Turn 1 - thunder wave immunity test + game.move.select(Moves.THUNDER_WAVE); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerPokemon()!.status).toBeUndefined(); + + // Turn 2 - soundproof immunity test + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(0); + }); + + it("should bounce back a move before the accuracy check", async () => { + game.override.moveset([ Moves.SPORE ]); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + const attacker = game.scene.getPlayerPokemon()!; + + vi.spyOn(attacker, "getAccuracyMultiplier").mockReturnValue(0.0); + game.move.select(Moves.SPORE); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerPokemon()!.status?.effect).toBe(StatusEffect.SLEEP); + }); + + it("should take the accuracy of the magic bounce user into account", async () => { + game.override.moveset([ Moves.SPORE ]); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + const opponent = game.scene.getEnemyPokemon()!; + + vi.spyOn(opponent, "getAccuracyMultiplier").mockReturnValue(0); + game.move.select(Moves.SPORE); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerPokemon()!.status).toBeUndefined(); + }); + + it("should always apply the leftmost available target's magic bounce when bouncing moves like sticky webs in doubles", async () => { + game.override.battleType("double"); + game.override.moveset([ Moves.STICKY_WEB, Moves.SPLASH, Moves.TRICK_ROOM ]); + + await game.classicMode.startBattle([ Species.MAGIKARP, Species.MAGIKARP ]); + const [ enemy_1, enemy_2 ] = game.scene.getEnemyField(); + // set speed just incase logic erroneously checks for speed order + enemy_1.setStat(Stat.SPD, enemy_2.getStat(Stat.SPD) + 1); + + // turn 1 + game.move.select(Moves.STICKY_WEB, 0); + game.move.select(Moves.TRICK_ROOM, 1); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(game.scene.arena.getTagOnSide(ArenaTagType.STICKY_WEB, ArenaTagSide.PLAYER)?.getSourcePokemon()?.getBattlerIndex()).toBe(BattlerIndex.ENEMY); + game.scene.arena.removeTagOnSide(ArenaTagType.STICKY_WEB, ArenaTagSide.PLAYER, true); + + // turn 2 + game.move.select(Moves.STICKY_WEB, 0); + game.move.select(Moves.TRICK_ROOM, 1); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.arena.getTagOnSide(ArenaTagType.STICKY_WEB, ArenaTagSide.PLAYER)?.getSourcePokemon()?.getBattlerIndex()).toBe(BattlerIndex.ENEMY); + }); + + it("should not bounce back status moves that hit through semi-invulnerable states", async () => { + game.override.moveset([ Moves.TOXIC, Moves.CHARM ]); + await game.classicMode.startBattle([ Species.BULBASAUR ]); + game.move.select(Moves.TOXIC); + await game.forceEnemyMove(Moves.FLY); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getEnemyPokemon()!.status?.effect).toBe(StatusEffect.TOXIC); + expect(game.scene.getPlayerPokemon()!.status).toBeUndefined(); + + game.override.ability(Abilities.NO_GUARD); + game.move.select(Moves.CHARM); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.ATK)).toBe(-2); + expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(0); + }); +}); + diff --git a/src/test/abilities/mirror_armor.test.ts b/src/test/abilities/mirror_armor.test.ts new file mode 100644 index 00000000000..070428a8ee7 --- /dev/null +++ b/src/test/abilities/mirror_armor.test.ts @@ -0,0 +1,315 @@ +import { Stat } from "#enums/stat"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { BattlerIndex } from "#app/battle"; + +// TODO: When Magic Bounce is implemented, make a test for its interaction with mirror guard, use screech + +describe("Ability - Mirror Armor", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + game.override.battleType("single") + .enemySpecies(Species.RATTATA) + .enemyMoveset([ Moves.SPLASH, Moves.STICKY_WEB, Moves.TICKLE, Moves.OCTOLOCK ]) + .enemyAbility(Abilities.BALL_FETCH) + .startingLevel(2000) + .moveset([ Moves.SPLASH, Moves.STICKY_WEB, Moves.TICKLE, Moves.OCTOLOCK ]) + .ability(Abilities.BALL_FETCH); + }); + + it("Player side + single battle Intimidate - opponent loses stats", async () => { + game.override.ability(Abilities.MIRROR_ARMOR); + game.override.enemyAbility(Abilities.INTIMIDATE); + await game.classicMode.startBattle([ Species.BULBASAUR ]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + const userPokemon = game.scene.getPlayerPokemon()!; + + // Enemy has intimidate, enemy should lose -1 atk + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.SPLASH, BattlerIndex.PLAYER); + await game.toNextTurn(); + + expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(-1); + expect(userPokemon.getStatStage(Stat.ATK)).toBe(0); + }); + + it("Enemy side + single battle Intimidate - player loses stats", async () => { + game.override.enemyAbility(Abilities.MIRROR_ARMOR); + game.override.ability(Abilities.INTIMIDATE); + await game.classicMode.startBattle([ Species.BULBASAUR ]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + const userPokemon = game.scene.getPlayerPokemon()!; + + // Enemy has intimidate, enemy should lose -1 atk + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.SPLASH, BattlerIndex.PLAYER); + await game.toNextTurn(); + + expect(userPokemon.getStatStage(Stat.ATK)).toBe(-1); + expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(0); + }); + + it("Player side + double battle Intimidate - opponents each lose -2 atk", async () => { + game.override.battleType("double"); + game.override.ability(Abilities.MIRROR_ARMOR); + game.override.enemyAbility(Abilities.INTIMIDATE); + await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER ]); + + const [ enemy1, enemy2 ] = game.scene.getEnemyField(); + const [ player1, player2 ] = game.scene.getPlayerField(); + + // Enemy has intimidate, enemy should lose -2 atk each + game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.SPLASH, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.SPLASH, BattlerIndex.PLAYER_2); + await game.toNextTurn(); + + expect(enemy1.getStatStage(Stat.ATK)).toBe(-2); + expect(enemy2.getStatStage(Stat.ATK)).toBe(-2); + expect(player1.getStatStage(Stat.ATK)).toBe(0); + expect(player2.getStatStage(Stat.ATK)).toBe(0); + }); + + it("Enemy side + double battle Intimidate - players each lose -2 atk", async () => { + game.override.battleType("double"); + game.override.enemyAbility(Abilities.MIRROR_ARMOR); + game.override.ability(Abilities.INTIMIDATE); + await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER ]); + + const [ enemy1, enemy2 ] = game.scene.getEnemyField(); + const [ player1, player2 ] = game.scene.getPlayerField(); + + // Enemy has intimidate, enemy should lose -1 atk + game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.SPLASH, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.SPLASH, BattlerIndex.PLAYER_2); + await game.toNextTurn(); + + expect(enemy1.getStatStage(Stat.ATK)).toBe(0); + expect(enemy2.getStatStage(Stat.ATK)).toBe(0); + expect(player1.getStatStage(Stat.ATK)).toBe(-2); + expect(player2.getStatStage(Stat.ATK)).toBe(-2); + }); + + it("Player side + single battle Intimidate + Tickle - opponent loses stats", async () => { + game.override.ability(Abilities.MIRROR_ARMOR); + game.override.enemyAbility(Abilities.INTIMIDATE); + await game.classicMode.startBattle([ Species.BULBASAUR ]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + const userPokemon = game.scene.getPlayerPokemon()!; + + // Enemy has intimidate and uses tickle, enemy receives -2 atk and -1 defense + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.TICKLE, BattlerIndex.PLAYER); + await game.toNextTurn(); + + expect(enemyPokemon.getStatStage(Stat.DEF)).toBe(-1); + expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(-2); + expect(userPokemon.getStatStage(Stat.ATK)).toBe(0); + expect(userPokemon.getStatStage(Stat.DEF)).toBe(0); + }); + + it("Player side + double battle Intimidate + Tickle - opponents each lose -3 atk, -1 def", async () => { + game.override.battleType("double"); + game.override.ability(Abilities.MIRROR_ARMOR); + game.override.enemyAbility(Abilities.INTIMIDATE); + await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER ]); + + const [ enemy1, enemy2 ] = game.scene.getEnemyField(); + const [ player1, player2 ] = game.scene.getPlayerField(); + + game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.TICKLE, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.TICKLE, BattlerIndex.PLAYER_2); + await game.toNextTurn(); + + expect(player1.getStatStage(Stat.ATK)).toBe(0); + expect(player1.getStatStage(Stat.DEF)).toBe(0); + expect(player2.getStatStage(Stat.ATK)).toBe(0); + expect(player2.getStatStage(Stat.DEF)).toBe(0); + expect(enemy1.getStatStage(Stat.ATK)).toBe(-3); + expect(enemy1.getStatStage(Stat.DEF)).toBe(-1); + expect(enemy2.getStatStage(Stat.ATK)).toBe(-3); + expect(enemy2.getStatStage(Stat.DEF)).toBe(-1); + + }); + + it("Enemy side + single battle Intimidate + Tickle - player loses stats", async () => { + game.override.enemyAbility(Abilities.MIRROR_ARMOR); + game.override.ability(Abilities.INTIMIDATE); + await game.classicMode.startBattle([ Species.BULBASAUR ]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + const userPokemon = game.scene.getPlayerPokemon()!; + + // Enemy has intimidate and uses tickle, enemy receives -2 atk and -1 defense + game.move.select(Moves.TICKLE); + await game.forceEnemyMove(Moves.SPLASH, BattlerIndex.PLAYER); + await game.toNextTurn(); + + expect(userPokemon.getStatStage(Stat.DEF)).toBe(-1); + expect(userPokemon.getStatStage(Stat.ATK)).toBe(-2); + expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(0); + expect(enemyPokemon.getStatStage(Stat.DEF)).toBe(0); + }); + + it("Player side + single battle Intimidate + oppoenent has white smoke - no one loses stats", async () => { + game.override.enemyAbility(Abilities.WHITE_SMOKE); + game.override.ability(Abilities.MIRROR_ARMOR); + await game.classicMode.startBattle([ Species.BULBASAUR ]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + const userPokemon = game.scene.getPlayerPokemon()!; + + // Enemy has intimidate and uses tickle, enemy has white smoke, no one loses stats + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.TICKLE, BattlerIndex.PLAYER); + await game.toNextTurn(); + + expect(enemyPokemon.getStatStage(Stat.DEF)).toBe(0); + expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(0); + expect(userPokemon.getStatStage(Stat.ATK)).toBe(0); + expect(userPokemon.getStatStage(Stat.DEF)).toBe(0); + }); + + it("Enemy side + single battle Intimidate + player has white smoke - no one loses stats", async () => { + game.override.ability(Abilities.WHITE_SMOKE); + game.override.enemyAbility(Abilities.MIRROR_ARMOR); + await game.classicMode.startBattle([ Species.BULBASAUR ]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + const userPokemon = game.scene.getPlayerPokemon()!; + + // Enemy has intimidate and uses tickle, enemy has white smoke, no one loses stats + game.move.select(Moves.TICKLE); + await game.forceEnemyMove(Moves.SPLASH, BattlerIndex.PLAYER); + await game.toNextTurn(); + + expect(enemyPokemon.getStatStage(Stat.DEF)).toBe(0); + expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(0); + expect(userPokemon.getStatStage(Stat.ATK)).toBe(0); + expect(userPokemon.getStatStage(Stat.DEF)).toBe(0); + }); + + it("Player side + single battle + opponent uses octolock - does not interact with mirror armor, player loses stats", async () => { + game.override.ability(Abilities.MIRROR_ARMOR); + await game.classicMode.startBattle([ Species.BULBASAUR ]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + const userPokemon = game.scene.getPlayerPokemon()!; + + // Enemy uses octolock, player loses stats at end of turn + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.OCTOLOCK, BattlerIndex.PLAYER); + await game.toNextTurn(); + + expect(enemyPokemon.getStatStage(Stat.DEF)).toBe(0); + expect(enemyPokemon.getStatStage(Stat.SPDEF)).toBe(0); + expect(userPokemon.getStatStage(Stat.DEF)).toBe(-1); + expect(userPokemon.getStatStage(Stat.SPDEF)).toBe(-1); + }); + + it("Enemy side + single battle + player uses octolock - does not interact with mirror armor, opponent loses stats", async () => { + game.override.enemyAbility(Abilities.MIRROR_ARMOR); + await game.classicMode.startBattle([ Species.BULBASAUR ]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + const userPokemon = game.scene.getPlayerPokemon()!; + + // Player uses octolock, enemy loses stats at end of turn + game.move.select(Moves.OCTOLOCK); + await game.forceEnemyMove(Moves.SPLASH, BattlerIndex.PLAYER); + await game.toNextTurn(); + + expect(userPokemon.getStatStage(Stat.DEF)).toBe(0); + expect(userPokemon.getStatStage(Stat.SPDEF)).toBe(0); + expect(enemyPokemon.getStatStage(Stat.DEF)).toBe(-1); + expect(enemyPokemon.getStatStage(Stat.SPDEF)).toBe(-1); + }); + + it("Both sides have mirror armor - does not loop, player loses attack", async () => { + game.override.enemyAbility(Abilities.MIRROR_ARMOR); + game.override.ability(Abilities.MIRROR_ARMOR); + game.override.ability(Abilities.INTIMIDATE); + await game.classicMode.startBattle([ Species.BULBASAUR ]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + const userPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.SPLASH, BattlerIndex.PLAYER); + await game.toNextTurn(); + + expect(userPokemon.getStatStage(Stat.ATK)).toBe(-1); + expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(0); + }); + + it("Single battle + sticky web applied player side - player switches out and enemy should lose -1 speed", async () => { + game.override.ability(Abilities.MIRROR_ARMOR); + await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + const userPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.STICKY_WEB, BattlerIndex.PLAYER); + await game.toNextTurn(); + + game.doSwitchPokemon(1); + await game.forceEnemyMove(Moves.SPLASH, BattlerIndex.PLAYER); + await game.toNextTurn(); + + expect(userPokemon.getStatStage(Stat.SPD)).toBe(0); + expect(enemyPokemon.getStatStage(Stat.SPD)).toBe(-1); + }); + + it("Double battle + sticky web applied player side - player switches out and enemy 1 should lose -1 speed", async () => { + game.override.battleType("double"); + game.override.ability(Abilities.MIRROR_ARMOR); + await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + + const [ enemy1, enemy2 ] = game.scene.getEnemyField(); + const [ player1, player2 ] = game.scene.getPlayerField(); + + game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.STICKY_WEB, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.SPLASH, BattlerIndex.PLAYER_2); + await game.toNextTurn(); + + game.doSwitchPokemon(2); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.SPLASH, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.SPLASH, BattlerIndex.PLAYER_2); + await game.toNextTurn(); + + expect(enemy1.getStatStage(Stat.SPD)).toBe(-1); + expect(enemy2.getStatStage(Stat.SPD)).toBe(0); + expect(player1.getStatStage(Stat.SPD)).toBe(0); + expect(player2.getStatStage(Stat.SPD)).toBe(0); + }); +}); diff --git a/src/test/abilities/perish_body.test.ts b/src/test/abilities/perish_body.test.ts new file mode 100644 index 00000000000..70ba6d8d684 --- /dev/null +++ b/src/test/abilities/perish_body.test.ts @@ -0,0 +1,116 @@ +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + + +describe("Abilities - Perish Song", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override.battleType("single"); + game.override.disableCrits(); + + game.override.enemySpecies(Species.MAGIKARP); + game.override.enemyAbility(Abilities.BALL_FETCH); + + game.override.starterSpecies(Species.CURSOLA); + game.override.ability(Abilities.PERISH_BODY); + game.override.moveset([ Moves.SPLASH ]); + }); + + it("should trigger when hit with damaging move", async () => { + game.override.enemyMoveset([ Moves.AQUA_JET ]); + await game.classicMode.startBattle(); + const cursola = game.scene.getPlayerPokemon(); + const magikarp = game.scene.getEnemyPokemon(); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + expect(cursola?.summonData.tags[0].turnCount).toBe(3); + expect(magikarp?.summonData.tags[0].turnCount).toBe(3); + }); + + it("should trigger even when fainting", async () => { + game.override.enemyMoveset([ Moves.AQUA_JET ]) + .enemyLevel(100) + .startingLevel(1); + await game.classicMode.startBattle([ Species.CURSOLA, Species.FEEBAS ]); + const magikarp = game.scene.getEnemyPokemon(); + + game.move.select(Moves.SPLASH); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + expect(magikarp?.summonData.tags[0].turnCount).toBe(3); + }); + + it("should not activate if attacker already has perish song", async () => { + game.override.enemyMoveset([ Moves.PERISH_SONG, Moves.AQUA_JET, Moves.SPLASH ]); + await game.classicMode.startBattle([ Species.FEEBAS, Species.CURSOLA ]); + const feebas = game.scene.getPlayerPokemon(); + const magikarp = game.scene.getEnemyPokemon(); + + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.PERISH_SONG); + await game.toNextTurn(); + + expect(feebas?.summonData.tags[0].turnCount).toBe(3); + expect(magikarp?.summonData.tags[0].turnCount).toBe(3); + + game.doSwitchPokemon(1); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + + const cursola = game.scene.getPlayerPokemon(); + expect(cursola?.summonData.tags.length).toBe(0); + expect(magikarp?.summonData.tags[0].turnCount).toBe(2); + + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.AQUA_JET); + await game.toNextTurn(); + + expect(cursola?.summonData.tags.length).toBe(0); + expect(magikarp?.summonData.tags[0].turnCount).toBe(1); + + }); + + it("should activate if cursola already has perish song, but not reset its counter", async () => { + game.override.enemyMoveset([ Moves.PERISH_SONG, Moves.AQUA_JET, Moves.SPLASH ]); + game.override.moveset([ Moves.WHIRLWIND, Moves.SPLASH ]); + game.override.startingWave(5); + await game.classicMode.startBattle([ Species.CURSOLA ]); + const cursola = game.scene.getPlayerPokemon(); + + game.move.select(Moves.WHIRLWIND); + await game.forceEnemyMove(Moves.PERISH_SONG); + await game.toNextTurn(); + + const magikarp = game.scene.getEnemyPokemon(); + expect(cursola?.summonData.tags[0].turnCount).toBe(3); + expect(magikarp?.summonData.tags.length).toBe(0); + + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.AQUA_JET); + await game.toNextTurn(); + + expect(cursola?.summonData.tags[0].turnCount).toBe(2); + expect(magikarp?.summonData.tags.length).toBe(1); + expect(magikarp?.summonData.tags[0].turnCount).toBe(3); + }); +}); diff --git a/src/test/abilities/protosynthesis.test.ts b/src/test/abilities/protosynthesis.test.ts new file mode 100644 index 00000000000..67786c3ae9e --- /dev/null +++ b/src/test/abilities/protosynthesis.test.ts @@ -0,0 +1,66 @@ +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Nature } from "#enums/nature"; +import { Species } from "#enums/species"; +import { Stat } from "#enums/stat"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { BattlerIndex } from "#app/battle"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Abilities - Protosynthesis", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([ Moves.SPLASH, Moves.TACKLE ]) + .ability(Abilities.PROTOSYNTHESIS) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should not consider temporary items when determining which stat to boost", async() => { + // Mew has uniform base stats + game.override.startingModifier([{ name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.DEF }]) + .enemyMoveset(Moves.SUNNY_DAY) + .startingLevel(100) + .enemyLevel(100); + await game.classicMode.startBattle([ Species.MEW ]); + const mew = game.scene.getPlayerPokemon()!; + // Nature of starting mon is randomized. We need to fix it to a neutral nature for the automated test. + mew.setNature(Nature.HARDY); + const enemy = game.scene.getEnemyPokemon()!; + const def_before_boost = mew.getEffectiveStat(Stat.DEF, undefined, undefined, false, undefined, false, false, true); + const atk_before_boost = mew.getEffectiveStat(Stat.ATK, undefined, undefined, false, undefined, false, false, true); + const initialHp = enemy.hp; + game.move.select(Moves.TACKLE); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.toNextTurn(); + const unboosted_dmg = initialHp - enemy.hp; + enemy.hp = initialHp; + const def_after_boost = mew.getEffectiveStat(Stat.DEF, undefined, undefined, false, undefined, false, false, true); + const atk_after_boost = mew.getEffectiveStat(Stat.ATK, undefined, undefined, false, undefined, false, false, true); + game.move.select(Moves.TACKLE); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.toNextTurn(); + const boosted_dmg = initialHp - enemy.hp; + expect(boosted_dmg).toBeGreaterThan(unboosted_dmg); + expect(def_after_boost).toEqual(def_before_boost); + expect(atk_after_boost).toBeGreaterThan(atk_before_boost); + }); +}); diff --git a/src/test/abilities/sand_spit.test.ts b/src/test/abilities/sand_spit.test.ts index 1c21cff3c14..092c3e66105 100644 --- a/src/test/abilities/sand_spit.test.ts +++ b/src/test/abilities/sand_spit.test.ts @@ -36,7 +36,7 @@ describe("Abilities - Sand Spit", () => { it("should trigger when hit with damaging move", async () => { game.override.enemyMoveset([ Moves.TACKLE ]); - await game.startBattle(); + await game.classicMode.startBattle(); game.move.select(Moves.SPLASH); await game.toNextTurn(); @@ -44,9 +44,22 @@ describe("Abilities - Sand Spit", () => { expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.SANDSTORM); }, 20000); + it("should trigger even when fainting", async () => { + game.override.enemyMoveset([ Moves.TACKLE ]) + .enemyLevel(100) + .startingLevel(1); + await game.classicMode.startBattle([ Species.SILICOBRA, Species.MAGIKARP ]); + + game.move.select(Moves.SPLASH); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.SANDSTORM); + }); + it("should not trigger when targetted with status moves", async () => { game.override.enemyMoveset([ Moves.GROWL ]); - await game.startBattle(); + await game.classicMode.startBattle(); game.move.select(Moves.COIL); await game.toNextTurn(); diff --git a/src/test/abilities/seed_sower.test.ts b/src/test/abilities/seed_sower.test.ts new file mode 100644 index 00000000000..71b76e24d2e --- /dev/null +++ b/src/test/abilities/seed_sower.test.ts @@ -0,0 +1,69 @@ +import { TerrainType } from "#app/data/terrain"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + + +describe("Abilities - Seed Sower", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override.battleType("single"); + game.override.disableCrits(); + + game.override.enemySpecies(Species.MAGIKARP); + game.override.enemyAbility(Abilities.BALL_FETCH); + + game.override.starterSpecies(Species.ARBOLIVA); + game.override.ability(Abilities.SEED_SOWER); + game.override.moveset([ Moves.SPLASH ]); + }); + + it("should trigger when hit with damaging move", async () => { + game.override.enemyMoveset([ Moves.TACKLE ]); + await game.classicMode.startBattle(); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + expect(game.scene.arena.terrain?.terrainType).toBe(TerrainType.GRASSY); + }); + + it("should trigger even when fainting", async () => { + game.override.enemyMoveset([ Moves.TACKLE ]) + .enemyLevel(100) + .startingLevel(1); + await game.classicMode.startBattle([ Species.ARBOLIVA, Species.MAGIKARP ]); + + game.move.select(Moves.SPLASH); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + expect(game.scene.arena.terrain?.terrainType).toBe(TerrainType.GRASSY); + }); + + it("should not trigger when targetted with status moves", async () => { + game.override.enemyMoveset([ Moves.GROWL ]); + await game.classicMode.startBattle(); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + expect(game.scene.arena.terrain?.terrainType).not.toBe(TerrainType.GRASSY); + }); +}); diff --git a/src/test/abilities/shield_dust.test.ts b/src/test/abilities/shield_dust.test.ts index 9f1e6aeb11d..329f52cc4c6 100644 --- a/src/test/abilities/shield_dust.test.ts +++ b/src/test/abilities/shield_dust.test.ts @@ -53,11 +53,11 @@ describe("Abilities - Shield Dust", () => { expect(move.id).toBe(Moves.AIR_SLASH); const chance = new NumberHolder(move.chance); - applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon()!, null, false, chance, move, phase.getFirstTarget(), false); - applyPreDefendAbAttrs(IgnoreMoveEffectsAbAttr, phase.getFirstTarget()!, phase.getUserPokemon()!, null, null, false, chance); + await applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon()!, null, false, chance, move, phase.getFirstTarget(), false); + await applyPreDefendAbAttrs(IgnoreMoveEffectsAbAttr, phase.getFirstTarget()!, phase.getUserPokemon()!, null, null, false, chance); expect(chance.value).toBe(0); - }, 20000); + }); //TODO King's Rock Interaction Unit Test }); diff --git a/src/test/abilities/supreme_overlord.test.ts b/src/test/abilities/supreme_overlord.test.ts new file mode 100644 index 00000000000..ecd595cb6bb --- /dev/null +++ b/src/test/abilities/supreme_overlord.test.ts @@ -0,0 +1,178 @@ +import { Moves } from "#app/enums/moves"; +import { Abilities } from "#enums/abilities"; +import { Species } from "#enums/species"; +import { BattlerIndex } from "#app/battle"; +import { MoveEffectPhase } from "#app/phases/move-effect-phase"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { allMoves } from "#app/data/move"; + +describe("Abilities - Supreme Overlord", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + const move = allMoves[Moves.TACKLE]; + const basePower = move.power; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .battleType("single") + .enemySpecies(Species.MAGIKARP) + .enemyLevel(100) + .startingLevel(1) + .enemyAbility(Abilities.BALL_FETCH) + .ability(Abilities.SUPREME_OVERLORD) + .enemyMoveset([ Moves.SPLASH ]) + .moveset([ Moves.TACKLE, Moves.EXPLOSION, Moves.LUNAR_DANCE ]); + + vi.spyOn(move, "calculateBattlePower"); + }); + + it("should increase Power by 20% if 2 Pokemon are fainted in the party", async() => { + await game.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + + game.move.select(Moves.EXPLOSION); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + game.move.select(Moves.EXPLOSION); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + game.doSelectPartyPokemon(2); + await game.toNextTurn(); + + game.move.select(Moves.TACKLE); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(move.calculateBattlePower).toHaveReturnedWith(basePower * 1.2); + }); + + it("should increase Power by 30% if an ally fainted twice and another one once", async () => { + await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + + /** + * Bulbasur faints once + */ + game.move.select(Moves.EXPLOSION); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + /** + * Charmander faints once + */ + game.doRevivePokemon(1); + game.move.select(Moves.EXPLOSION); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + /** + * Bulbasur faints twice + */ + game.move.select(Moves.EXPLOSION); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + game.doSelectPartyPokemon(2); + await game.toNextTurn(); + + game.move.select(Moves.TACKLE); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(move.calculateBattlePower).toHaveReturnedWith(basePower * 1.3); + }); + + it("should maintain its power during next battle if it is within the same arena encounter", async () => { + game.override + .enemySpecies(Species.MAGIKARP) + .startingWave(1) + .enemyLevel(1) + .startingLevel(100); + + await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + + /** + * The first Pokemon faints and another Pokemon in the party is selected. + */ + game.move.select(Moves.LUNAR_DANCE); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + /** + * Enemy Pokemon faints and new wave is entered. + */ + game.move.select(Moves.TACKLE); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.toNextWave(); + + game.move.select(Moves.TACKLE); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(move.calculateBattlePower).toHaveLastReturnedWith(basePower * 1.1); + }); + + it("should reset playerFaints count if we enter new trainer battle", async () => { + game.override + .enemySpecies(Species.MAGIKARP) + .startingWave(4) + .enemyLevel(1) + .startingLevel(100); + + await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + + game.move.select(Moves.LUNAR_DANCE); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + game.move.select(Moves.TACKLE); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.toNextWave(); + + game.move.select(Moves.TACKLE); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.phaseInterceptor.to("BerryPhase", false); + + expect(move.calculateBattlePower).toHaveLastReturnedWith(basePower); + }); + + it("should reset playerFaints count if we enter new biome", async () => { + game.override + .enemySpecies(Species.MAGIKARP) + .startingWave(10) + .enemyLevel(1) + .startingLevel(100); + + await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + + game.move.select(Moves.LUNAR_DANCE); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + game.move.select(Moves.TACKLE); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.toNextWave(); + + game.move.select(Moves.TACKLE); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.phaseInterceptor.to("BerryPhase", false); + + expect(move.calculateBattlePower).toHaveLastReturnedWith(basePower); + }); +}); diff --git a/src/test/abilities/unseen_fist.test.ts b/src/test/abilities/unseen_fist.test.ts index f8fa8a723fe..584f997aa55 100644 --- a/src/test/abilities/unseen_fist.test.ts +++ b/src/test/abilities/unseen_fist.test.ts @@ -45,9 +45,9 @@ describe("Abilities - Unseen Fist", () => { it( "should not apply if the source has Long Reach", - () => { + async () => { game.override.passiveAbility(Abilities.LONG_REACH); - testUnseenFistHitResult(game, Moves.QUICK_ATTACK, Moves.PROTECT, false); + await testUnseenFistHitResult(game, Moves.QUICK_ATTACK, Moves.PROTECT, false); } ); @@ -67,7 +67,7 @@ describe("Abilities - Unseen Fist", () => { game.override.enemyLevel(1); game.override.moveset([ Moves.TACKLE ]); - await game.startBattle(); + await game.classicMode.startBattle(); const enemyPokemon = game.scene.getEnemyPokemon()!; enemyPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, Moves.NONE, enemyPokemon.id); @@ -86,7 +86,7 @@ async function testUnseenFistHitResult(game: GameManager, attackMove: Moves, pro game.override.moveset([ attackMove ]); game.override.enemyMoveset([ protectMove, protectMove, protectMove, protectMove ]); - await game.startBattle(); + await game.classicMode.startBattle(); const leadPokemon = game.scene.getPlayerPokemon()!; expect(leadPokemon).not.toBe(undefined); diff --git a/src/test/data/status_effect.test.ts b/src/test/data/status_effect.test.ts index 7948549b8e8..071dea989a9 100644 --- a/src/test/data/status_effect.test.ts +++ b/src/test/data/status_effect.test.ts @@ -20,8 +20,8 @@ const pokemonName = "PKM"; const sourceText = "SOURCE"; describe("Status Effect Messages", () => { - beforeAll(() => { - i18next.init(); + beforeAll(async () => { + await i18next.init(); }); describe("NONE", () => { diff --git a/src/test/evolution.test.ts b/src/test/evolution.test.ts index 10748899d59..8dc19a548ca 100644 --- a/src/test/evolution.test.ts +++ b/src/test/evolution.test.ts @@ -40,10 +40,10 @@ describe("Evolution", () => { eevee.abilityIndex = 2; trapinch.abilityIndex = 2; - eevee.evolve(pokemonEvolutions[Species.EEVEE][6], eevee.getSpeciesForm()); + await eevee.evolve(pokemonEvolutions[Species.EEVEE][6], eevee.getSpeciesForm()); expect(eevee.abilityIndex).toBe(2); - trapinch.evolve(pokemonEvolutions[Species.TRAPINCH][0], trapinch.getSpeciesForm()); + await trapinch.evolve(pokemonEvolutions[Species.TRAPINCH][0], trapinch.getSpeciesForm()); expect(trapinch.abilityIndex).toBe(1); }); @@ -55,10 +55,10 @@ describe("Evolution", () => { bulbasaur.abilityIndex = 0; charmander.abilityIndex = 1; - bulbasaur.evolve(pokemonEvolutions[Species.BULBASAUR][0], bulbasaur.getSpeciesForm()); + await bulbasaur.evolve(pokemonEvolutions[Species.BULBASAUR][0], bulbasaur.getSpeciesForm()); expect(bulbasaur.abilityIndex).toBe(0); - charmander.evolve(pokemonEvolutions[Species.CHARMANDER][0], charmander.getSpeciesForm()); + await charmander.evolve(pokemonEvolutions[Species.CHARMANDER][0], charmander.getSpeciesForm()); expect(charmander.abilityIndex).toBe(1); }); @@ -68,7 +68,7 @@ describe("Evolution", () => { const squirtle = game.scene.getPlayerPokemon()!; squirtle.abilityIndex = 5; - squirtle.evolve(pokemonEvolutions[Species.SQUIRTLE][0], squirtle.getSpeciesForm()); + await squirtle.evolve(pokemonEvolutions[Species.SQUIRTLE][0], squirtle.getSpeciesForm()); expect(squirtle.abilityIndex).toBe(0); }); @@ -80,7 +80,7 @@ describe("Evolution", () => { nincada.metBiome = -1; nincada.gender = 1; - nincada.evolve(pokemonEvolutions[Species.NINCADA][0], nincada.getSpeciesForm()); + await nincada.evolve(pokemonEvolutions[Species.NINCADA][0], nincada.getSpeciesForm()); const ninjask = game.scene.getPlayerParty()[0]; const shedinja = game.scene.getPlayerParty()[1]; expect(ninjask.abilityIndex).toBe(2); @@ -174,7 +174,7 @@ describe("Evolution", () => { for (let f = 1; f < 4; f++) { vi.spyOn(Utils, "randSeedInt").mockReturnValue(f); // setting the random generator to 1, 2 and 3 to force 4 family mausholds const fourForm = playerPokemon.getEvolution()!; - expect(fourForm.evoFormKey).toBe(null); // meanwhile, according to the pokemon-forms, the evoFormKey for a 4 family maushold is null + expect(fourForm.evoFormKey).toBe("four"); // meanwhile, according to the pokemon-forms, the evoFormKey for a 4 family maushold is "four" } }); }); diff --git a/src/test/field/pokemon.test.ts b/src/test/field/pokemon.test.ts index 0a1ddac9e90..0c282b44f49 100644 --- a/src/test/field/pokemon.test.ts +++ b/src/test/field/pokemon.test.ts @@ -150,6 +150,17 @@ describe("Spec - Pokemon", () => { expect(types[1]).toBe(Type.DARK); }); + it("Fusing mons with two and one types", async () => { + game.override.starterSpecies(Species.NUMEL); + game.override.starterFusionSpecies(Species.CHARMANDER); + await game.classicMode.startBattle(); + const pokemon = scene.getPlayerParty()[0]; + + const types = pokemon.getTypes(); + expect(types[0]).toBe(Type.FIRE); + expect(types[1]).toBe(Type.GROUND); + }); + it("Fusing two mons with two types", async () => { game.override.starterSpecies(Species.NATU); game.override.starterFusionSpecies(Species.HOUNDOUR); diff --git a/src/test/items/light_ball.test.ts b/src/test/items/light_ball.test.ts index 987a5ab8b0c..aae1d806a28 100644 --- a/src/test/items/light_ball.test.ts +++ b/src/test/items/light_ball.test.ts @@ -31,7 +31,7 @@ describe("Items - Light Ball", () => { it("LIGHT_BALL activates in battle correctly", async() => { game.override.startingHeldItems([{ name: "SPECIES_STAT_BOOSTER", type: "LIGHT_BALL" }]); const consoleSpy = vi.spyOn(console, "log"); - await game.startBattle([ + await game.classicMode.startBattle([ Species.PIKACHU ]); @@ -64,7 +64,7 @@ describe("Items - Light Ball", () => { }); it("LIGHT_BALL held by PIKACHU", async() => { - await game.startBattle([ + await game.classicMode.startBattle([ Species.PIKACHU ]); @@ -83,7 +83,7 @@ describe("Items - Light Ball", () => { expect(spAtkValue.value / spAtkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "LIGHT_BALL" ])!.newModifier(partyMember), true); + await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "LIGHT_BALL" ])!.newModifier(partyMember), true); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPATK, spAtkValue); @@ -92,7 +92,7 @@ describe("Items - Light Ball", () => { }, 20000); it("LIGHT_BALL held by fused PIKACHU (base)", async() => { - await game.startBattle([ + await game.classicMode.startBattle([ Species.PIKACHU, Species.MAROWAK ]); @@ -122,7 +122,7 @@ describe("Items - Light Ball", () => { expect(spAtkValue.value / spAtkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "LIGHT_BALL" ])!.newModifier(partyMember), true); + await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "LIGHT_BALL" ])!.newModifier(partyMember), true); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPATK, spAtkValue); @@ -161,7 +161,7 @@ describe("Items - Light Ball", () => { expect(spAtkValue.value / spAtkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "LIGHT_BALL" ])!.newModifier(partyMember), true); + await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "LIGHT_BALL" ])!.newModifier(partyMember), true); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPATK, spAtkValue); @@ -189,7 +189,7 @@ describe("Items - Light Ball", () => { expect(spAtkValue.value / spAtkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "LIGHT_BALL" ])!.newModifier(partyMember), true); + await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "LIGHT_BALL" ])!.newModifier(partyMember), true); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPATK, spAtkValue); diff --git a/src/test/items/metal_powder.test.ts b/src/test/items/metal_powder.test.ts index 42ef9c1bb16..68c3107af08 100644 --- a/src/test/items/metal_powder.test.ts +++ b/src/test/items/metal_powder.test.ts @@ -31,7 +31,7 @@ describe("Items - Metal Powder", () => { it("METAL_POWDER activates in battle correctly", async() => { game.override.startingHeldItems([{ name: "SPECIES_STAT_BOOSTER", type: "METAL_POWDER" }]); const consoleSpy = vi.spyOn(console, "log"); - await game.startBattle([ + await game.classicMode.startBattle([ Species.DITTO ]); @@ -79,7 +79,7 @@ describe("Items - Metal Powder", () => { expect(defValue.value / defStat).toBe(1); // Giving Eviolite to party member and testing if it applies - game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "METAL_POWDER" ])!.newModifier(partyMember), true); + await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "METAL_POWDER" ])!.newModifier(partyMember), true); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); expect(defValue.value / defStat).toBe(2); @@ -112,7 +112,7 @@ describe("Items - Metal Powder", () => { expect(defValue.value / defStat).toBe(1); // Giving Eviolite to party member and testing if it applies - game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "METAL_POWDER" ])!.newModifier(partyMember), true); + await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "METAL_POWDER" ])!.newModifier(partyMember), true); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); expect(defValue.value / defStat).toBe(2); @@ -145,7 +145,7 @@ describe("Items - Metal Powder", () => { expect(defValue.value / defStat).toBe(1); // Giving Eviolite to party member and testing if it applies - game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "METAL_POWDER" ])!.newModifier(partyMember), true); + await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "METAL_POWDER" ])!.newModifier(partyMember), true); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); expect(defValue.value / defStat).toBe(2); @@ -167,7 +167,7 @@ describe("Items - Metal Powder", () => { expect(defValue.value / defStat).toBe(1); // Giving Eviolite to party member and testing if it applies - game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "METAL_POWDER" ])!.newModifier(partyMember), true); + await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "METAL_POWDER" ])!.newModifier(partyMember), true); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.DEF, defValue); expect(defValue.value / defStat).toBe(1); diff --git a/src/test/items/quick_powder.test.ts b/src/test/items/quick_powder.test.ts index d30111cbd6a..ae16daf17ff 100644 --- a/src/test/items/quick_powder.test.ts +++ b/src/test/items/quick_powder.test.ts @@ -31,7 +31,7 @@ describe("Items - Quick Powder", () => { it("QUICK_POWDER activates in battle correctly", async() => { game.override.startingHeldItems([{ name: "SPECIES_STAT_BOOSTER", type: "QUICK_POWDER" }]); const consoleSpy = vi.spyOn(console, "log"); - await game.startBattle([ + await game.classicMode.startBattle([ Species.DITTO ]); @@ -64,7 +64,7 @@ describe("Items - Quick Powder", () => { }); it("QUICK_POWDER held by DITTO", async() => { - await game.startBattle([ + await game.classicMode.startBattle([ Species.DITTO ]); @@ -79,14 +79,14 @@ describe("Items - Quick Powder", () => { expect(spdValue.value / spdStat).toBe(1); // Giving Eviolite to party member and testing if it applies - game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "QUICK_POWDER" ])!.newModifier(partyMember), true); + await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "QUICK_POWDER" ])!.newModifier(partyMember), true); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); expect(spdValue.value / spdStat).toBe(2); - }, 20000); + }); it("QUICK_POWDER held by fused DITTO (base)", async() => { - await game.startBattle([ + await game.classicMode.startBattle([ Species.DITTO, Species.MAROWAK ]); @@ -112,14 +112,14 @@ describe("Items - Quick Powder", () => { expect(spdValue.value / spdStat).toBe(1); // Giving Eviolite to party member and testing if it applies - game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "QUICK_POWDER" ])!.newModifier(partyMember), true); + await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "QUICK_POWDER" ])!.newModifier(partyMember), true); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); expect(spdValue.value / spdStat).toBe(2); - }, 20000); + }); it("QUICK_POWDER held by fused DITTO (part)", async() => { - await game.startBattle([ + await game.classicMode.startBattle([ Species.MAROWAK, Species.DITTO ]); @@ -145,14 +145,14 @@ describe("Items - Quick Powder", () => { expect(spdValue.value / spdStat).toBe(1); // Giving Eviolite to party member and testing if it applies - game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "QUICK_POWDER" ])!.newModifier(partyMember), true); + await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "QUICK_POWDER" ])!.newModifier(partyMember), true); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); expect(spdValue.value / spdStat).toBe(2); - }, 20000); + }); it("QUICK_POWDER not held by DITTO", async() => { - await game.startBattle([ + await game.classicMode.startBattle([ Species.MAROWAK ]); @@ -167,9 +167,9 @@ describe("Items - Quick Powder", () => { expect(spdValue.value / spdStat).toBe(1); // Giving Eviolite to party member and testing if it applies - game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "QUICK_POWDER" ])!.newModifier(partyMember), true); + await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "QUICK_POWDER" ])!.newModifier(partyMember), true); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.SPD, spdValue); expect(spdValue.value / spdStat).toBe(1); - }, 20000); + }); }); diff --git a/src/test/items/thick_club.test.ts b/src/test/items/thick_club.test.ts index 08b19250ea7..d32c213e506 100644 --- a/src/test/items/thick_club.test.ts +++ b/src/test/items/thick_club.test.ts @@ -31,7 +31,7 @@ describe("Items - Thick Club", () => { it("THICK_CLUB activates in battle correctly", async() => { game.override.startingHeldItems([{ name: "SPECIES_STAT_BOOSTER", type: "THICK_CLUB" }]); const consoleSpy = vi.spyOn(console, "log"); - await game.startBattle([ + await game.classicMode.startBattle([ Species.CUBONE ]); @@ -64,7 +64,7 @@ describe("Items - Thick Club", () => { }); it("THICK_CLUB held by CUBONE", async() => { - await game.startBattle([ + await game.classicMode.startBattle([ Species.CUBONE ]); @@ -79,14 +79,14 @@ describe("Items - Thick Club", () => { expect(atkValue.value / atkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "THICK_CLUB" ])!.newModifier(partyMember), true); + await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "THICK_CLUB" ])!.newModifier(partyMember), true); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); expect(atkValue.value / atkStat).toBe(2); - }, 20000); + }); it("THICK_CLUB held by MAROWAK", async() => { - await game.startBattle([ + await game.classicMode.startBattle([ Species.MAROWAK ]); @@ -101,14 +101,14 @@ describe("Items - Thick Club", () => { expect(atkValue.value / atkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "THICK_CLUB" ])!.newModifier(partyMember), true); + await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "THICK_CLUB" ])!.newModifier(partyMember), true); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); expect(atkValue.value / atkStat).toBe(2); - }, 20000); + }); it("THICK_CLUB held by ALOLA_MAROWAK", async() => { - await game.startBattle([ + await game.classicMode.startBattle([ Species.ALOLA_MAROWAK ]); @@ -123,18 +123,18 @@ describe("Items - Thick Club", () => { expect(atkValue.value / atkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "THICK_CLUB" ])!.newModifier(partyMember), true); + await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "THICK_CLUB" ])!.newModifier(partyMember), true); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); expect(atkValue.value / atkStat).toBe(2); - }, 20000); + }); it("THICK_CLUB held by fused CUBONE line (base)", async() => { // Randomly choose from the Cubone line const species = [ Species.CUBONE, Species.MAROWAK, Species.ALOLA_MAROWAK ]; const randSpecies = Utils.randInt(species.length); - await game.startBattle([ + await game.classicMode.startBattle([ species[randSpecies], Species.PIKACHU ]); @@ -160,18 +160,18 @@ describe("Items - Thick Club", () => { expect(atkValue.value / atkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "THICK_CLUB" ])!.newModifier(partyMember), true); + await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "THICK_CLUB" ])!.newModifier(partyMember), true); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); expect(atkValue.value / atkStat).toBe(2); - }, 20000); + }); it("THICK_CLUB held by fused CUBONE line (part)", async() => { // Randomly choose from the Cubone line const species = [ Species.CUBONE, Species.MAROWAK, Species.ALOLA_MAROWAK ]; const randSpecies = Utils.randInt(species.length); - await game.startBattle([ + await game.classicMode.startBattle([ Species.PIKACHU, species[randSpecies] ]); @@ -197,14 +197,14 @@ describe("Items - Thick Club", () => { expect(atkValue.value / atkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "THICK_CLUB" ])!.newModifier(partyMember), true); + await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "THICK_CLUB" ])!.newModifier(partyMember), true); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); expect(atkValue.value / atkStat).toBe(2); - }, 20000); + }); it("THICK_CLUB not held by CUBONE", async() => { - await game.startBattle([ + await game.classicMode.startBattle([ Species.PIKACHU ]); @@ -219,9 +219,9 @@ describe("Items - Thick Club", () => { expect(atkValue.value / atkStat).toBe(1); // Giving Eviolite to party member and testing if it applies - game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "THICK_CLUB" ])!.newModifier(partyMember), true); + await game.scene.addModifier(modifierTypes.SPECIES_STAT_BOOSTER().generateType([], [ "THICK_CLUB" ])!.newModifier(partyMember), true); game.scene.applyModifiers(SpeciesStatBoosterModifier, true, partyMember, Stat.ATK, atkValue); expect(atkValue.value / atkStat).toBe(1); - }, 20000); + }); }); diff --git a/src/test/moves/dragon_rage.test.ts b/src/test/moves/dragon_rage.test.ts index a2350960546..61630ede326 100644 --- a/src/test/moves/dragon_rage.test.ts +++ b/src/test/moves/dragon_rage.test.ts @@ -45,14 +45,10 @@ describe("Moves - Dragon Rage", () => { game.override.enemyPassiveAbility(Abilities.BALL_FETCH); game.override.enemyLevel(100); - await game.startBattle(); + await game.classicMode.startBattle(); partyPokemon = game.scene.getPlayerParty()[0]; enemyPokemon = game.scene.getEnemyPokemon()!; - - // remove berries - game.scene.removePartyMemberModifiers(0); - game.scene.clearEnemyHeldItemModifiers(); }); it("ignores weaknesses", async () => { diff --git a/src/test/moves/fell_stinger.test.ts b/src/test/moves/fell_stinger.test.ts new file mode 100644 index 00000000000..a901ddced44 --- /dev/null +++ b/src/test/moves/fell_stinger.test.ts @@ -0,0 +1,198 @@ +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import GameManager from "../utils/gameManager"; +import { Species } from "#enums/species"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Stat } from "#enums/stat"; +import { StatusEffect } from "#app/enums/status-effect"; +import { WeatherType } from "#app/enums/weather-type"; +import { allMoves } from "#app/data/move"; + + +describe("Moves - Fell Stinger", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + game.override.battleType("single") + .moveset([ + Moves.FELL_STINGER, + Moves.SALT_CURE, + Moves.BIND, + Moves.LEECH_SEED + ]) + .startingLevel(50) + .disableCrits() + .enemyAbility(Abilities.STURDY) + .enemySpecies(Species.HYPNO) + .enemyMoveset(Moves.SPLASH) + .enemyLevel(5); + }); + + it("should not grant stat boost if opponent gets KO'd by recoil", async () => { + game.override.enemyMoveset([ Moves.DOUBLE_EDGE ]); + + await game.classicMode.startBattle([ Species.LEAVANNY ]); + const leadPokemon = game.scene.getPlayerPokemon()!; + game.move.select(Moves.FELL_STINGER); + + await game.phaseInterceptor.to("VictoryPhase"); + + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); + }); + + it("should not grant stat boost if enemy is KO'd by status effect", async () => { + game.override + .enemyMoveset(Moves.SPLASH) + .enemyStatusEffect(StatusEffect.BURN); + + await game.classicMode.startBattle([ Species.LEAVANNY ]); + const leadPokemon = game.scene.getPlayerPokemon()!; + game.move.select(Moves.FELL_STINGER); + + await game.phaseInterceptor.to("VictoryPhase"); + + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); + }); + + it("should not grant stat boost if enemy is KO'd by damaging weather", async () => { + game.override.weather(WeatherType.HAIL); + + await game.classicMode.startBattle([ Species.LEAVANNY ]); + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.FELL_STINGER); + + await game.phaseInterceptor.to("VictoryPhase"); + + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); + }); + + it("should not grant stat boost if enemy is KO'd by Dry Skin + Harsh Sunlight", async () => { + game.override + .enemyPassiveAbility(Abilities.STURDY) + .enemyAbility(Abilities.DRY_SKIN) + .weather(WeatherType.HARSH_SUN); + + await game.challengeMode.startBattle([ Species.LEAVANNY ]); + const leadPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.FELL_STINGER); + + await game.phaseInterceptor.to("VictoryPhase"); + + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); + }); + + it("should not grant stat boost if enemy is saved by Reviver Seed", async () => { + game.override + .enemyAbility(Abilities.BALL_FETCH) + .enemyHeldItems([{ name: "REVIVER_SEED" }]); + + await game.classicMode.startBattle([ Species.LEAVANNY ]); + const leadPokemon = game.scene.getPlayerPokemon()!; + game.move.select(Moves.FELL_STINGER); + + await game.phaseInterceptor.to("TurnEndPhase"); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); + }); + + it("should not grant stat boost if enemy is KO'd by Salt Cure", async () => { + game.override.battleType("double") + .startingLevel(5); + const saltCure = allMoves[Moves.SALT_CURE]; + const fellStinger = allMoves[Moves.FELL_STINGER]; + vi.spyOn(saltCure, "accuracy", "get").mockReturnValue(100); + vi.spyOn(fellStinger, "power", "get").mockReturnValue(50000); + + await game.classicMode.startBattle([ Species.LEAVANNY ]); + const leadPokemon = game.scene.getPlayerPokemon()!; + const leftEnemy = game.scene.getEnemyField()[0]!; + + // Turn 1: set Salt Cure, enemy splashes and does nothing + game.move.select(Moves.SALT_CURE, 0, leftEnemy.getBattlerIndex()); + + // Turn 2: enemy Endures Fell Stinger, then dies to Salt Cure + await game.toNextTurn(); + expect(leftEnemy.isFainted()).toBe(false); + leftEnemy.heal(leftEnemy.getMaxHp()); + game.move.select(Moves.FELL_STINGER); + await game.toNextTurn(); + + expect(leftEnemy.isFainted()).toBe(true); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); + }); + + it("should not grant stat boost if enemy dies to Bind or a similar effect", async () => { + game.override.battleType("double") + .startingLevel(5); + vi.spyOn(allMoves[Moves.BIND], "accuracy", "get").mockReturnValue(100); + vi.spyOn(allMoves[Moves.FELL_STINGER], "power", "get").mockReturnValue(50000); + + await game.classicMode.startBattle([ Species.LEAVANNY ]); + const leadPokemon = game.scene.getPlayerPokemon()!; + const leftEnemy = game.scene.getEnemyField()[0]!; + + // Turn 1: set Bind, enemy splashes and does nothing + game.move.select(Moves.BIND, 0, leftEnemy.getBattlerIndex()); + + // Turn 2: enemy Endures Fell Stinger, then dies to Bind + await game.toNextTurn(); + expect(leftEnemy.isFainted()).toBe(false); + leftEnemy.heal(leftEnemy.getMaxHp()); + game.move.select(Moves.FELL_STINGER, 0, leftEnemy.getBattlerIndex()); + await game.toNextTurn(); + + expect(leftEnemy.isFainted()).toBe(true); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); + }); + + it("should not grant stat boost if enemy dies to Leech Seed", async () => { + game.override.battleType("double") + .startingLevel(5); + vi.spyOn(allMoves[Moves.LEECH_SEED], "accuracy", "get").mockReturnValue(100); + vi.spyOn(allMoves[Moves.FELL_STINGER], "power", "get").mockReturnValue(50000); + + await game.classicMode.startBattle([ Species.LEAVANNY ]); + const leadPokemon = game.scene.getPlayerPokemon()!; + const leftEnemy = game.scene.getEnemyField()[0]!; + + // Turn 1: set Leech Seed, enemy splashes and does nothing + game.move.select(Moves.LEECH_SEED, 0, leftEnemy.getBattlerIndex()); + + // Turn 2: enemy Endures Fell Stinger, then dies to Leech Seed + await game.toNextTurn(); + expect(leftEnemy.isFainted()).toBe(false); + leftEnemy.heal(leftEnemy.getMaxHp()); + game.move.select(Moves.FELL_STINGER, 0, leftEnemy.getBattlerIndex()); + await game.toNextTurn(); + + expect(leftEnemy.isFainted()).toBe(true); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); + }); + + it("should grant stat boost if enemy dies directly to hit", async () => { + game.override.enemyAbility(Abilities.KLUTZ); + + await game.classicMode.startBattle([ Species.LEAVANNY ]); + const leadPokemon = game.scene.getPlayerPokemon(); + game.move.select(Moves.FELL_STINGER); + + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(leadPokemon?.getStatStage(Stat.ATK)).toBe(3); + }); +}); diff --git a/src/test/moves/fissure.test.ts b/src/test/moves/fissure.test.ts index 0975a87b2b1..65719df0205 100644 --- a/src/test/moves/fissure.test.ts +++ b/src/test/moves/fissure.test.ts @@ -41,14 +41,10 @@ describe("Moves - Fissure", () => { game.override.enemyPassiveAbility(Abilities.BALL_FETCH); game.override.enemyLevel(100); - await game.startBattle(); + await game.classicMode.startBattle(); partyPokemon = game.scene.getPlayerParty()[0]; enemyPokemon = game.scene.getEnemyPokemon()!; - - // remove berries - game.scene.removePartyMemberModifiers(0); - game.scene.clearEnemyHeldItemModifiers(); }); it("ignores damage modification from abilities, for example FUR_COAT", async () => { diff --git a/src/test/moves/last_respects.test.ts b/src/test/moves/last_respects.test.ts new file mode 100644 index 00000000000..71a76e3fa1a --- /dev/null +++ b/src/test/moves/last_respects.test.ts @@ -0,0 +1,219 @@ +import { Moves } from "#enums/moves"; +import { BattlerIndex } from "#app/battle"; +import { Species } from "#enums/species"; +import { Abilities } from "#enums/abilities"; +import GameManager from "#test/utils/gameManager"; +import { allMoves } from "#app/data/move"; +import { MoveEffectPhase } from "#app/phases/move-effect-phase"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Moves - Last Respects", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + const move = allMoves[Moves.LAST_RESPECTS]; + const basePower = move.power; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .battleType("single") + .disableCrits() + .moveset([ Moves.LAST_RESPECTS, Moves.EXPLOSION, Moves.LUNAR_DANCE ]) + .ability(Abilities.BALL_FETCH) + .enemyAbility(Abilities.BALL_FETCH) + .enemySpecies(Species.MAGIKARP) + .enemyMoveset(Moves.SPLASH) + .startingLevel(1) + .enemyLevel(100); + + vi.spyOn(move, "calculateBattlePower"); + }); + + it("should have 150 power if 2 allies faint before using move", async () => { + await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + + /** + * Bulbasur faints once + */ + game.move.select(Moves.EXPLOSION); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + /** + * Charmander faints once + */ + game.move.select(Moves.EXPLOSION); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + game.doSelectPartyPokemon(2); + await game.toNextTurn(); + + game.move.select(Moves.LAST_RESPECTS); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(move.calculateBattlePower).toHaveReturnedWith(basePower + (2 * 50)); + }); + + it("should have 200 power if an ally fainted twice and another one once", async () => { + await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + + /** + * Bulbasur faints once + */ + game.move.select(Moves.EXPLOSION); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + /** + * Charmander faints once + */ + game.doRevivePokemon(1); + game.move.select(Moves.EXPLOSION); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + /** + * Bulbasur faints twice + */ + game.move.select(Moves.EXPLOSION); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + game.doSelectPartyPokemon(2); + await game.toNextTurn(); + + game.move.select(Moves.LAST_RESPECTS); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.phaseInterceptor.to(MoveEffectPhase); + + expect(move.calculateBattlePower).toHaveReturnedWith(basePower + (3 * 50)); + }); + + it("should maintain its power for the player during the next battle if it is within the same arena encounter", async () => { + game.override + .enemySpecies(Species.MAGIKARP) + .startingWave(1) + .enemyLevel(1) + .startingLevel(100) + .enemyMoveset(Moves.SPLASH); + + await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + + /** + * The first Pokemon faints and another Pokemon in the party is selected. + */ + game.move.select(Moves.LUNAR_DANCE); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + /** + * Enemy Pokemon faints and new wave is entered. + */ + game.move.select(Moves.LAST_RESPECTS); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.toNextWave(); + expect(game.scene.arena.playerFaints).toBe(1); + + game.move.select(Moves.LAST_RESPECTS); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.phaseInterceptor.to("MoveEndPhase"); + expect(move.calculateBattlePower).toHaveLastReturnedWith(basePower + (1 * 50)); + }); + + it("should reset enemyFaints count on progressing to the next wave.", async () => { + game.override + .enemySpecies(Species.MAGIKARP) + .startingWave(1) + .enemyLevel(1) + .startingLevel(100) + .enemyMoveset(Moves.LAST_RESPECTS) + .moveset([ Moves.LUNAR_DANCE, Moves.LAST_RESPECTS, Moves.SPLASH ]); + + await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + + /** + * The first Pokemon faints and another Pokemon in the party is selected. + */ + game.move.select(Moves.LUNAR_DANCE); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + /** + * Enemy Pokemon faints and new wave is entered. + */ + game.move.select(Moves.LAST_RESPECTS); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.toNextWave(); + expect(game.scene.currentBattle.enemyFaints).toBe(0); + + game.move.select(Moves.LAST_RESPECTS); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.phaseInterceptor.to("MoveEndPhase"); + expect(move.calculateBattlePower).toHaveLastReturnedWith(basePower); + }); + + it("should reset playerFaints count if we enter new trainer battle", async () => { + game.override + .enemySpecies(Species.MAGIKARP) + .startingWave(4) + .enemyLevel(1) + .startingLevel(100); + + await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + + game.move.select(Moves.LUNAR_DANCE); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + game.move.select(Moves.LAST_RESPECTS); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.toNextWave(); + + game.move.select(Moves.LAST_RESPECTS); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.phaseInterceptor.to("BerryPhase", false); + + expect(move.calculateBattlePower).toHaveLastReturnedWith(basePower); + }); + + it("should reset playerFaints count if we enter new biome", async () => { + game.override + .enemySpecies(Species.MAGIKARP) + .startingWave(10) + .enemyLevel(1) + .startingLevel(100); + + await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + + game.move.select(Moves.LUNAR_DANCE); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + game.move.select(Moves.LAST_RESPECTS); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.toNextWave(); + + game.move.select(Moves.LAST_RESPECTS); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.phaseInterceptor.to("BerryPhase", false); + + expect(move.calculateBattlePower).toHaveLastReturnedWith(basePower); + }); +}); diff --git a/src/test/moves/magic_coat.test.ts b/src/test/moves/magic_coat.test.ts new file mode 100644 index 00000000000..7371c89d4ac --- /dev/null +++ b/src/test/moves/magic_coat.test.ts @@ -0,0 +1,286 @@ +import { BattlerIndex } from "#app/battle"; +import { ArenaTagSide } from "#app/data/arena-tag"; +import { allMoves } from "#app/data/move"; +import { ArenaTagType } from "#app/enums/arena-tag-type"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { Stat } from "#app/enums/stat"; +import { StatusEffect } from "#app/enums/status-effect"; +import { MoveResult } from "#app/field/pokemon"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Moves - Magic Coat", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .ability(Abilities.BALL_FETCH) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.MAGIC_COAT); + }); + + it("should fail if the user goes last in the turn", async () => { + game.override.moveset([ Moves.PROTECT ]); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + game.move.select(Moves.PROTECT); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getEnemyPokemon()!.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + }); + + it("should fail if called again in the same turn due to moves like instruct", async () => { + game.override.moveset([ Moves.INSTRUCT ]); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + game.move.select(Moves.INSTRUCT); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getEnemyPokemon()!.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + }); + + it("should not reflect moves used on the next turn", async () => { + game.override.moveset([ Moves.GROWL, Moves.SPLASH ]); + game.override.enemyMoveset([ Moves.MAGIC_COAT, Moves.SPLASH ]); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + // turn 1 + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.MAGIC_COAT); + await game.toNextTurn(); + + // turn 2 + game.move.select(Moves.GROWL); + await game.forceEnemyMove(Moves.SPLASH); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should reflect basic status moves", async () => { + game.override.moveset([ Moves.GROWL ]); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should individually bounce back multi-target moves when used by both targets in doubles", async () => { + game.override.battleType("double"); + game.override.moveset([ Moves.GROWL, Moves.SPLASH ]); + await game.classicMode.startBattle([ Species.MAGIKARP, Species.MAGIKARP ]); + + game.move.select(Moves.GROWL, 0); + game.move.select(Moves.SPLASH, 1); + await game.phaseInterceptor.to("BerryPhase"); + + const user = game.scene.getPlayerField()[0]; + expect(user.getStatStage(Stat.ATK)).toBe(-2); + }); + + it("should bounce back a spread status move against both pokemon", async () => { + game.override.battleType("double"); + game.override.moveset([ Moves.GROWL, Moves.SPLASH ]); + game.override.enemyMoveset([ Moves.SPLASH, Moves.MAGIC_COAT ]); + await game.classicMode.startBattle([ Species.MAGIKARP, Species.MAGIKARP ]); + + game.move.select(Moves.GROWL, 0); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.SPLASH); + await game.forceEnemyMove(Moves.MAGIC_COAT); + + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerField().every(p => p.getStatStage(Stat.ATK) === -1)).toBeTruthy(); + }); + + it("should still bounce back a move that would otherwise fail", async () => { + await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.scene.getEnemyPokemon()?.setStatStage(Stat.ATK, -6); + game.override.moveset([ Moves.GROWL ]); + + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should not bounce back a move that was just bounced", async () => { + game.override.battleType("double"); + game.override.ability(Abilities.MAGIC_BOUNCE); + game.override.moveset([ Moves.GROWL, Moves.MAGIC_COAT ]); + game.override.enemyMoveset([ Moves.SPLASH, Moves.MAGIC_COAT ]); + await game.classicMode.startBattle([ Species.MAGIKARP, Species.MAGIKARP ]); + + game.move.select(Moves.MAGIC_COAT, 0); + game.move.select(Moves.GROWL, 1); + await game.forceEnemyMove(Moves.MAGIC_COAT); + await game.forceEnemyMove(Moves.SPLASH); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyField()[0].getStatStage(Stat.ATK)).toBe(0); + }); + + // todo while Mirror Armor is not implemented + it.todo("should receive the stat change after reflecting a move back to a mirror armor user", async () => { + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should still bounce back a move from a mold breaker user", async () => { + game.override.ability(Abilities.MOLD_BREAKER); + game.override.moveset([ Moves.GROWL ]); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.ATK)).toBe(0); + expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + }); + + it("should only bounce spikes back once when both targets use magic coat in doubles", async () => { + game.override.battleType("double"); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.override.moveset([ Moves.SPIKES ]); + + game.move.select(Moves.SPIKES); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.PLAYER)!["layers"]).toBe(1); + expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY)).toBeUndefined(); + }); + + it("should not bounce back curse", async() => { + game.override.starterSpecies(Species.GASTLY); + await game.classicMode.startBattle([ Species.GASTLY ]); + game.override.moveset([ Moves.CURSE ]); + + game.move.select(Moves.CURSE); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getEnemyPokemon()!.getTag(BattlerTagType.CURSED)).toBeDefined(); + }); + + // TODO: encore is failing if the last move was virtual. + it.todo("should not cause the bounced move to count for encore", async () => { + game.override.moveset([ Moves.GROWL, Moves.ENCORE ]); + game.override.enemyMoveset([ Moves.MAGIC_COAT, Moves.TACKLE ]); + game.override.enemyAbility(Abilities.MAGIC_BOUNCE); + + await game.classicMode.startBattle([ Species.MAGIKARP ]); + const enemyPokemon = game.scene.getEnemyPokemon()!; + + // turn 1 + game.move.select(Moves.GROWL); + await game.forceEnemyMove(Moves.MAGIC_COAT); + await game.toNextTurn(); + + // turn 2 + game.move.select(Moves.ENCORE); + await game.forceEnemyMove(Moves.TACKLE); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.phaseInterceptor.to("BerryPhase"); + expect(enemyPokemon.getTag(BattlerTagType.ENCORE)!["moveId"]).toBe(Moves.TACKLE); + expect(enemyPokemon.getLastXMoves()[0].move).toBe(Moves.TACKLE); + }); + + // TODO: stomping tantrum should consider moves that were bounced. + it.todo("should cause stomping tantrum to double in power when the last move was bounced", async () => { + game.override.battleType("single"); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + game.override.moveset([ Moves.STOMPING_TANTRUM, Moves.CHARM ]); + + const stomping_tantrum = allMoves[Moves.STOMPING_TANTRUM]; + vi.spyOn(stomping_tantrum, "calculateBattlePower"); + + game.move.select(Moves.CHARM); + await game.toNextTurn(); + + game.move.select(Moves.STOMPING_TANTRUM); + await game.phaseInterceptor.to("BerryPhase"); + expect(stomping_tantrum.calculateBattlePower).toHaveReturnedWith(150); + }); + + // TODO: stomping tantrum should consider moves that were bounced. + it.todo("should properly cause the enemy's stomping tantrum to be doubled in power after bouncing and failing", async () => { + game.override.enemyMoveset([ Moves.STOMPING_TANTRUM, Moves.SPLASH, Moves.CHARM ]); + await game.classicMode.startBattle([ Species.BULBASAUR ]); + + const stomping_tantrum = allMoves[Moves.STOMPING_TANTRUM]; + const enemy = game.scene.getEnemyPokemon()!; + vi.spyOn(stomping_tantrum, "calculateBattlePower"); + + game.move.select(Moves.SPORE); + await game.forceEnemyMove(Moves.CHARM); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(enemy.getLastXMoves(1)[0].result).toBe("success"); + + await game.phaseInterceptor.to("BerryPhase"); + expect(stomping_tantrum.calculateBattlePower).toHaveReturnedWith(75); + + await game.toNextTurn(); + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + expect(stomping_tantrum.calculateBattlePower).toHaveReturnedWith(75); + }); + + it("should respect immunities when bouncing a move", async () => { + vi.spyOn(allMoves[Moves.THUNDER_WAVE], "accuracy", "get").mockReturnValue(100); + game.override.moveset([ Moves.THUNDER_WAVE, Moves.GROWL ]); + game.override.ability(Abilities.SOUNDPROOF); + await game.classicMode.startBattle([ Species.PHANPY ]); + + // Turn 1 - thunder wave immunity test + game.move.select(Moves.THUNDER_WAVE); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerPokemon()!.status).toBeUndefined(); + + // Turn 2 - soundproof immunity test + game.move.select(Moves.GROWL); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(0); + }); + + it("should bounce back a move before the accuracy check", async () => { + game.override.moveset([ Moves.SPORE ]); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + const attacker = game.scene.getPlayerPokemon()!; + + vi.spyOn(attacker, "getAccuracyMultiplier").mockReturnValue(0.0); + game.move.select(Moves.SPORE); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerPokemon()!.status?.effect).toBe(StatusEffect.SLEEP); + }); + + it("should take the accuracy of the magic bounce user into account", async () => { + game.override.moveset([ Moves.SPORE ]); + await game.classicMode.startBattle([ Species.MAGIKARP ]); + const opponent = game.scene.getEnemyPokemon()!; + + vi.spyOn(opponent, "getAccuracyMultiplier").mockReturnValue(0); + game.move.select(Moves.SPORE); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerPokemon()!.status).toBeUndefined(); + }); +}); diff --git a/src/test/moves/spectral_thief.test.ts b/src/test/moves/spectral_thief.test.ts new file mode 100644 index 00000000000..8913b7f3683 --- /dev/null +++ b/src/test/moves/spectral_thief.test.ts @@ -0,0 +1,224 @@ +import { Abilities } from "#enums/abilities"; +import { BattlerIndex } from "#app/battle"; +import { Stat } from "#enums/stat"; +import { allMoves } from "#app/data/move"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Spectral Thief", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ type: Phaser.HEADLESS }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .enemySpecies(Species.SHUCKLE) + .enemyLevel(100) + .enemyMoveset(Moves.SPLASH) + .enemyAbility(Abilities.BALL_FETCH) + .moveset([ Moves.SPECTRAL_THIEF, Moves.SPLASH ]) + .ability(Abilities.BALL_FETCH) + .disableCrits; + }); + + it("should steal max possible positive stat changes and ignore negative ones.", async () => { + await game.classicMode.startBattle(); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + enemy.setStatStage(Stat.ATK, 6); + enemy.setStatStage(Stat.DEF, -6); + enemy.setStatStage(Stat.SPATK, 6); + enemy.setStatStage(Stat.SPDEF, -6); + enemy.setStatStage(Stat.SPD, 3); + + player.setStatStage(Stat.ATK, 4); + player.setStatStage(Stat.DEF, 1); + player.setStatStage(Stat.SPATK, 0); + player.setStatStage(Stat.SPDEF, 0); + player.setStatStage(Stat.SPD, -2); + + game.move.select(Moves.SPECTRAL_THIEF); + await game.phaseInterceptor.to(TurnEndPhase); + + /** + * enemy has +6 ATK and player +4 => player only steals +2 + * enemy has -6 DEF and player 1 => player should not steal + * enemy has +6 SPATK and player 0 => player only steals +6 + * enemy has -6 SPDEF and player 0 => player should not steal + * enemy has +3 SPD and player -2 => player only steals +3 + */ + expect(player.getStatStages()).toEqual([ 6, 1, 6, 0, 1, 0, 0 ]); + expect(enemy.getStatStages()).toEqual([ 4, -6, 0, -6, 0, 0, 0 ]); + }); + + it("should steal stat stages before dmg calculation", async () => { + game.override + .enemySpecies(Species.MAGIKARP) + .enemyLevel(50); + await game.classicMode.startBattle(); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + const moveToCheck = allMoves[Moves.SPECTRAL_THIEF]; + const dmgBefore = enemy.getAttackDamage(player, moveToCheck, false, false, false, false).damage; + + enemy.setStatStage(Stat.ATK, 6); + + player.setStatStage(Stat.ATK, 0); + + game.move.select(Moves.SPECTRAL_THIEF); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(dmgBefore).toBeLessThan(enemy.getAttackDamage(player, moveToCheck, false, false, false, false).damage); + }); + + it("should steal stat stages as a negative value with Contrary.", async () => { + game.override + .ability(Abilities.CONTRARY); + await game.classicMode.startBattle(); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + enemy.setStatStage(Stat.ATK, 6); + + player.setStatStage(Stat.ATK, 0); + + game.move.select(Moves.SPECTRAL_THIEF); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(player.getStatStage(Stat.ATK)).toEqual(-6); + expect(enemy.getStatStage(Stat.ATK)).toEqual(0); + }); + + it("should steal double the stat stages with Simple.", async () => { + game.override + .ability(Abilities.SIMPLE); + await game.classicMode.startBattle(); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + enemy.setStatStage(Stat.ATK, 3); + + player.setStatStage(Stat.ATK, 0); + + game.move.select(Moves.SPECTRAL_THIEF); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(player.getStatStage(Stat.ATK)).toEqual(6); + expect(enemy.getStatStage(Stat.ATK)).toEqual(0); + }); + + it("should steal the stat stages through Clear Body.", async () => { + game.override + .enemyAbility(Abilities.CLEAR_BODY); + await game.classicMode.startBattle(); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + enemy.setStatStage(Stat.ATK, 3); + + player.setStatStage(Stat.ATK, 0); + + game.move.select(Moves.SPECTRAL_THIEF); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(player.getStatStage(Stat.ATK)).toEqual(3); + expect(enemy.getStatStage(Stat.ATK)).toEqual(0); + }); + + it("should steal the stat stages through White Smoke.", async () => { + game.override + .enemyAbility(Abilities.WHITE_SMOKE); + await game.classicMode.startBattle(); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + enemy.setStatStage(Stat.ATK, 3); + + player.setStatStage(Stat.ATK, 0); + + game.move.select(Moves.SPECTRAL_THIEF); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(player.getStatStage(Stat.ATK)).toEqual(3); + expect(enemy.getStatStage(Stat.ATK)).toEqual(0); + }); + + it("should steal the stat stages through Hyper Cutter.", async () => { + game.override + .enemyAbility(Abilities.HYPER_CUTTER); + await game.classicMode.startBattle(); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + enemy.setStatStage(Stat.ATK, 3); + + player.setStatStage(Stat.ATK, 0); + + game.move.select(Moves.SPECTRAL_THIEF); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(player.getStatStage(Stat.ATK)).toEqual(3); + expect(enemy.getStatStage(Stat.ATK)).toEqual(0); + }); + + it("should bypass Substitute.", async () => { + game.override + .enemyMoveset(Moves.SUBSTITUTE); + await game.classicMode.startBattle(); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + enemy.setStatStage(Stat.ATK, 3); + + player.setStatStage(Stat.ATK, 0); + + game.move.select(Moves.SPECTRAL_THIEF); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(player.getStatStage(Stat.ATK)).toEqual(3); + expect(enemy.getStatStage(Stat.ATK)).toEqual(0); + expect(enemy.hp).toBeLessThan(enemy.getMaxHp() - 1); + }); + + it("should get blocked by protect.", async () => { + game.override + .enemyMoveset(Moves.PROTECT); + await game.classicMode.startBattle(); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + enemy.setStatStage(Stat.ATK, 3); + + player.setStatStage(Stat.ATK, 0); + + game.move.select(Moves.SPECTRAL_THIEF); + await game.phaseInterceptor.to(TurnEndPhase); + + expect(player.getStatStage(Stat.ATK)).toEqual(0); + expect(enemy.getStatStage(Stat.ATK)).toEqual(3); + expect(enemy.hp).toBe(enemy.getMaxHp()); + }); +}); diff --git a/src/test/moves/telekinesis.test.ts b/src/test/moves/telekinesis.test.ts index 76c0d001f00..ba2bc40a189 100644 --- a/src/test/moves/telekinesis.test.ts +++ b/src/test/moves/telekinesis.test.ts @@ -7,6 +7,7 @@ import { MoveResult } from "#app/field/pokemon"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; +import { BattlerIndex } from "#app/battle"; describe("Moves - Telekinesis", () => { let phaserGame: Phaser.Game; @@ -121,4 +122,17 @@ describe("Moves - Telekinesis", () => { expect(enemyOpponent.getTag(BattlerTagType.FLOATING)).toBeUndefined(); expect(playerPokemon.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); }); + + it("should not be baton passed onto a mega gengar", async () => { + game.override.moveset([ Moves.BATON_PASS ]) + .enemyMoveset([ Moves.TELEKINESIS ]) + .starterForms({ [Species.GENGAR]: 1 }); + + await game.classicMode.startBattle([ Species.MAGIKARP, Species.GENGAR ]); + game.move.select(Moves.BATON_PASS); + game.doSelectPartyPokemon(1); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.getPlayerPokemon()!.getTag(BattlerTagType.TELEKINESIS)).toBeUndefined(); + }); }); diff --git a/src/test/moves/tera_blast.test.ts b/src/test/moves/tera_blast.test.ts index 44dc29f68b5..34d171b47bb 100644 --- a/src/test/moves/tera_blast.test.ts +++ b/src/test/moves/tera_blast.test.ts @@ -1,6 +1,6 @@ import { BattlerIndex } from "#app/battle"; import { Stat } from "#enums/stat"; -import { allMoves } from "#app/data/move"; +import { allMoves, TeraMoveCategoryAttr } from "#app/data/move"; import { Type } from "#enums/type"; import { Abilities } from "#app/enums/abilities"; import { HitResult } from "#app/field/pokemon"; @@ -14,6 +14,7 @@ describe("Moves - Tera Blast", () => { let phaserGame: Phaser.Game; let game: GameManager; const moveToCheck = allMoves[Moves.TERA_BLAST]; + const teraBlastAttr = moveToCheck.getAttrs(TeraMoveCategoryAttr)[0]; beforeAll(() => { phaserGame = new Phaser.Game({ @@ -37,8 +38,8 @@ describe("Moves - Tera Blast", () => { .startingHeldItems([{ name: "TERA_SHARD", type: Type.FIRE }]) .enemySpecies(Species.MAGIKARP) .enemyMoveset(Moves.SPLASH) - .enemyAbility(Abilities.BALL_FETCH) - .enemyLevel(20); + .enemyAbility(Abilities.STURDY) + .enemyLevel(50); vi.spyOn(moveToCheck, "calculateBattlePower"); }); @@ -86,19 +87,86 @@ describe("Moves - Tera Blast", () => { expect(enemyPokemon.apply).toHaveReturnedWith(HitResult.SUPER_EFFECTIVE); }); - // Currently abilities are bugged and can't see when a move's category is changed - it.todo("uses the higher stat of the user's Atk and SpAtk for damage calculation", async () => { - game.override.enemyAbility(Abilities.TOXIC_DEBRIS); + it("uses the higher ATK for damage calculation", async () => { await game.startBattle(); const playerPokemon = game.scene.getPlayerPokemon()!; playerPokemon.stats[Stat.ATK] = 100; playerPokemon.stats[Stat.SPATK] = 1; + vi.spyOn(teraBlastAttr, "apply"); + game.move.select(Moves.TERA_BLAST); - await game.phaseInterceptor.to("TurnEndPhase"); - expect(game.scene.getEnemyPokemon()!.battleData.abilityRevealed).toBe(true); - }, 20000); + await game.toNextTurn(); + expect(teraBlastAttr.apply).toHaveLastReturnedWith(true); + }); + + it("uses the higher SPATK for damage calculation", async () => { + await game.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + playerPokemon.stats[Stat.ATK] = 1; + playerPokemon.stats[Stat.SPATK] = 100; + + vi.spyOn(teraBlastAttr, "apply"); + + game.move.select(Moves.TERA_BLAST); + await game.toNextTurn(); + expect(teraBlastAttr.apply).toHaveLastReturnedWith(false); + }); + + it("should stay as a special move if ATK turns lower than SPATK mid-turn", async () => { + game.override.enemyMoveset([ Moves.CHARM ]); + await game.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + playerPokemon.stats[Stat.ATK] = 51; + playerPokemon.stats[Stat.SPATK] = 50; + + vi.spyOn(teraBlastAttr, "apply"); + + game.move.select(Moves.TERA_BLAST); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.toNextTurn(); + expect(teraBlastAttr.apply).toHaveLastReturnedWith(false); + }); + + it("does not change its move category from stat changes due to held items", async () => { + game.override + .startingHeldItems([{ name: "SPECIES_STAT_BOOSTER", type: "THICK_CLUB" }]) + .starterSpecies(Species.CUBONE); + await game.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + + playerPokemon.stats[Stat.ATK] = 50; + playerPokemon.stats[Stat.SPATK] = 51; + + vi.spyOn(teraBlastAttr, "apply"); + + game.move.select(Moves.TERA_BLAST); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.toNextTurn(); + + expect(teraBlastAttr.apply).toHaveLastReturnedWith(false); + }); + + it("does not change its move category from stat changes due to abilities", async () => { + game.override.ability(Abilities.HUGE_POWER); + await game.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + playerPokemon.stats[Stat.ATK] = 50; + playerPokemon.stats[Stat.SPATK] = 51; + + vi.spyOn(teraBlastAttr, "apply"); + + game.move.select(Moves.TERA_BLAST); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.toNextTurn(); + expect(teraBlastAttr.apply).toHaveLastReturnedWith(false); + }); + it("causes stat drops if user is Stellar tera type", async () => { game.override.startingHeldItems([{ name: "TERA_SHARD", type: Type.STELLAR }]); diff --git a/src/test/moves/toxic_spikes.test.ts b/src/test/moves/toxic_spikes.test.ts index c2d1c5aaee8..8969289c2f2 100644 --- a/src/test/moves/toxic_spikes.test.ts +++ b/src/test/moves/toxic_spikes.test.ts @@ -132,7 +132,7 @@ describe("Moves - Toxic Spikes", () => { const sessionData : SessionSaveData = gameData["getSessionSaveData"](); localStorage.setItem("sessionTestData", encrypt(JSON.stringify(sessionData), true)); const recoveredData : SessionSaveData = gameData.parseSessionData(decrypt(localStorage.getItem("sessionTestData")!, true)); - gameData.loadSession(0, recoveredData); + await gameData.loadSession(0, recoveredData); expect(sessionData.arena.tags).toEqual(recoveredData.arena.tags); localStorage.removeItem("sessionTestData"); diff --git a/src/test/mystery-encounter/mystery-encounter-utils.test.ts b/src/test/mystery-encounter/mystery-encounter-utils.test.ts index f0057fea7f0..7c924b86e0d 100644 --- a/src/test/mystery-encounter/mystery-encounter-utils.test.ts +++ b/src/test/mystery-encounter/mystery-encounter-utils.test.ts @@ -48,12 +48,12 @@ describe("Mystery Encounter Utils", () => { expect(result.species.speciesId).toBe(Species.ARCEUS); }); - it("gets a fainted pokemon from player party if isAllowedInBattle is false", () => { + it("gets a fainted pokemon from player party if isAllowedInBattle is false", async () => { // Both pokemon fainted scene.getPlayerParty().forEach(p => { p.hp = 0; p.trySetStatus(StatusEffect.FAINT); - p.updateInfo(); + void p.updateInfo(); }); // Seeds are calculated to return index 0 first, 1 second (if both pokemon are legal) @@ -68,12 +68,12 @@ describe("Mystery Encounter Utils", () => { expect(result.species.speciesId).toBe(Species.ARCEUS); }); - it("gets an unfainted legal pokemon from player party if isAllowed is true and isFainted is false", () => { + it("gets an unfainted legal pokemon from player party if isAllowed is true and isFainted is false", async () => { // Only faint 1st pokemon const party = scene.getPlayerParty(); party[0].hp = 0; party[0].trySetStatus(StatusEffect.FAINT); - party[0].updateInfo(); + await party[0].updateInfo(); // Seeds are calculated to return index 0 first, 1 second (if both pokemon are legal) game.override.seed("random"); @@ -87,12 +87,12 @@ describe("Mystery Encounter Utils", () => { expect(result.species.speciesId).toBe(Species.MANAPHY); }); - it("returns last unfainted pokemon if doNotReturnLastAbleMon is false", () => { + it("returns last unfainted pokemon if doNotReturnLastAbleMon is false", async () => { // Only faint 1st pokemon const party = scene.getPlayerParty(); party[0].hp = 0; party[0].trySetStatus(StatusEffect.FAINT); - party[0].updateInfo(); + await party[0].updateInfo(); // Seeds are calculated to return index 0 first, 1 second (if both pokemon are legal) game.override.seed("random"); @@ -106,12 +106,12 @@ describe("Mystery Encounter Utils", () => { expect(result.species.speciesId).toBe(Species.MANAPHY); }); - it("never returns last unfainted pokemon if doNotReturnLastAbleMon is true", () => { + it("never returns last unfainted pokemon if doNotReturnLastAbleMon is true", async () => { // Only faint 1st pokemon const party = scene.getPlayerParty(); party[0].hp = 0; party[0].trySetStatus(StatusEffect.FAINT); - party[0].updateInfo(); + await party[0].updateInfo(); // Seeds are calculated to return index 0 first, 1 second (if both pokemon are legal) game.override.seed("random"); @@ -152,12 +152,12 @@ describe("Mystery Encounter Utils", () => { expect(result.species.speciesId).toBe(Species.ARCEUS); }); - it("returns highest level unfainted if unfainted is true", () => { + it("returns highest level unfainted if unfainted is true", async () => { const party = scene.getPlayerParty(); party[0].level = 100; party[0].hp = 0; party[0].trySetStatus(StatusEffect.FAINT); - party[0].updateInfo(); + await party[0].updateInfo(); party[1].level = 10; const result = getHighestLevelPlayerPokemon(true); @@ -191,12 +191,12 @@ describe("Mystery Encounter Utils", () => { expect(result.species.speciesId).toBe(Species.ARCEUS); }); - it("returns lowest level unfainted if unfainted is true", () => { + it("returns lowest level unfainted if unfainted is true", async () => { const party = scene.getPlayerParty(); party[0].level = 10; party[0].hp = 0; party[0].trySetStatus(StatusEffect.FAINT); - party[0].updateInfo(); + await party[0].updateInfo(); party[1].level = 100; const result = getLowestLevelPlayerPokemon(true); diff --git a/src/test/sprites/pokemonSprite.test.ts b/src/test/sprites/pokemonSprite.test.ts index c29f88d3143..2bfdbe9ce39 100644 --- a/src/test/sprites/pokemonSprite.test.ts +++ b/src/test/sprites/pokemonSprite.test.ts @@ -147,7 +147,7 @@ describe("check if every variant's sprite are correctly set", () => { if (errors.length) { console.log("errors", errors); } - expect(errors.length).toBe(0); + expect(errors).toEqual([]); }); it("check female variant files", () => { @@ -156,7 +156,7 @@ describe("check if every variant's sprite are correctly set", () => { if (errors.length) { console.log("errors", errors); } - expect(errors.length).toBe(0); + expect(errors).toEqual([]); }); it("check back female variant files", () => { @@ -165,7 +165,7 @@ describe("check if every variant's sprite are correctly set", () => { if (errors.length) { console.log("errors", errors); } - expect(errors.length).toBe(0); + expect(errors).toEqual([]); }); it("check back male back variant files", () => { @@ -176,25 +176,36 @@ describe("check if every variant's sprite are correctly set", () => { if (errors.length) { console.log("errors", errors); } - expect(errors.length).toBe(0); + expect(errors).toEqual([]); }); - it("check exp back variant files", () => { - const dirPath = `${rootDir}exp${path.sep}back${path.sep}`; - const errors = getMissingFiles(expVariant.back, dirPath); + it("check exp back female variant files", () => { + const dirPath = `${rootDir}exp${path.sep}back${path.sep}female${path.sep}`; + const errors = getMissingFiles(expVariant.back.female, dirPath); if (errors.length) { console.log("errors", errors); } expect(errors.length).toBe(0); }); + it("check exp back male variant files", () => { + const dirPath = `${rootDir}exp${path.sep}back${path.sep}`; + const backMaleVariant = deepCopy(expVariant.back); + delete backMaleVariant.female; + const errors = getMissingFiles(backMaleVariant, dirPath); + if (errors.length) { + console.log("errors", errors); + } + expect(errors).toEqual([]); + }); + it("check exp female variant files", () => { const dirPath = `${rootDir}exp${path.sep}female${path.sep}`; const errors = getMissingFiles(expVariant.female, dirPath); if (errors.length) { console.log("errors", errors); } - expect(errors.length).toBe(0); + expect(errors).toEqual([]); }); it("check exp male variant files", () => { @@ -206,7 +217,7 @@ describe("check if every variant's sprite are correctly set", () => { if (errors.length) { console.log("errors", errors); } - expect(errors.length).toBe(0); + expect(errors).toEqual([]); }); // check over every file if it's correctly set in the masterlist @@ -217,7 +228,7 @@ describe("check if every variant's sprite are correctly set", () => { if (errors.length) { console.log("errors for ", dirPath, errors); } - expect(errors.length).toBe(0); + expect(errors).toEqual([]); }); it("look over every file in variant back female and check if present in masterlist", () => { @@ -226,7 +237,7 @@ describe("check if every variant's sprite are correctly set", () => { if (errors.length) { console.log("errors for ", dirPath, errors); } - expect(errors.length).toBe(0); + expect(errors).toEqual([]); }); it("look over every file in variant back male and check if present in masterlist", () => { @@ -236,15 +247,24 @@ describe("check if every variant's sprite are correctly set", () => { if (errors.length) { console.log("errors for ", dirPath, errors); } - expect(errors.length).toBe(0); + expect(errors).toEqual([]); }); - it("look over every file in variant exp back and check if present in masterlist", () => { - const dirPath = `${rootDir}exp${path.sep}back${path.sep}`; + it("look over every file in variant exp back female and check if present in masterlist", () => { + const dirPath = `${rootDir}exp${path.sep}back${path.sep}female${path.sep}`; const errors = getMissingMasterlist(expVariant.back, dirPath); if (errors.length) { console.log("errors for ", dirPath, errors); } + expect(errors).toEqual([]); + }); + + it("look over every file in variant exp back male and check if present in masterlist", () => { + const dirPath = `${rootDir}exp${path.sep}back${path.sep}`; + const errors = getMissingMasterlist(expVariant.back, dirPath, [ "female" ]); + if (errors.length) { + console.log("errors for ", dirPath, errors); + } expect(errors.length).toBe(0); }); @@ -254,7 +274,7 @@ describe("check if every variant's sprite are correctly set", () => { if (errors.length) { console.log("errors for ", dirPath, errors); } - expect(errors.length).toBe(0); + expect(errors).toEqual([]); }); it("look over every file in variant exp male and check if present in masterlist", () => { @@ -263,7 +283,7 @@ describe("check if every variant's sprite are correctly set", () => { if (errors.length) { console.log("errors for ", dirPath, errors); } - expect(errors.length).toBe(0); + expect(errors).toEqual([]); }); it("look over every file in variant root and check if present in masterlist", () => { @@ -272,6 +292,6 @@ describe("check if every variant's sprite are correctly set", () => { if (errors.length) { console.log("errors for ", dirPath, errors); } - expect(errors.length).toBe(0); + expect(errors).toEqual([]); }); }); diff --git a/src/test/ui/transfer-item.test.ts b/src/test/ui/transfer-item.test.ts index 762db7fc7ce..b08b056f60e 100644 --- a/src/test/ui/transfer-item.test.ts +++ b/src/test/ui/transfer-item.test.ts @@ -2,8 +2,6 @@ import { BerryType } from "#app/enums/berry-type"; import { Button } from "#app/enums/buttons"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; -import { BattleEndPhase } from "#app/phases/battle-end-phase"; -import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import PartyUiHandler, { PartyUiMode } from "#app/ui/party-ui-handler"; import { Mode } from "#app/ui/ui"; @@ -12,7 +10,6 @@ import Phaser from "phaser"; import type BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - describe("UI - Transfer Items", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -41,7 +38,7 @@ describe("UI - Transfer Items", () => { game.override.enemySpecies(Species.MAGIKARP); game.override.enemyMoveset([ Moves.SPLASH ]); - await game.startBattle([ Species.RAYQUAZA, Species.RAYQUAZA, Species.RAYQUAZA ]); + await game.classicMode.startBattle([ Species.RAYQUAZA, Species.RAYQUAZA, Species.RAYQUAZA ]); game.move.select(Moves.DRAGON_CLAW); @@ -52,10 +49,10 @@ describe("UI - Transfer Items", () => { handler.setCursor(1); handler.processInput(Button.ACTION); - game.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.MODIFIER_TRANSFER); + void game.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.MODIFIER_TRANSFER); }); - await game.phaseInterceptor.to(BattleEndPhase); + await game.phaseInterceptor.to("BattleEndPhase"); }); it("check red tint for held item limit in transfer menu", async () => { @@ -72,7 +69,7 @@ describe("UI - Transfer Items", () => { game.phaseInterceptor.unlock(); }); - await game.phaseInterceptor.to(SelectModifierPhase); + await game.phaseInterceptor.to("SelectModifierPhase"); }, 20000); it("check transfer option for pokemon to transfer to", async () => { @@ -91,6 +88,6 @@ describe("UI - Transfer Items", () => { game.phaseInterceptor.unlock(); }); - await game.phaseInterceptor.to(SelectModifierPhase); + await game.phaseInterceptor.to("SelectModifierPhase"); }, 20000); }); diff --git a/src/timed-event-manager.ts b/src/timed-event-manager.ts index 7a9f0e59993..bebacf87ebc 100644 --- a/src/timed-event-manager.ts +++ b/src/timed-event-manager.ts @@ -27,6 +27,7 @@ interface EventBanner { interface EventEncounter { species: Species; blockEvolution?: boolean; + formIndex?: number; } interface EventMysteryEncounterTier { @@ -49,6 +50,7 @@ interface TimedEvent extends EventBanner { weather?: WeatherPoolEntry[]; mysteryEncounterTierChanges?: EventMysteryEncounterTier[]; luckBoostedSpecies?: Species[]; + boostFusions?: boolean; //MODIFIER REWORK PLEASE } const timedEvents: TimedEvent[] = [ @@ -144,6 +146,40 @@ const timedEvents: TimedEvent[] = [ Species.ROARING_MOON, Species.BLOODMOON_URSALUNA ] + }, + { + name: "Valentine", + eventType: EventType.SHINY, + startDate: new Date(Date.UTC(2025, 1, 10)), + endDate: new Date(Date.UTC(2025, 1, 21)), + boostFusions: true, + shinyMultiplier: 2, + bannerKey: "valentines2025event-", + scale: 0.21, + availableLangs: [ "en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN" ], + eventEncounters: [ + { species: Species.NIDORAN_F }, + { species: Species.NIDORAN_M }, + { species: Species.IGGLYBUFF }, + { species: Species.SMOOCHUM }, + { species: Species.VOLBEAT }, + { species: Species.ILLUMISE }, + { species: Species.ROSELIA }, + { species: Species.LUVDISC }, + { species: Species.WOOBAT }, + { species: Species.FRILLISH }, + { species: Species.ALOMOMOLA }, + { species: Species.FURFROU, formIndex: 1 }, // Heart trim + { species: Species.ESPURR }, + { species: Species.SPRITZEE }, + { species: Species.SWIRLIX }, + { species: Species.APPLIN }, + { species: Species.MILCERY }, + { species: Species.INDEEDEE }, + { species: Species.TANDEMAUS }, + { species: Species.ENAMORUS } + ], + luckBoostedSpecies: [ Species.LUVDISC ] } ]; @@ -297,6 +333,10 @@ export class TimedEventManager { }); return ret; } + + areFusionsBoosted(): boolean { + return timedEvents.some((te) => this.isActive(te) && te.boostFusions); + } } export class TimedEventDisplay extends Phaser.GameObjects.Container { diff --git a/src/tutorial.ts b/src/tutorial.ts index b5f688c11fb..6890075a642 100644 --- a/src/tutorial.ts +++ b/src/tutorial.ts @@ -10,6 +10,7 @@ export enum Tutorial { Access_Menu = "ACCESS_MENU", Menu = "MENU", Starter_Select = "STARTER_SELECT", + Pokedex = "POKEDEX", Pokerus = "POKERUS", Stat_Change = "STAT_CHANGE", Select_Item = "SELECT_ITEM", diff --git a/src/ui-inputs.ts b/src/ui-inputs.ts index 25ad9d87701..e6a0ed7a69c 100644 --- a/src/ui-inputs.ts +++ b/src/ui-inputs.ts @@ -12,6 +12,8 @@ import { globalScene } from "#app/global-scene"; import SettingsDisplayUiHandler from "./ui/settings/settings-display-ui-handler"; import SettingsAudioUiHandler from "./ui/settings/settings-audio-ui-handler"; import RunInfoUiHandler from "./ui/run-info-ui-handler"; +import PokedexUiHandler from "./ui/pokedex-ui-handler"; +import PokedexPageUiHandler from "./ui/pokedex-page-ui-handler"; type ActionKeys = Record void>; @@ -140,7 +142,7 @@ export class UiInputs { } buttonGoToFilter(button: Button): void { - const whitelist = [ StarterSelectUiHandler ]; + const whitelist = [ StarterSelectUiHandler, PokedexUiHandler, PokedexPageUiHandler ]; const uiHandler = globalScene.ui?.getHandler(); if (whitelist.some(handler => uiHandler instanceof handler)) { globalScene.ui.processInput(button); @@ -178,6 +180,7 @@ export class UiInputs { globalScene.ui.setOverlayMode(Mode.MENU); break; case Mode.STARTER_SELECT: + case Mode.POKEDEX_PAGE: this.buttonTouch(); break; case Mode.MENU: @@ -190,7 +193,7 @@ export class UiInputs { } buttonCycleOption(button: Button): void { - const whitelist = [ StarterSelectUiHandler, SettingsUiHandler, RunInfoUiHandler, SettingsDisplayUiHandler, SettingsAudioUiHandler, SettingsGamepadUiHandler, SettingsKeyboardUiHandler ]; + const whitelist = [ StarterSelectUiHandler, PokedexUiHandler, PokedexPageUiHandler, SettingsUiHandler, RunInfoUiHandler, SettingsDisplayUiHandler, SettingsAudioUiHandler, SettingsGamepadUiHandler, SettingsKeyboardUiHandler ]; const uiHandler = globalScene.ui?.getHandler(); if (whitelist.some(handler => uiHandler instanceof handler)) { globalScene.ui.processInput(button); diff --git a/src/ui/abstact-option-select-ui-handler.ts b/src/ui/abstact-option-select-ui-handler.ts index fb5ce9bc5aa..10dbedd7b2f 100644 --- a/src/ui/abstact-option-select-ui-handler.ts +++ b/src/ui/abstact-option-select-ui-handler.ts @@ -1,11 +1,12 @@ import { globalScene } from "#app/global-scene"; -import { TextStyle, addTextObject, getTextStyleOptions } from "./text"; +import { TextStyle, addBBCodeTextObject, getTextColor, getTextStyleOptions } from "./text"; import { Mode } from "./ui"; import UiHandler from "./ui-handler"; import { addWindow } from "./ui-theme"; import * as Utils from "../utils"; import { argbFromRgba } from "@material/material-color-utilities"; import { Button } from "#enums/buttons"; +import BBCodeText from "phaser3-rex-plugins/plugins/gameobjects/tagtext/bbcodetext/BBCodeText"; export interface OptionSelectConfig { xOffset?: number; @@ -21,8 +22,10 @@ export interface OptionSelectItem { label: string; handler: () => boolean; onHover?: () => void; + skip?: boolean; keepOpen?: boolean; overrideSound?: boolean; + style?: TextStyle; item?: string; itemArgs?: any[]; } @@ -33,7 +36,7 @@ const scrollDownLabel = "↓"; export default abstract class AbstractOptionSelectUiHandler extends UiHandler { protected optionSelectContainer: Phaser.GameObjects.Container; protected optionSelectBg: Phaser.GameObjects.NineSlice; - protected optionSelectText: Phaser.GameObjects.Text; + protected optionSelectText: BBCodeText; protected optionSelectIcons: Phaser.GameObjects.Sprite[]; protected config: OptionSelectConfig | null; @@ -41,11 +44,17 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { protected blockInput: boolean; protected scrollCursor: number = 0; + protected fullCursor: number = 0; protected scale: number = 0.1666666667; private cursorObj: Phaser.GameObjects.Image | null; + protected unskippedIndices: number[] = []; + + protected defaultTextStyle: TextStyle = TextStyle.WINDOW; + + constructor(mode: Mode | null) { super(mode); } @@ -79,44 +88,54 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { protected setupOptions() { const configOptions = this.config?.options ?? []; - let options: OptionSelectItem[]; + const options: OptionSelectItem[] = configOptions; - // for performance reasons, this limits how many options we can see at once. Without this, it would try to make text options for every single options - // which makes the performance take a hit. If there's not enough options to do this (set to 10 at the moment) and the ui mode !== Mode.AUTO_COMPLETE, - // this is ignored and the original code is untouched, with the options array being all the options from the config - if (configOptions.length >= 10 && globalScene.ui.getMode() === Mode.AUTO_COMPLETE) { - const optionsScrollTotal = configOptions.length; - const optionStartIndex = this.scrollCursor; - const optionEndIndex = Math.min(optionsScrollTotal, optionStartIndex + (!optionStartIndex || this.scrollCursor + (this.config?.maxOptions! - 1) >= optionsScrollTotal ? this.config?.maxOptions! - 1 : this.config?.maxOptions! - 2)); - options = configOptions.slice(optionStartIndex, optionEndIndex + 2); - } else { - options = configOptions; - } + this.unskippedIndices = this.getUnskippedIndices(configOptions); if (this.optionSelectText) { - this.optionSelectText.destroy(); + if (this.optionSelectText instanceof BBCodeText) { + try { + this.optionSelectText.destroy(); + } catch (error) { + console.error("Error while destroying optionSelectText:", error); + } + } else { + console.warn("optionSelectText is not an instance of BBCodeText."); + } } + if (this.optionSelectIcons?.length) { this.optionSelectIcons.map(i => i.destroy()); this.optionSelectIcons.splice(0, this.optionSelectIcons.length); } - this.optionSelectText = addTextObject(0, 0, options.map(o => o.item ? ` ${o.label}` : o.label).join("\n"), TextStyle.WINDOW, { maxLines: options.length }); - this.optionSelectText.setLineSpacing(this.scale * 72); + const optionsWithScroll = (this.config?.options && this.config?.options.length > (this.config?.maxOptions!)) ? this.getOptionsWithScroll() : options; + + // Setting the initial text to establish the width of the select object. We consider all options, even ones that are not displayed, + // Except in the case of autocomplete, where we don't want to set up a text element with potentially hundreds of lines. + const optionsForWidth = globalScene.ui.getMode() === Mode.AUTO_COMPLETE ? optionsWithScroll : options; + this.optionSelectText = addBBCodeTextObject( + 0, 0, optionsForWidth.map(o => o.item + ? `[shadow=${getTextColor(o.style ?? this.defaultTextStyle, true, globalScene.uiTheme)}][color=${getTextColor(o.style ?? TextStyle.WINDOW, false, globalScene.uiTheme)}] ${o.label}[/color][/shadow]` + : `[shadow=${getTextColor(o.style ?? this.defaultTextStyle, true, globalScene.uiTheme)}][color=${getTextColor(o.style ?? TextStyle.WINDOW, false, globalScene.uiTheme)}]${o.label}[/color][/shadow]` + ).join("\n"), + TextStyle.WINDOW, { maxLines: options.length, lineSpacing: 12 } + ); + this.optionSelectText.setOrigin(0, 0); this.optionSelectText.setName("text-option-select"); - this.optionSelectText.setLineSpacing(12); this.optionSelectContainer.add(this.optionSelectText); this.optionSelectContainer.setPosition((globalScene.game.canvas.width / 6) - 1 - (this.config?.xOffset || 0), -48 + (this.config?.yOffset || 0)); - this.optionSelectBg.width = Math.max(this.optionSelectText.displayWidth + 24, this.getWindowWidth()); - - if (this.config?.options && this.config?.options.length > (this.config?.maxOptions!)) { // TODO: is this bang correct? - this.optionSelectText.setText(this.getOptionsWithScroll().map(o => o.label).join("\n")); - } - this.optionSelectBg.height = this.getWindowHeight(); + this.optionSelectText.setPosition(this.optionSelectBg.x - this.optionSelectBg.width + 12 + 24 * this.scale, this.optionSelectBg.y - this.optionSelectBg.height + 2 + 42 * this.scale); - this.optionSelectText.setPositionRelative(this.optionSelectBg, 12 + 24 * this.scale, 2 + 42 * this.scale); + // Now that the container and background widths are established, we can set up the proper text restricted to visible options + this.optionSelectText.setText(optionsWithScroll.map(o => o.item + ? `[shadow=${getTextColor(o.style ?? this.defaultTextStyle, true, globalScene.uiTheme)}][color=${getTextColor(o.style ?? TextStyle.WINDOW, false, globalScene.uiTheme)}] ${o.label}[/color][/shadow]` + : `[shadow=${getTextColor(o.style ?? this.defaultTextStyle, true, globalScene.uiTheme)}][color=${getTextColor(o.style ?? TextStyle.WINDOW, false, globalScene.uiTheme)}]${o.label}[/color][/shadow]` + ).join("\n") + + ); options.forEach((option: OptionSelectItem, i: number) => { if (option.item) { @@ -160,6 +179,7 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { this.optionSelectContainer.setVisible(true); this.scrollCursor = 0; + this.fullCursor = 0; this.setCursor(0); if (this.config.delay) { @@ -169,6 +189,11 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { globalScene.time.delayedCall(Utils.fixedInt(this.config.delay), () => this.unblockInput()); } + if (this.config?.supportHover) { + // handle hover code if the element supports hover-handlers and the option has the optional hover-handler set. + this.config?.options[this.unskippedIndices[this.fullCursor]]?.onHover?.(); + } + return true; } @@ -177,8 +202,6 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { let success = false; - const options = this.getOptionsWithScroll(); - let playSound = true; if (button === Button.ACTION || button === Button.CANCEL) { @@ -190,15 +213,14 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { success = true; if (button === Button.CANCEL) { if (this.config?.maxOptions && this.config.options.length > this.config.maxOptions) { - this.scrollCursor = (this.config.options.length - this.config.maxOptions) + 1; - this.cursor = options.length - 1; + this.setCursor(this.unskippedIndices.length - 1); } else if (!this.config?.noCancel) { - this.setCursor(options.length - 1); + this.setCursor(this.unskippedIndices.length - 1); } else { return false; } } - const option = this.config?.options[this.cursor + (this.scrollCursor - (this.scrollCursor ? 1 : 0))]; + const option = this.config?.options[this.unskippedIndices[this.fullCursor]]; if (option?.handler()) { if (!option.keepOpen) { this.clear(); @@ -211,7 +233,7 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { // this is here to differentiate between a Button.SUBMIT vs Button.ACTION within the autocomplete handler // this is here because Button.ACTION is picked up as z on the keyboard, meaning if you're typing and hit z, it'll select the option you've chosen success = true; - const option = this.config?.options[this.cursor + (this.scrollCursor - (this.scrollCursor ? 1 : 0))]; + const option = this.config?.options[this.unskippedIndices[this.fullCursor]]; if (option?.handler()) { if (!option.keepOpen) { this.clear(); @@ -223,15 +245,15 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { } else { switch (button) { case Button.UP: - if (this.cursor) { - success = this.setCursor(this.cursor - 1); - } else if (this.cursor === 0) { - success = this.setCursor(options.length - 1); + if (this.fullCursor === 0) { + success = this.setCursor(this.unskippedIndices.length - 1); + } else if (this.fullCursor) { + success = this.setCursor(this.fullCursor - 1); } break; case Button.DOWN: - if (this.cursor < options.length - 1) { - success = this.setCursor(this.cursor + 1); + if (this.fullCursor < this.unskippedIndices.length - 1) { + success = this.setCursor(this.fullCursor + 1); } else { success = this.setCursor(0); } @@ -239,7 +261,7 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { } if (this.config?.supportHover) { // handle hover code if the element supports hover-handlers and the option has the optional hover-handler set. - this.config?.options[this.cursor + (this.scrollCursor - (this.scrollCursor ? 1 : 0))]?.onHover?.(); + this.config?.options[this.unskippedIndices[this.fullCursor]]?.onHover?.(); } } @@ -273,7 +295,9 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { const optionsScrollTotal = options.length; const optionStartIndex = this.scrollCursor; - const optionEndIndex = Math.min(optionsScrollTotal, optionStartIndex + (!optionStartIndex || this.scrollCursor + (this.config.maxOptions - 1) >= optionsScrollTotal ? this.config.maxOptions - 1 : this.config.maxOptions - 2)); + const optionEndIndex = Math.min(optionsScrollTotal, optionStartIndex + + (!optionStartIndex || this.scrollCursor + (this.config.maxOptions - 1) >= optionsScrollTotal ? this.config.maxOptions - 1 : this.config.maxOptions - 2) + ); if (this.config?.maxOptions && options.length > this.config.maxOptions) { options.splice(optionEndIndex, optionsScrollTotal); @@ -281,13 +305,15 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { if (optionStartIndex) { options.unshift({ label: scrollUpLabel, - handler: () => true + handler: () => true, + style: this.defaultTextStyle }); } if (optionEndIndex < optionsScrollTotal) { options.push({ label: scrollDownLabel, - handler: () => true + handler: () => true, + style: this.defaultTextStyle }); } } @@ -295,42 +321,64 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { return options; } - setCursor(cursor: number): boolean { - const changed = this.cursor !== cursor; + getUnskippedIndices(options: OptionSelectItem[]) { + const unskippedIndices = options + .map((option, index) => (option.skip ? null : index)) // Map to index or null if skipped + .filter(index => index !== null) as number[]; + return unskippedIndices; + } + + setCursor(fullCursor: number): boolean { + const changed = this.fullCursor !== fullCursor; - let isScroll = false; - const options = this.getOptionsWithScroll(); if (changed && this.config?.maxOptions && this.config.options.length > this.config.maxOptions) { - if (Math.abs(cursor - this.cursor) === options.length - 1) { - // Wrap around the list - const optionsScrollTotal = this.config.options.length; - this.scrollCursor = cursor ? optionsScrollTotal - (this.config.maxOptions - 1) : 0; - this.setupOptions(); + + // If the fullCursor is the last possible value, we go to the bottom + if (fullCursor === this.unskippedIndices.length - 1) { + this.fullCursor = fullCursor; + this.cursor = this.config.maxOptions - (this.config.options.length - this.unskippedIndices[fullCursor]); + this.scrollCursor = this.config.options.length - this.config.maxOptions + 1; + // If the fullCursor is the first possible value, we go to the top + } else if (fullCursor === 0) { + this.fullCursor = fullCursor; + this.cursor = this.unskippedIndices[fullCursor]; + this.scrollCursor = 0; } else { - // Move the cursor up or down by 1 - const isDown = cursor && cursor > this.cursor; + const isDown = fullCursor && fullCursor > this.fullCursor; + if (isDown) { - if (options[cursor].label === scrollDownLabel) { - isScroll = true; - this.scrollCursor++; + // If there are skipped options under the next selection, we show them + const jumpFromCurrent = this.unskippedIndices[fullCursor] - this.unskippedIndices[this.fullCursor]; + const skipsFromNext = this.unskippedIndices[fullCursor + 1] - this.unskippedIndices[fullCursor] - 1; + + if (this.cursor + jumpFromCurrent + skipsFromNext >= this.config.maxOptions - 1) { + this.fullCursor = fullCursor; + this.cursor = this.config.maxOptions - 2 - skipsFromNext; + this.scrollCursor = this.unskippedIndices[this.fullCursor] - this.cursor + 1; + } else { + this.fullCursor = fullCursor; + this.cursor = this.unskippedIndices[fullCursor] - this.scrollCursor + (this.scrollCursor ? 1 : 0); } } else { - if (!cursor && this.scrollCursor) { - isScroll = true; - this.scrollCursor--; + const jumpFromPrevious = this.unskippedIndices[fullCursor] - this.unskippedIndices[fullCursor - 1]; + + if (this.cursor - jumpFromPrevious < 1) { + this.fullCursor = fullCursor; + this.cursor = 1; + this.scrollCursor = this.unskippedIndices[this.fullCursor] - this.cursor + 1; + } else { + this.fullCursor = fullCursor; + this.cursor = this.unskippedIndices[fullCursor] - this.scrollCursor + (this.scrollCursor ? 1 : 0); } } - if (isScroll && this.scrollCursor === 1) { - this.scrollCursor += isDown ? 1 : -1; - } } - } - if (isScroll) { - this.setupOptions(); } else { - this.cursor = cursor; + this.fullCursor = fullCursor; + this.cursor = this.unskippedIndices[fullCursor]; } + this.setupOptions(); + if (!this.cursorObj) { this.cursorObj = globalScene.add.image(0, 0, "cursor"); this.optionSelectContainer.add(this.cursorObj); @@ -346,6 +394,7 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { super.clear(); this.config = null; this.optionSelectContainer.setVisible(false); + this.fullCursor = 0; this.scrollCursor = 0; this.eraseCursor(); } diff --git a/src/ui/base-stats-overlay.ts b/src/ui/base-stats-overlay.ts new file mode 100644 index 00000000000..f2e94fa24a4 --- /dev/null +++ b/src/ui/base-stats-overlay.ts @@ -0,0 +1,121 @@ +import type { InfoToggle } from "../battle-scene"; +import { TextStyle, addTextObject } from "./text"; +import { addWindow } from "./ui-theme"; +import * as Utils from "../utils"; +import i18next from "i18next"; +import { globalScene } from "#app/global-scene"; + +interface BaseStatsOverlaySettings { + scale?:number; // scale the box? A scale of 0.5 is recommended + x?: number; + y?: number; + /** Default is always half the screen, regardless of scale */ + width?: number; +} + +const HEIGHT = 120; +const BORDER = 8; +const GLOBAL_SCALE = 6; +const shortStats = [ "HP", "ATK", "DEF", "SPATK", "SPDEF", "SPD" ]; + +export class BaseStatsOverlay extends Phaser.GameObjects.Container implements InfoToggle { + + public active: boolean = false; + + private statsLabels: Phaser.GameObjects.Text[] = []; + private statsRectangles: Phaser.GameObjects.Rectangle[] = []; + private statsShadows: Phaser.GameObjects.Rectangle[] = []; + private statsTotalLabel: Phaser.GameObjects.Text; + + private statsBg: Phaser.GameObjects.NineSlice; + + public scale: number; + public width: number; + + constructor(options?: BaseStatsOverlaySettings) { + super(globalScene, options?.x, options?.y); + this.scale = options?.scale || 1; // set up the scale + this.setScale(this.scale); + + // prepare the description box + this.width = (options?.width || BaseStatsOverlay.getWidth(this.scale)) / this.scale; // divide by scale as we always want this to be half a window wide + this.statsBg = addWindow(0, 0, this.width, HEIGHT); + this.statsBg.setOrigin(0, 0); + this.add(this.statsBg); + + for (let i = 0; i < 6; i++) { + const shadow = globalScene.add.rectangle(this.width - BORDER + 1, BORDER + 3 + i * 15, 100, 5, 0x006860); + shadow.setOrigin(1, 0); + this.statsShadows.push(shadow); + this.add(shadow); + + const rectangle = globalScene.add.rectangle(this.width - BORDER, BORDER + 2 + i * 15, 100, 5, 0x66aa99); + rectangle.setOrigin(1, 0); + this.statsRectangles.push(rectangle); + this.add(rectangle); + + const label = addTextObject(BORDER, BORDER - 2 + i * 15, "A", TextStyle.BATTLE_INFO); + this.statsLabels.push(label); + this.add(label); + } + + this.statsTotalLabel = addTextObject(BORDER, BORDER + 6 * 15, "A", TextStyle.MONEY_WINDOW); + this.add(this.statsTotalLabel); + + // hide this component for now + this.setVisible(false); + } + + // show this component with infos for the specific move + show(values: number[], total: number):boolean { + + for (let i = 0; i < 6; i++) { + this.statsLabels[i].setText(i18next.t(`pokemonInfo:Stat.${shortStats[i]}shortened`) + ": " + `${values[i]}`); + // This accounts for base stats up to 200, might not be enough. + // TODO: change color based on value. + this.statsShadows[i].setSize(values[i] / 2, 5); + this.statsRectangles[i].setSize(values[i] / 2, 5); + } + + this.statsTotalLabel.setText(i18next.t("pokedexUiHandler:baseTotal") + ": " + `${total}`); + + + this.setVisible(true); + this.active = true; + return true; + } + + clear() { + this.setVisible(false); + this.active = false; + } + + toggleInfo(visible: boolean): void { + if (visible) { + this.setVisible(true); + } + globalScene.tweens.add({ + targets: this.statsLabels, + duration: Utils.fixedInt(125), + ease: "Sine.easeInOut", + alpha: visible ? 1 : 0 + }); + if (!visible) { + this.setVisible(false); + } + } + + isActive(): boolean { + return this.active; + } + + // width of this element + static getWidth(scale:number):number { + return globalScene.game.canvas.width / GLOBAL_SCALE / 2; + } + + // height of this element + static getHeight(scale:number, onSide?: boolean):number { + return HEIGHT * scale; + } +} diff --git a/src/ui/battle-message-ui-handler.ts b/src/ui/battle-message-ui-handler.ts index 93de69240c3..c87ac18c65d 100644 --- a/src/ui/battle-message-ui-handler.ts +++ b/src/ui/battle-message-ui-handler.ts @@ -6,7 +6,6 @@ import { addWindow } from "./ui-theme"; import type BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; import { Button } from "#enums/buttons"; import i18next from "i18next"; -import type { Stat } from "#app/enums/stat"; import { PERMANENT_STATS, getStatKey } from "#app/enums/stat"; export default class BattleMessageUiHandler extends MessageUiHandler { @@ -191,13 +190,12 @@ export default class BattleMessageUiHandler extends MessageUiHandler { }); } - promptIvs(pokemonId: number, ivs: number[], shownIvsCount: number): Promise { + promptIvs(pokemonId: number, ivs: number[]): Promise { return new Promise(resolve => { globalScene.executeWithSeedOffset(() => { let levelUpStatsValuesText = ""; - const shownStats = this.getTopIvs(ivs, shownIvsCount); for (const s of PERMANENT_STATS) { - levelUpStatsValuesText += `${shownStats.includes(s) ? this.getIvDescriptor(ivs[s], s, pokemonId) : "???"}\n`; + levelUpStatsValuesText += `${this.getIvDescriptor(ivs[s], s, pokemonId)}\n`; } this.levelUpStatsValuesContent.text = levelUpStatsValuesText; this.levelUpStatsIncrContent.setVisible(false); @@ -211,21 +209,6 @@ export default class BattleMessageUiHandler extends MessageUiHandler { }); } - getTopIvs(ivs: number[], shownIvsCount: number): Stat[] { - let shownStats: Stat[] = []; - if (shownIvsCount < 6) { - const statsPool = PERMANENT_STATS.slice(); - // Sort the stats from highest to lowest iv - statsPool.sort((s1, s2) => ivs[s2] - ivs[s1]); - for (let i = 0; i < shownIvsCount; i++) { - shownStats.push(statsPool[i]); - } - } else { - shownStats = PERMANENT_STATS.slice(); - } - return shownStats; - } - getIvDescriptor(value: number, typeIv: number, pokemonId: number): string { const starterSpecies = globalScene.getPokemonById(pokemonId)!.species.getRootSpeciesId(); // we are using getRootSpeciesId() here because we want to check against the baby form, not the mid form if it exists const starterIvs: number[] = globalScene.gameData.dexData[starterSpecies].ivs; diff --git a/src/ui/dropdown.ts b/src/ui/dropdown.ts index 67599b843d8..718058c7f99 100644 --- a/src/ui/dropdown.ts +++ b/src/ui/dropdown.ts @@ -1,6 +1,7 @@ import { globalScene } from "#app/global-scene"; import { addTextObject, TextStyle } from "./text"; import { addWindow, WindowVariant } from "./ui-theme"; +import { ScrollBar } from "#app/ui/scroll-bar"; import i18next from "i18next"; export enum DropDownState { @@ -293,21 +294,37 @@ export class DropDown extends Phaser.GameObjects.Container { private onChange: () => void; private lastDir: SortDirection = SortDirection.ASC; private defaultSettings: any[]; + private dropDownScrollBar: ScrollBar; + private totalOptions: number = 0; + private maxOptions: number = 0; + private shownOptions: number = 0; + private tooManyOptions: Boolean = false; + private firstShown: number = 0; + private optionHeight: number = 0; + private optionSpacing: number = 0; + private optionPaddingX: number = 4; + private optionPaddingY: number = 6; + private optionWidth: number = 100; + private cursorOffset: number = 0; constructor(x: number, y: number, options: DropDownOption[], onChange: () => void, type: DropDownType = DropDownType.MULTI, optionSpacing: number = 2) { const windowPadding = 5; - const optionHeight = 7; - const optionPaddingX = 4; - const optionPaddingY = 6; const cursorOffset = 7; - const optionWidth = 100; super(globalScene, x - cursorOffset - windowPadding, y); + + this.optionWidth = 100; + this.optionHeight = 7; + this.optionSpacing = optionSpacing; + this.optionPaddingX = 4; + this.optionPaddingY = 6; + this.cursorOffset = cursorOffset; + this.options = options; this.dropDownType = type; this.onChange = onChange; - this.cursorObj = globalScene.add.image(optionPaddingX + 3, 0, "cursor"); + this.cursorObj = globalScene.add.image(this.optionPaddingX + 3, 0, "cursor"); this.cursorObj.setScale(0.5); this.cursorObj.setOrigin(0, 0.5); this.cursorObj.setVisible(false); @@ -317,31 +334,51 @@ export class DropDown extends Phaser.GameObjects.Container { this.options.unshift(new DropDownOption("ALL", new DropDownLabel(i18next.t("filterBar:all"), undefined, this.checkForAllOn() ? DropDownState.ON : DropDownState.OFF))); } + this.maxOptions = 19; + this.totalOptions = this.options.length; + this.tooManyOptions = this.totalOptions > this.maxOptions; + this.shownOptions = this.tooManyOptions ? this.maxOptions : this.totalOptions; + this.defaultSettings = this.getSettings(); // Place ui elements in the correct spot options.forEach((option, index) => { + const toggleVisibility = type !== DropDownType.SINGLE || option.state === DropDownState.ON; option.setupToggleIcon(type, toggleVisibility); - option.width = optionWidth; - option.y = index * optionHeight + index * optionSpacing + optionPaddingY; + option.width = this.optionWidth; + option.y = index * this.optionHeight + index * optionSpacing + this.optionPaddingY; - const baseX = cursorOffset + optionPaddingX + 3; - const baseY = optionHeight / 2; + const baseX = cursorOffset + this.optionPaddingX + 3; + const baseY = this.optionHeight / 2; option.setLabelPosition(baseX + 8, baseY); if (type === DropDownType.SINGLE) { option.setTogglePosition(baseX + 3, baseY + 1); } else { option.setTogglePosition(baseX, baseY); } + + if (index >= this.shownOptions) { + option.visible = false; + } + + this.firstShown = 0; }); - this.window = addWindow(0, 0, optionWidth, options[options.length - 1].y + optionHeight + optionPaddingY, false, false, undefined, undefined, WindowVariant.XTHIN); + this.window = addWindow(0, 0, this.optionWidth, options[this.shownOptions - 1].y + this.optionHeight + this.optionPaddingY, false, false, undefined, undefined, WindowVariant.XTHIN); this.add(this.window); this.add(options); this.add(this.cursorObj); this.setVisible(false); + + if (this.tooManyOptions) { + // Setting the last parameter to 1 turns out to be optimal in all cases. + this.dropDownScrollBar = new ScrollBar(this.window.width - 3, 5, 5, this.window.height - 10, 1); + this.add(this.dropDownScrollBar); + this.dropDownScrollBar.setTotalRows(this.totalOptions); + this.dropDownScrollBar.setScrollCursor(0); + } } getWidth(): number { @@ -371,6 +408,11 @@ export class DropDown extends Phaser.GameObjects.Container { } setCursor(cursor: number): boolean { + + if (this.tooManyOptions) { + this.setLabels(cursor); + } + this.cursor = cursor; if (cursor < 0) { cursor = 0; @@ -393,6 +435,41 @@ export class DropDown extends Phaser.GameObjects.Container { return true; } + setLabels(cursor: number) { + + if ((cursor === 0) && (this.lastCursor === this.totalOptions - 1)) { + this.firstShown = 0; + } else if ((cursor === this.totalOptions - 1) && (this.lastCursor === 0)) { + this.firstShown = this.totalOptions - this.shownOptions; + } else if ((cursor - this.firstShown >= this.shownOptions) && (cursor > this.lastCursor)) { + this.firstShown += 1; + } else if ((cursor < this.firstShown) && (cursor < this.lastCursor)) { + this.firstShown -= 1; + } + + this.options.forEach((option, index) => { + + option.y = (index - this.firstShown) * (this.optionHeight + this.optionSpacing) + this.optionPaddingY; + + const baseX = this.cursorOffset + this.optionPaddingX + 3; + const baseY = this.optionHeight / 2; + option.setLabelPosition(baseX + 8, baseY); + if (this.dropDownType === DropDownType.SINGLE) { + option.setTogglePosition(baseX + 3, baseY + 1); + } else { + option.setTogglePosition(baseX, baseY); + } + + if ((index < this.firstShown) || ( index >= this.firstShown + this.shownOptions)) { + option.visible = false; + } else { + option.visible = true; + } + }); + + this.dropDownScrollBar.setScrollCursor(cursor); + } + /** * Switch the option at the provided index to its next state and update visuals * Update accordingly the other options if needed: @@ -597,7 +674,12 @@ export class DropDown extends Phaser.GameObjects.Container { x = this.options[i].getCurrentLabelX() ?? 0; } } - this.window.width = maxWidth + x - this.window.x + 6; + this.window.width = maxWidth + x - this.window.x + 9; + + if (this.tooManyOptions) { + this.window.width += 6; + this.dropDownScrollBar.x = this.window.width - 9; + } if (this.x + this.window.width > this.parentContainer.width) { this.x = this.parentContainer.width - this.window.width; diff --git a/src/ui/filter-bar.ts b/src/ui/filter-bar.ts index a6f9f66efe2..1eba81247d4 100644 --- a/src/ui/filter-bar.ts +++ b/src/ui/filter-bar.ts @@ -9,6 +9,7 @@ import { globalScene } from "#app/global-scene"; export enum DropDownColumn { GEN, TYPES, + BIOME, CAUGHT, UNLOCKS, MISC, @@ -25,13 +26,20 @@ export class FilterBar extends Phaser.GameObjects.Container { public openDropDown: boolean = false; private lastCursor: number = -1; private uiTheme: UiTheme; + private leftPaddingX: number; + private rightPaddingX: number; + private cursorOffset: number; - constructor(x: number, y: number, width: number, height: number) { + constructor(x: number, y: number, width: number, height: number, leftPaddingX: number = 6, rightPaddingX: number = 6, cursorOffset: number = 8) { super(globalScene, x, y); this.width = width; this.height = height; + this.leftPaddingX = leftPaddingX; + this.rightPaddingX = rightPaddingX; + this.cursorOffset = cursorOffset; + this.window = addWindow(0, 0, width, height, false, false, undefined, undefined, WindowVariant.THIN); this.add(this.window); @@ -40,8 +48,6 @@ export class FilterBar extends Phaser.GameObjects.Container { this.cursorObj.setVisible(false); this.cursorObj.setOrigin(0, 0); this.add(this.cursorObj); - - this.uiTheme = globalScene.uiTheme; } /** @@ -86,9 +92,9 @@ export class FilterBar extends Phaser.GameObjects.Container { updateFilterLabels(): void { for (let i = 0; i < this.numFilters; i++) { if (this.dropDowns[i].hasDefaultValues()) { - this.labels[i].setColor(getTextColor(TextStyle.TOOLTIP_CONTENT, false, this.uiTheme)); + this.labels[i].setColor(getTextColor(TextStyle.TOOLTIP_CONTENT, false, globalScene.uiTheme)); } else { - this.labels[i].setColor(getTextColor(TextStyle.STATS_LABEL, false, this.uiTheme)); + this.labels[i].setColor(getTextColor(TextStyle.STATS_LABEL, false, globalScene.uiTheme)); } } } @@ -97,23 +103,21 @@ export class FilterBar extends Phaser.GameObjects.Container { * Position the filter dropdowns evenly across the width of the container */ private calcFilterPositions(): void { - const paddingX = 6; - const cursorOffset = 8; - let totalWidth = paddingX * 2 + cursorOffset; + let totalWidth = this.leftPaddingX + this.rightPaddingX + this.cursorOffset; this.labels.forEach(label => { - totalWidth += label.displayWidth + cursorOffset; + totalWidth += label.displayWidth + this.cursorOffset; }); const spacing = (this.width - totalWidth) / (this.labels.length - 1); for (let i = 0; i < this.labels.length; i++) { if (i === 0) { - this.labels[i].x = paddingX + cursorOffset; + this.labels[i].x = this.leftPaddingX + this.cursorOffset; } else { const lastRight = this.labels[i - 1].x + this.labels[i - 1].displayWidth; - this.labels[i].x = lastRight + spacing + cursorOffset; + this.labels[i].x = lastRight + spacing + this.cursorOffset; } - this.dropDowns[i].x = this.labels[i].x - cursorOffset - paddingX; + this.dropDowns[i].x = this.labels[i].x - this.cursorOffset - this.leftPaddingX; this.dropDowns[i].y = this.height; } } @@ -140,8 +144,7 @@ export class FilterBar extends Phaser.GameObjects.Container { } } - const cursorOffset = 8; - this.cursorObj.setPosition(this.labels[cursor].x - cursorOffset + 2, 6); + this.cursorObj.setPosition(this.labels[cursor].x - this.cursorOffset + 2, 6); this.lastCursor = cursor; } diff --git a/src/ui/filter-text.ts b/src/ui/filter-text.ts new file mode 100644 index 00000000000..f69cf113f05 --- /dev/null +++ b/src/ui/filter-text.ts @@ -0,0 +1,218 @@ +import type { StarterContainer } from "./starter-container"; +import { addTextObject, getTextColor, TextStyle } from "./text"; +import type { UiTheme } from "#enums/ui-theme"; +import { addWindow, WindowVariant } from "./ui-theme"; +import i18next from "i18next"; +import type AwaitableUiHandler from "./awaitable-ui-handler"; +import type UI from "./ui"; +import { Mode } from "./ui"; +import { globalScene } from "#app/global-scene"; + +export enum FilterTextRow{ + NAME, + MOVE_1, + MOVE_2, + ABILITY_1, + ABILITY_2, +} + +export class FilterText extends Phaser.GameObjects.Container { + private window: Phaser.GameObjects.NineSlice; + private labels: Phaser.GameObjects.Text[] = []; + private selections: Phaser.GameObjects.Text[] = []; + private selectionStrings: string[] = []; + private rows: FilterTextRow[] = []; + public cursorObj: Phaser.GameObjects.Image; + public numFilters: number = 0; + private lastCursor: number = -1; + private uiTheme: UiTheme; + + private menuMessageBoxContainer: Phaser.GameObjects.Container; + private dialogueMessageBox: Phaser.GameObjects.NineSlice; + message: any; + private readonly textPadding = 8; + private readonly defaultWordWrapWidth = 1224; + + private onChange: () => void; + + public defaultText: string = "---"; + + constructor(x: number, y: number, width: number, height: number, onChange: () => void,) { + super(globalScene, x, y); + + this.onChange = onChange; + + this.width = width; + this.height = height; + + this.window = addWindow(0, 0, width, height, false, false, undefined, undefined, WindowVariant.THIN); + this.add(this.window); + + this.cursorObj = globalScene.add.image(1, 1, "cursor"); + this.cursorObj.setScale(0.5); + this.cursorObj.setVisible(false); + this.cursorObj.setOrigin(0, 0); + this.add(this.cursorObj); + + this.menuMessageBoxContainer = globalScene.add.container(0, 130); + this.menuMessageBoxContainer.setName("menu-message-box"); + this.menuMessageBoxContainer.setVisible(false); + + // Full-width window used for testing dialog messages in debug mode + this.dialogueMessageBox = addWindow(-this.textPadding, 0, globalScene.game.canvas.width / 6 + this.textPadding * 2, 49, false, false, 0, 0, WindowVariant.THIN); + this.dialogueMessageBox.setOrigin(0, 0); + this.menuMessageBoxContainer.add(this.dialogueMessageBox); + + const menuMessageText = addTextObject(this.textPadding, this.textPadding, "", TextStyle.WINDOW, { maxLines: 2 }); + menuMessageText.setName("menu-message"); + menuMessageText.setOrigin(0, 0); + this.menuMessageBoxContainer.add(menuMessageText); + + this.message = menuMessageText; + + } + + /** + * Add a new filter to the FilterBar, as long that a unique DropDownColumn is provided + * @param column the DropDownColumn that will be used to access the filter values + * @param title the string that will get displayed in the filter bar + * @param dropDown the DropDown with all options for this filter + * @returns true if successful, false if the provided column was already in use for another filter + */ + addFilter(row: FilterTextRow, title: string): boolean { + + const paddingX = 6; + const cursorOffset = 8; + const extraSpaceX = 40; + + if (this.rows.includes(row)) { + return false; + } + + this.rows.push(row); + + const filterTypesLabel = addTextObject(paddingX + cursorOffset, 3, title, TextStyle.TOOLTIP_CONTENT); + this.labels.push(filterTypesLabel); + this.add(filterTypesLabel); + + const filterTypesSelection = addTextObject(paddingX + cursorOffset + extraSpaceX, 3, this.defaultText, TextStyle.TOOLTIP_CONTENT); + this.selections.push(filterTypesSelection); + this.add(filterTypesSelection); + + this.selectionStrings.push(""); + + this.calcFilterPositions(); + this.numFilters++; + + return true; + } + + resetSelection(index: number): void { + this.selections[index].setText(this.defaultText); + this.selectionStrings[index] = ""; + this.onChange(); + } + + setValsToDefault(): void { + for (let i = 0; i < this.numFilters; i++) { + this.resetSelection(i); + } + } + + startSearch(index: number, ui: UI): void { + + ui.playSelect(); + const prefilledText = ""; + const buttonAction: any = {}; + buttonAction["buttonActions"] = [ + (sanitizedName: string) => { + ui.playSelect(); + const dialogueTestName = sanitizedName; + //TODO: Is it really necessary to encode and decode? + const dialogueName = decodeURIComponent(escape(atob(dialogueTestName))); + const handler = ui.getHandler() as AwaitableUiHandler; + handler.tutorialActive = true; + // Switch to the dialog test window + this.selections[index].setText( dialogueName === "" ? this.defaultText : String(i18next.t(dialogueName))); + ui.revertMode(); + this.onChange(); + }, + () => { + ui.revertMode(); + this.onChange; + } + ]; + ui.setOverlayMode(Mode.POKEDEX_SCAN, buttonAction, prefilledText, index); + } + + + setCursor(cursor: number): void { + const cursorOffset = 8; + + this.cursorObj.setPosition(cursorOffset, this.labels[cursor].y + 3); + this.lastCursor = cursor; + } + + /** + * Highlight the labels of the FilterBar if the filters are different from their default values + */ + updateFilterLabels(): void { + for (let i = 0; i < this.numFilters; i++) { + if (this.selections[i].text === this.defaultText) { + this.labels[i].setColor(getTextColor(TextStyle.TOOLTIP_CONTENT, false, globalScene.uiTheme)); + } else { + this.labels[i].setColor(getTextColor(TextStyle.STATS_LABEL, false, globalScene.uiTheme)); + } + } + } + + /** + * Position the filter dropdowns evenly across the width of the container + */ + private calcFilterPositions(): void { + const paddingY = 8; + + let totalHeight = paddingY * 2; + this.labels.forEach(label => { + totalHeight += label.displayHeight; + }); + const spacing = (this.height - totalHeight) / (this.labels.length - 1); + for (let i = 0; i < this.labels.length; i++) { + if (i === 0) { + this.labels[i].y = paddingY; + this.selections[i].y = paddingY; + } else { + const lastBottom = this.labels[i - 1].y + this.labels[i - 1].displayHeight; + this.labels[i].y = lastBottom + spacing; + this.selections[i].y = lastBottom + spacing; + } + } + } + + getValue(row: number): string { + return this.selections[row].getWrappedText()[0]; + } + + /** + * Find the nearest filter to the provided container on the y-axis + * @param container the StarterContainer to compare position against + * @returns the index of the closest filter + */ + getNearestFilter(container: StarterContainer): number { + + const midy = container.y + container.icon.displayHeight / 2; + let nearest = 0; + let nearestDist = 1000; + for (let i = 0; i < this.labels.length; i++) { + const dist = Math.abs(midy - (this.labels[i].y + this.labels[i].displayHeight / 3)); + if (dist < nearestDist) { + nearest = i; + nearestDist = dist; + } + } + + return nearest; + } + + +} diff --git a/src/ui/menu-ui-handler.ts b/src/ui/menu-ui-handler.ts index aadb39cdcfe..3965eb38cc4 100644 --- a/src/ui/menu-ui-handler.ts +++ b/src/ui/menu-ui-handler.ts @@ -23,6 +23,7 @@ enum MenuOptions { STATS, EGG_LIST, EGG_GACHA, + POKEDEX, MANAGE_DATA, COMMUNITY, SAVE_AND_QUIT, @@ -522,6 +523,11 @@ export default class MenuUiHandler extends MessageUiHandler { ui.setOverlayMode(Mode.EGG_GACHA); success = true; break; + case MenuOptions.POKEDEX: + ui.revertMode(); + ui.setOverlayMode(Mode.POKEDEX); + success = true; + break; case MenuOptions.MANAGE_DATA: if (!bypassLogin && !this.manageDataConfig.options.some(o => o.label === i18next.t("menuUiHandler:linkDiscord") || o.label === i18next.t("menuUiHandler:unlinkDiscord"))) { this.manageDataConfig.options.splice(this.manageDataConfig.options.length - 1, 0, diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index 3ffd470b6ca..136f098df7e 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -8,7 +8,7 @@ import { Mode } from "#app/ui/ui"; import * as Utils from "#app/utils"; import { PokemonFormChangeItemModifier, PokemonHeldItemModifier, SwitchEffectTransferModifier } from "#app/modifier/modifier"; import { allMoves, ForceSwitchOutAttr } from "#app/data/move"; -import { getGenderColor, getGenderSymbol } from "#app/data/gender"; +import { Gender, getGenderColor, getGenderSymbol } from "#app/data/gender"; import { StatusEffect } from "#enums/status-effect"; import PokemonIconAnimHandler, { PokemonIconAnimMode } from "#app/ui/pokemon-icon-anim-handler"; import { pokemonEvolutions } from "#app/data/balance/pokemon-evolutions"; @@ -109,6 +109,7 @@ export enum PartyOption { TEACH, TRANSFER, SUMMARY, + POKEDEX, UNPAUSE_EVOLUTION, SPLICE, UNSPLICE, @@ -218,7 +219,7 @@ export default class PartyUiHandler extends MessageUiHandler { public static NoEffectMessage = i18next.t("partyUiHandler:anyEffect"); - private localizedOptions = [ PartyOption.SEND_OUT, PartyOption.SUMMARY, PartyOption.CANCEL, PartyOption.APPLY, PartyOption.RELEASE, PartyOption.TEACH, PartyOption.SPLICE, PartyOption.UNSPLICE, PartyOption.REVIVE, PartyOption.TRANSFER, PartyOption.UNPAUSE_EVOLUTION, PartyOption.PASS_BATON, PartyOption.RENAME, PartyOption.SELECT ]; + private localizedOptions = [ PartyOption.SEND_OUT, PartyOption.SUMMARY, PartyOption.POKEDEX, PartyOption.CANCEL, PartyOption.APPLY, PartyOption.RELEASE, PartyOption.TEACH, PartyOption.SPLICE, PartyOption.UNSPLICE, PartyOption.REVIVE, PartyOption.TRANSFER, PartyOption.UNPAUSE_EVOLUTION, PartyOption.PASS_BATON, PartyOption.RENAME, PartyOption.SELECT ]; constructor() { super(Mode.PARTY); @@ -397,7 +398,7 @@ export default class PartyUiHandler extends MessageUiHandler { } ui.playSelect(); return true; - } else if ((option !== PartyOption.SUMMARY && option !== PartyOption.UNPAUSE_EVOLUTION && option !== PartyOption.UNSPLICE && option !== PartyOption.RELEASE && option !== PartyOption.CANCEL && option !== PartyOption.RENAME) + } else if ((![ PartyOption.SUMMARY, PartyOption.POKEDEX, PartyOption.UNPAUSE_EVOLUTION, PartyOption.UNSPLICE, PartyOption.RELEASE, PartyOption.CANCEL, PartyOption.RENAME ].includes(option)) || (option === PartyOption.RELEASE && this.partyUiMode === PartyUiMode.RELEASE)) { let filterResult: string | null; const getTransferrableItemsFromPokemon = (pokemon: PlayerPokemon) => @@ -466,6 +467,16 @@ export default class PartyUiHandler extends MessageUiHandler { ui.playSelect(); ui.setModeWithoutClear(Mode.SUMMARY, pokemon).then(() => this.clearOptions()); return true; + } else if (option === PartyOption.POKEDEX) { + ui.playSelect(); + const attributes = { + shiny: pokemon.shiny, + variant: pokemon.variant, + form: pokemon.formIndex, + female: pokemon.gender === Gender.FEMALE ? true : false + }; + ui.setOverlayMode(Mode.POKEDEX_PAGE, pokemon.species, pokemon.formIndex, attributes).then(() => this.clearOptions()); + return true; } else if (option === PartyOption.UNPAUSE_EVOLUTION) { this.clearOptions(); ui.playSelect(); @@ -892,6 +903,7 @@ export default class PartyUiHandler extends MessageUiHandler { } this.options.push(PartyOption.SUMMARY); + this.options.push(PartyOption.POKEDEX); this.options.push(PartyOption.RENAME); if ((pokemonEvolutions.hasOwnProperty(pokemon.species.speciesId) || (pokemon.isFusion() && pokemon.fusionSpecies && pokemonEvolutions.hasOwnProperty(pokemon.fusionSpecies.speciesId)))) { diff --git a/src/ui/pokedex-info-overlay.ts b/src/ui/pokedex-info-overlay.ts new file mode 100644 index 00000000000..fe0b47b57e0 --- /dev/null +++ b/src/ui/pokedex-info-overlay.ts @@ -0,0 +1,174 @@ +import type { InfoToggle } from "../battle-scene"; +import { TextStyle, addTextObject } from "./text"; +import { addWindow } from "./ui-theme"; +import * as Utils from "../utils"; +import i18next from "i18next"; +import { globalScene } from "#app/global-scene"; + +export interface PokedexInfoOverlaySettings { + delayVisibility?: boolean; // if true, showing the overlay will only set it to active and populate the fields and the handler using this field has to manually call setVisible later. + scale?:number; // scale the box? A scale of 0.5 is recommended + //location and width of the component; unaffected by scaling + x?: number; + y?: number; + /** Default is always half the screen, regardless of scale */ + width?: number; + /** Determines whether to display the small secondary box */ + hideEffectBox?: boolean; + hideBg?: boolean; +} + +const DESC_HEIGHT = 48; +const BORDER = 8; +const GLOBAL_SCALE = 6; + +export default class PokedexInfoOverlay extends Phaser.GameObjects.Container implements InfoToggle { + public active: boolean = false; + + private desc: Phaser.GameObjects.Text; + private descScroll : Phaser.Tweens.Tween | null = null; + + private descBg: Phaser.GameObjects.NineSlice; + + private options: PokedexInfoOverlaySettings; + + private textMaskRect: Phaser.GameObjects.Graphics; + + private maskPointOriginX: number; + private maskPointOriginY: number; + public scale: number; + public width: number; + + constructor(options?: PokedexInfoOverlaySettings) { + super(globalScene, options?.x, options?.y); + this.scale = options?.scale || 1; // set up the scale + this.setScale(this.scale); + this.options = options || {}; + + // prepare the description box + this.width = (options?.width || PokedexInfoOverlay.getWidth(this.scale)) / this.scale; // divide by scale as we always want this to be half a window wide + this.descBg = addWindow(0, 0, this.width, DESC_HEIGHT); + this.descBg.setOrigin(0, 0); + this.add(this.descBg); + + // set up the description; wordWrap uses true pixels, unaffected by any scaling, while other values are affected + this.desc = addTextObject(BORDER, BORDER - 2, "", TextStyle.BATTLE_INFO, { wordWrap: { width: (this.width - (BORDER - 2) * 2) * GLOBAL_SCALE }}); + this.desc.setLineSpacing(i18next.resolvedLanguage === "ja" ? 25 : 5); + + // limit the text rendering, required for scrolling later on + this.maskPointOriginX = options?.x || 0; + this.maskPointOriginY = options?.y || 0; + + if (this.maskPointOriginX < 0) { + this.maskPointOriginX += globalScene.game.canvas.width / GLOBAL_SCALE; + } + if (this.maskPointOriginY < 0) { + this.maskPointOriginY += globalScene.game.canvas.height / GLOBAL_SCALE; + } + + this.textMaskRect = globalScene.make.graphics(); + this.textMaskRect.fillStyle(0xFF0000); + this.textMaskRect.fillRect( + this.maskPointOriginX + BORDER * this.scale, this.maskPointOriginY + (BORDER - 2) * this.scale, + this.width - (BORDER * 2) * this.scale, (DESC_HEIGHT - (BORDER - 2) * 2) * this.scale); + this.textMaskRect.setScale(6); + const textMask = this.createGeometryMask(this.textMaskRect); + + this.add(this.desc); + this.desc.setMask(textMask); + + if (options?.hideBg) { + this.descBg.setVisible(false); + } + + // hide this component for now + this.setVisible(false); + } + + // show this component with infos for the specific move + show(text: string):boolean { + if (!globalScene.enableMoveInfo) { + return false; // move infos have been disabled // TODO:: is `false` correct? i used to be `undeefined` + } + + this.desc.setText(text ?? ""); + + // stop previous scrolling effects and reset y position + if (this.descScroll) { + this.descScroll.remove(); + this.descScroll = null; + this.desc.y = BORDER - 2; + } + + // determine if we need to add new scrolling effects + const lineCount = Math.floor(this.desc.displayHeight * (96 / 72) / 14.83); + + const newHeight = lineCount >= 3 ? 48 : (lineCount === 2 ? 36 : 24); + this.textMaskRect.clear(); + this.textMaskRect.fillStyle(0xFF0000); + this.textMaskRect.fillRect( + this.maskPointOriginX + BORDER * this.scale, + this.maskPointOriginY + (BORDER - 2) * this.scale + (48 - newHeight), + this.width - (BORDER * 2) * this.scale, + (newHeight - (BORDER - 2) * 2) * this.scale + ); + const updatedMask = this.createGeometryMask(this.textMaskRect); + this.desc.setMask(updatedMask); + + this.descBg.setSize(this.descBg.width, newHeight); + this.descBg.setY(48 - newHeight); + this.desc.setY(BORDER - 2 + (48 - newHeight)); + + if (lineCount > 3) { + // generate scrolling effects + this.descScroll = globalScene.tweens.add({ + targets: this.desc, + delay: Utils.fixedInt(2000), + loop: -1, + hold: Utils.fixedInt(2000), + duration: Utils.fixedInt((lineCount - 3) * 2000), + y: `-=${14.83 * (72 / 96) * (lineCount - 3)}` + }); + } + + if (!this.options.delayVisibility) { + this.setVisible(true); + } + this.active = true; + return true; + } + + clear() { + this.setVisible(false); + this.active = false; + } + + toggleInfo(visible: boolean): void { + if (visible) { + this.setVisible(true); + } + globalScene.tweens.add({ + targets: this.desc, + duration: Utils.fixedInt(125), + ease: "Sine.easeInOut", + alpha: visible ? 1 : 0 + }); + if (!visible) { + this.setVisible(false); + } + } + + isActive(): boolean { + return this.active; + } + + // width of this element + static getWidth(scale:number):number { + return globalScene.game.canvas.width / GLOBAL_SCALE / 2; + } + + // height of this element + static getHeight(scale:number, onSide?: boolean):number { + return DESC_HEIGHT * scale; + } +} diff --git a/src/ui/pokedex-mon-container.ts b/src/ui/pokedex-mon-container.ts new file mode 100644 index 00000000000..31a98c30d1c --- /dev/null +++ b/src/ui/pokedex-mon-container.ts @@ -0,0 +1,206 @@ +import type { Variant } from "#app/data/variant"; +import { globalScene } from "#app/global-scene"; +import { isNullOrUndefined } from "#app/utils"; +import type PokemonSpecies from "../data/pokemon-species"; +import { addTextObject, TextStyle } from "./text"; + + +interface SpeciesDetails { + shiny?: boolean, + formIndex?: number + female?: boolean, + variant?: Variant +} + +export class PokedexMonContainer extends Phaser.GameObjects.Container { + public species: PokemonSpecies; + public icon: Phaser.GameObjects.Sprite; + public shinyIcons: Phaser.GameObjects.Image[] = []; + public label: Phaser.GameObjects.Text; + public starterPassiveBgs: Phaser.GameObjects.Image; + public hiddenAbilityIcon: Phaser.GameObjects.Image; + public favoriteIcon: Phaser.GameObjects.Image; + public classicWinIcon: Phaser.GameObjects.Image; + public candyUpgradeIcon: Phaser.GameObjects.Image; + public candyUpgradeOverlayIcon: Phaser.GameObjects.Image; + public eggMove1Icon: Phaser.GameObjects.Image; + public tmMove1Icon: Phaser.GameObjects.Image; + public eggMove2Icon: Phaser.GameObjects.Image; + public tmMove2Icon: Phaser.GameObjects.Image; + public passive1Icon: Phaser.GameObjects.Image; + public passive2Icon: Phaser.GameObjects.Image; + public passive1OverlayIcon: Phaser.GameObjects.Image; + public passive2OverlayIcon: Phaser.GameObjects.Image; + public cost: number = 0; + + constructor(species: PokemonSpecies, options: SpeciesDetails = {}) { + super(globalScene, 0, 0); + + this.species = species; + + const { shiny, formIndex, female, variant } = options; + + const defaultDexAttr = globalScene.gameData.getSpeciesDefaultDexAttr(species, false, true); + const defaultProps = globalScene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); + + if (!isNullOrUndefined(formIndex)) { + defaultProps.formIndex = formIndex; + } + if (!isNullOrUndefined(shiny)) { + defaultProps.shiny = shiny; + } + if (!isNullOrUndefined(variant)) { + defaultProps.variant = variant; + } + if (!isNullOrUndefined(female)) { + defaultProps.female = female; + } + + + // starter passive bg + const starterPassiveBg = globalScene.add.image(2, 5, "passive_bg"); + starterPassiveBg.setOrigin(0, 0); + starterPassiveBg.setScale(0.75); + starterPassiveBg.setVisible(false); + this.add(starterPassiveBg); + this.starterPassiveBgs = starterPassiveBg; + + // icon + this.icon = globalScene.add.sprite(-2, 2, species.getIconAtlasKey(defaultProps.formIndex, defaultProps.shiny, defaultProps.variant)); + this.icon.setScale(0.5); + this.icon.setOrigin(0, 0); + this.icon.setFrame(species.getIconId(defaultProps.female, defaultProps.formIndex, defaultProps.shiny, defaultProps.variant)); + this.checkIconId(defaultProps.female, defaultProps.formIndex, defaultProps.shiny, defaultProps.variant); + this.icon.setTint(0); + this.add(this.icon); + + // shiny icons + for (let i = 0; i < 3; i++) { + const shinyIcon = globalScene.add.image(i * -3 + 12, 2, "shiny_star_small"); + shinyIcon.setScale(0.5); + shinyIcon.setOrigin(0, 0); + shinyIcon.setVisible(false); + this.shinyIcons.push(shinyIcon); + } + this.add(this.shinyIcons); + + // value label + const label = addTextObject(1, 2, "0", TextStyle.WINDOW, { fontSize: "32px" }); + label.setShadowOffset(2, 2); + label.setOrigin(0, 0); + label.setVisible(false); + this.add(label); + this.label = label; + + // hidden ability icon + const abilityIcon = globalScene.add.image(12, 7, "ha_capsule"); + abilityIcon.setOrigin(0, 0); + abilityIcon.setScale(0.5); + abilityIcon.setVisible(false); + this.add(abilityIcon); + this.hiddenAbilityIcon = abilityIcon; + + // favorite icon + const favoriteIcon = globalScene.add.image(0, 7, "favorite"); + favoriteIcon.setOrigin(0, 0); + favoriteIcon.setScale(0.5); + favoriteIcon.setVisible(false); + this.add(favoriteIcon); + this.favoriteIcon = favoriteIcon; + + // classic win icon + const classicWinIcon = globalScene.add.image(0, 12, "champion_ribbon"); + classicWinIcon.setOrigin(0, 0); + classicWinIcon.setScale(0.5); + classicWinIcon.setVisible(false); + this.add(classicWinIcon); + this.classicWinIcon = classicWinIcon; + + // candy upgrade icon + const candyUpgradeIcon = globalScene.add.image(12, 12, "candy"); + candyUpgradeIcon.setOrigin(0, 0); + candyUpgradeIcon.setScale(0.25); + candyUpgradeIcon.setVisible(false); + this.add(candyUpgradeIcon); + this.candyUpgradeIcon = candyUpgradeIcon; + + // candy upgrade overlay icon + const candyUpgradeOverlayIcon = globalScene.add.image(12, 12, "candy_overlay"); + candyUpgradeOverlayIcon.setOrigin(0, 0); + candyUpgradeOverlayIcon.setScale(0.25); + candyUpgradeOverlayIcon.setVisible(false); + this.add(candyUpgradeOverlayIcon); + this.candyUpgradeOverlayIcon = candyUpgradeOverlayIcon; + + // move icons + const eggMove1Icon = globalScene.add.image(0, 12, "mystery_egg"); + eggMove1Icon.setOrigin(0, 0); + eggMove1Icon.setScale(0.25); + eggMove1Icon.setVisible(false); + this.add(eggMove1Icon); + this.eggMove1Icon = eggMove1Icon; + + // move icons + const tmMove1Icon = globalScene.add.image(0, 12, "normal_memory"); + tmMove1Icon.setOrigin(0, 0); + tmMove1Icon.setScale(0.25); + tmMove1Icon.setVisible(false); + this.add(tmMove1Icon); + this.tmMove1Icon = tmMove1Icon; + + // move icons + const eggMove2Icon = globalScene.add.image(7, 12, "mystery_egg"); + eggMove2Icon.setOrigin(0, 0); + eggMove2Icon.setScale(0.25); + eggMove2Icon.setVisible(false); + this.add(eggMove2Icon); + this.eggMove2Icon = eggMove2Icon; + + // move icons + const tmMove2Icon = globalScene.add.image(7, 12, "normal_memory"); + tmMove2Icon.setOrigin(0, 0); + tmMove2Icon.setScale(0.25); + tmMove2Icon.setVisible(false); + this.add(tmMove2Icon); + this.tmMove2Icon = tmMove2Icon; + + + // passive icons + const passive1Icon = globalScene.add.image(3, 3, "candy"); + passive1Icon.setOrigin(0, 0); + passive1Icon.setScale(0.25); + passive1Icon.setVisible(false); + this.add(passive1Icon); + this.passive1Icon = passive1Icon; + + const passive1OverlayIcon = globalScene.add.image(12, 12, "candy_overlay"); + passive1OverlayIcon.setOrigin(0, 0); + passive1OverlayIcon.setScale(0.25); + passive1OverlayIcon.setVisible(false); + this.add(passive1OverlayIcon); + this.passive1OverlayIcon = passive1OverlayIcon; + + // passive icons + const passive2Icon = globalScene.add.image(12, 3, "candy"); + passive2Icon.setOrigin(0, 0); + passive2Icon.setScale(0.25); + passive2Icon.setVisible(false); + this.add(passive2Icon); + this.passive2Icon = passive2Icon; + + const passive2OverlayIcon = globalScene.add.image(12, 12, "candy_overlay"); + passive2OverlayIcon.setOrigin(0, 0); + passive2OverlayIcon.setScale(0.25); + passive2OverlayIcon.setVisible(false); + this.add(passive2OverlayIcon); + this.passive2OverlayIcon = passive2OverlayIcon; + } + + checkIconId(female, formIndex, shiny, variant) { + if (this.icon.frame.name !== this.species.getIconId(female, formIndex, shiny, variant)) { + console.log(`${this.species.name}'s variant icon does not exist. Replacing with default.`); + this.icon.setTexture(this.species.getIconAtlasKey(formIndex, false, variant)); + this.icon.setFrame(this.species.getIconId(female, formIndex, false, variant)); + } + } +} diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts new file mode 100644 index 00000000000..8b5a5bd12f1 --- /dev/null +++ b/src/ui/pokedex-page-ui-handler.ts @@ -0,0 +1,2445 @@ +import type { SpeciesFormEvolution } from "#app/data/balance/pokemon-evolutions"; +import { pokemonEvolutions, pokemonPrevolutions, pokemonStarters } from "#app/data/balance/pokemon-evolutions"; +import type { Variant } from "#app/data/variant"; +import { getVariantTint, getVariantIcon } from "#app/data/variant"; +import { argbFromRgba } from "@material/material-color-utilities"; +import i18next from "i18next"; +import { starterColors } from "#app/battle-scene"; +import { allAbilities } from "#app/data/ability"; +import { speciesEggMoves } from "#app/data/balance/egg-moves"; +import { GrowthRate, getGrowthRateColor } from "#app/data/exp"; +import { Gender, getGenderColor, getGenderSymbol } from "#app/data/gender"; +import { allMoves } from "#app/data/move"; +import { getNatureName } from "#app/data/nature"; +import type { SpeciesFormChange } from "#app/data/pokemon-forms"; +import { pokemonFormChanges } from "#app/data/pokemon-forms"; +import type { LevelMoves } from "#app/data/balance/pokemon-level-moves"; +import { pokemonFormLevelMoves, pokemonSpeciesLevelMoves } from "#app/data/balance/pokemon-level-moves"; +import type PokemonSpecies from "#app/data/pokemon-species"; +import { allSpecies, getPokemonSpeciesForm, normalForm } from "#app/data/pokemon-species"; +import { getStarterValueFriendshipCap, speciesStarterCosts } from "#app/data/balance/starters"; +import { starterPassiveAbilities } from "#app/data/balance/passives"; +import { Type } from "#enums/type"; +import { GameModes } from "#app/game-mode"; +import type { DexEntry, StarterAttributes } from "#app/system/game-data"; +import { AbilityAttr, DexAttr } from "#app/system/game-data"; +import type { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; +import MessageUiHandler from "#app/ui/message-ui-handler"; +import { StatsContainer } from "#app/ui/stats-container"; +import { TextStyle, addTextObject, getTextStyleOptions } from "#app/ui/text"; +import { Mode } from "#app/ui/ui"; +import { addWindow } from "#app/ui/ui-theme"; +import { Egg } from "#app/data/egg"; +import Overrides from "#app/overrides"; +import { SettingKeyboard } from "#app/system/settings/settings-keyboard"; +import { Passive as PassiveAttr } from "#enums/passive"; +import * as Challenge from "#app/data/challenge"; +import MoveInfoOverlay from "#app/ui/move-info-overlay"; +import PokedexInfoOverlay from "#app/ui/pokedex-info-overlay"; +import { getEggTierForSpecies } from "#app/data/egg"; +import { Device } from "#enums/devices"; +import type { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Button } from "#enums/buttons"; +import { EggSourceType } from "#enums/egg-source-types"; +import { getPassiveCandyCount, getValueReductionCandyCounts, getSameSpeciesEggCandyCounts } from "#app/data/balance/starters"; +import { BooleanHolder, getLocalizedSpriteKey, isNullOrUndefined, NumberHolder, padInt, rgbHexToRgba, toReadableString } from "#app/utils"; +import type { Nature } from "#enums/nature"; +import BgmBar from "./bgm-bar"; +import * as Utils from "../utils"; +import { speciesTmMoves } from "#app/data/balance/tms"; +import type { BiomeTierTod } from "#app/data/balance/biomes"; +import { BiomePoolTier, catchableSpecies } from "#app/data/balance/biomes"; +import { Biome } from "#app/enums/biome"; +import { TimeOfDay } from "#app/enums/time-of-day"; +import type { Abilities } from "#app/enums/abilities"; +import { BaseStatsOverlay } from "#app/ui/base-stats-overlay"; +import { globalScene } from "#app/global-scene"; + + +interface LanguageSetting { + starterInfoTextSize: string, + instructionTextSize: string, + starterInfoXPos?: number, + starterInfoYOffset?: number +} + +const languageSettings: { [key: string]: LanguageSetting } = { + "en":{ + starterInfoTextSize: "56px", + instructionTextSize: "38px", + }, + "de":{ + starterInfoTextSize: "48px", + instructionTextSize: "35px", + starterInfoXPos: 33, + }, + "es-ES":{ + starterInfoTextSize: "56px", + instructionTextSize: "35px", + }, + "fr":{ + starterInfoTextSize: "54px", + instructionTextSize: "38px", + }, + "it":{ + starterInfoTextSize: "56px", + instructionTextSize: "38px", + }, + "pt_BR":{ + starterInfoTextSize: "47px", + instructionTextSize: "38px", + starterInfoXPos: 33, + }, + "zh":{ + starterInfoTextSize: "47px", + instructionTextSize: "38px", + starterInfoYOffset: 1, + starterInfoXPos: 24, + }, + "pt":{ + starterInfoTextSize: "48px", + instructionTextSize: "42px", + starterInfoXPos: 33, + }, + "ko":{ + starterInfoTextSize: "52px", + instructionTextSize: "38px", + }, + "ja":{ + starterInfoTextSize: "51px", + instructionTextSize: "38px", + }, + "ca-ES":{ + starterInfoTextSize: "56px", + instructionTextSize: "38px", + }, +}; + +const valueReductionMax = 2; + +// Position of UI elements +const speciesContainerX = 109; + +interface SpeciesDetails { + shiny?: boolean, + formIndex?: number + female?: boolean, + variant?: number, +} + +enum MenuOptions { + BASE_STATS, + ABILITIES, + LEVEL_MOVES, + EGG_MOVES, + TM_MOVES, + BIOMES, + NATURES, + TOGGLE_IVS, + EVOLUTIONS +} + + +export default class PokedexPageUiHandler extends MessageUiHandler { + private starterSelectContainer: Phaser.GameObjects.Container; + private shinyOverlay: Phaser.GameObjects.Image; + private pokemonNumberText: Phaser.GameObjects.Text; + private pokemonSprite: Phaser.GameObjects.Sprite; + private pokemonNameText: Phaser.GameObjects.Text; + private pokemonGrowthRateLabelText: Phaser.GameObjects.Text; + private pokemonGrowthRateText: Phaser.GameObjects.Text; + private type1Icon: Phaser.GameObjects.Sprite; + private type2Icon: Phaser.GameObjects.Sprite; + private pokemonLuckLabelText: Phaser.GameObjects.Text; + private pokemonLuckText: Phaser.GameObjects.Text; + private pokemonGenderText: Phaser.GameObjects.Text; + private pokemonUncaughtText: Phaser.GameObjects.Text; + private pokemonCandyContainer: Phaser.GameObjects.Container; + private pokemonCandyIcon: Phaser.GameObjects.Sprite; + private pokemonCandyDarknessOverlay: Phaser.GameObjects.Sprite; + private pokemonCandyOverlayIcon: Phaser.GameObjects.Sprite; + private pokemonCandyCountText: Phaser.GameObjects.Text; + private pokemonCaughtHatchedContainer: Phaser.GameObjects.Container; + private pokemonCaughtCountText: Phaser.GameObjects.Text; + private pokemonFormText: Phaser.GameObjects.Text; + private pokemonHatchedIcon : Phaser.GameObjects.Sprite; + private pokemonHatchedCountText: Phaser.GameObjects.Text; + private pokemonShinyIcon: Phaser.GameObjects.Sprite; + + private activeTooltip: "ABILITY" | "PASSIVE" | "CANDY" | undefined; + private instructionsContainer: Phaser.GameObjects.Container; + private filterInstructionsContainer: Phaser.GameObjects.Container; + private shinyIconElement: Phaser.GameObjects.Sprite; + private formIconElement: Phaser.GameObjects.Sprite; + private genderIconElement: Phaser.GameObjects.Sprite; + private variantIconElement: Phaser.GameObjects.Sprite; + private shinyLabel: Phaser.GameObjects.Text; + private formLabel: Phaser.GameObjects.Text; + private genderLabel: Phaser.GameObjects.Text; + private variantLabel: Phaser.GameObjects.Text; + private candyUpgradeIconElement: Phaser.GameObjects.Sprite; + private candyUpgradeLabel: Phaser.GameObjects.Text; + private showBackSpriteIconElement: Phaser.GameObjects.Sprite; + private showBackSpriteLabel: Phaser.GameObjects.Text; + + private starterSelectMessageBox: Phaser.GameObjects.NineSlice; + private starterSelectMessageBoxContainer: Phaser.GameObjects.Container; + private statsContainer: StatsContainer; + private moveInfoOverlay: MoveInfoOverlay; + private infoOverlay: PokedexInfoOverlay; + private baseStatsOverlay: BaseStatsOverlay; + + private statsMode: boolean; + + private allSpecies: PokemonSpecies[] = []; + private species: PokemonSpecies; + private starterId: number; + private formIndex: number; + private speciesLoaded: Map = new Map(); + private levelMoves: LevelMoves; + private eggMoves: Moves[] = []; + private hasEggMoves: boolean[] = []; + private tmMoves: Moves[] = []; + private ability1: Abilities; + private ability2: Abilities | undefined; + private abilityHidden: Abilities | undefined; + private passive: Abilities; + private hasPassive: boolean; + private hasAbilities: number[]; + private biomes: BiomeTierTod[]; + private preBiomes: BiomeTierTod[]; + private baseStats: number[]; + private baseTotal: number; + private evolutions: SpeciesFormEvolution[]; + private battleForms: SpeciesFormChange[]; + private prevolutions: SpeciesFormEvolution[]; + + private speciesStarterDexEntry: DexEntry | null; + private canCycleShiny: boolean; + private canCycleForm: boolean; + private canCycleGender: boolean; + + private assetLoadCancelled: BooleanHolder | null; + public cursorObj: Phaser.GameObjects.Image; + + // variables to keep track of the dynamically rendered list of instruction prompts for starter select + private instructionRowX = 0; + private instructionRowY = 0; + private instructionRowTextOffset = 9; + private filterInstructionRowX = 0; + private filterInstructionRowY = 0; + + private starterAttributes: StarterAttributes; + private savedStarterAttributes: StarterAttributes; + + protected blockInput: boolean = false; + protected blockInputOverlay: boolean = false; + + private showBackSprite: boolean = false; + + // Menu + private menuContainer: Phaser.GameObjects.Container; + private menuBg: Phaser.GameObjects.NineSlice; + protected optionSelectText: Phaser.GameObjects.Text; + public bgmBar: BgmBar; + private menuOptions: MenuOptions[]; + protected scale: number = 0.1666666667; + private menuDescriptions: string[]; + + constructor() { + super(Mode.POKEDEX_PAGE); + } + + setup() { + const ui = this.getUi(); + const currentLanguage = i18next.resolvedLanguage ?? "en"; + const langSettingKey = Object.keys(languageSettings).find(lang => currentLanguage.includes(lang)) ?? "en"; + const textSettings = languageSettings[langSettingKey]; + + this.starterSelectContainer = globalScene.add.container(0, -globalScene.game.canvas.height / 6); + this.starterSelectContainer.setVisible(false); + ui.add(this.starterSelectContainer); + + const bgColor = globalScene.add.rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6, 0x006860); + bgColor.setOrigin(0, 0); + this.starterSelectContainer.add(bgColor); + + const starterSelectBg = globalScene.add.image(0, 0, "pokedex_summary_bg"); + starterSelectBg.setOrigin(0, 0); + this.starterSelectContainer.add(starterSelectBg); + + this.shinyOverlay = globalScene.add.image(6, 6, "summary_overlay_shiny"); + this.shinyOverlay.setOrigin(0, 0); + this.shinyOverlay.setVisible(false); + this.starterSelectContainer.add(this.shinyOverlay); + + this.pokemonNumberText = addTextObject(17, 1, "0000", TextStyle.SUMMARY); + this.pokemonNumberText.setOrigin(0, 0); + this.starterSelectContainer.add(this.pokemonNumberText); + + this.pokemonNameText = addTextObject(6, 112, "", TextStyle.SUMMARY); + this.pokemonNameText.setOrigin(0, 0); + this.starterSelectContainer.add(this.pokemonNameText); + + this.pokemonGrowthRateLabelText = addTextObject(8, 106, i18next.t("pokedexUiHandler:growthRate"), TextStyle.SUMMARY_ALT, { fontSize: "36px" }); + this.pokemonGrowthRateLabelText.setOrigin(0, 0); + this.pokemonGrowthRateLabelText.setVisible(false); + this.starterSelectContainer.add(this.pokemonGrowthRateLabelText); + + this.pokemonGrowthRateText = addTextObject(34, 106, "", TextStyle.SUMMARY_PINK, { fontSize: "36px" }); + this.pokemonGrowthRateText.setOrigin(0, 0); + this.starterSelectContainer.add(this.pokemonGrowthRateText); + + this.pokemonGenderText = addTextObject(96, 112, "", TextStyle.SUMMARY_ALT); + this.pokemonGenderText.setOrigin(0, 0); + this.starterSelectContainer.add(this.pokemonGenderText); + + this.pokemonUncaughtText = addTextObject(6, 127, i18next.t("pokedexUiHandler:uncaught"), TextStyle.WINDOW, { fontSize: "56px" }); + this.pokemonUncaughtText.setOrigin(0, 0); + this.starterSelectContainer.add(this.pokemonUncaughtText); + + const starterBoxContainer = globalScene.add.container(speciesContainerX + 6, 9); //115 + + for (const species of allSpecies) { + if (!speciesStarterCosts.hasOwnProperty(species.speciesId) || !species.isObtainable()) { + continue; + } + + this.speciesLoaded.set(species.speciesId, false); + this.allSpecies.push(species); + } + + this.starterSelectContainer.add(starterBoxContainer); + + this.pokemonSprite = globalScene.add.sprite(53, 63, "pkmn__sub"); + this.pokemonSprite.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true }); + this.starterSelectContainer.add(this.pokemonSprite); + + this.type1Icon = globalScene.add.sprite(8, 98, getLocalizedSpriteKey("types")); + this.type1Icon.setScale(0.5); + this.type1Icon.setOrigin(0, 0); + this.starterSelectContainer.add(this.type1Icon); + + this.type2Icon = globalScene.add.sprite(26, 98, getLocalizedSpriteKey("types")); + this.type2Icon.setScale(0.5); + this.type2Icon.setOrigin(0, 0); + this.starterSelectContainer.add(this.type2Icon); + + this.pokemonLuckLabelText = addTextObject(8, 89, i18next.t("common:luckIndicator"), TextStyle.WINDOW_ALT, { fontSize: "56px" }); + this.pokemonLuckLabelText.setOrigin(0, 0); + this.starterSelectContainer.add(this.pokemonLuckLabelText); + + this.pokemonLuckText = addTextObject(8 + this.pokemonLuckLabelText.displayWidth + 2, 89, "0", TextStyle.WINDOW, { fontSize: "56px" }); + this.pokemonLuckText.setOrigin(0, 0); + this.starterSelectContainer.add(this.pokemonLuckText); + + // Candy icon and count + this.pokemonCandyContainer = globalScene.add.container(4.5, 18); + + this.pokemonCandyIcon = globalScene.add.sprite(0, 0, "candy"); + this.pokemonCandyIcon.setScale(0.5); + this.pokemonCandyIcon.setOrigin(0, 0); + this.pokemonCandyContainer.add(this.pokemonCandyIcon); + + this.pokemonCandyOverlayIcon = globalScene.add.sprite(0, 0, "candy_overlay"); + this.pokemonCandyOverlayIcon.setScale(0.5); + this.pokemonCandyOverlayIcon.setOrigin(0, 0); + this.pokemonCandyContainer.add(this.pokemonCandyOverlayIcon); + + this.pokemonCandyDarknessOverlay = globalScene.add.sprite(0, 0, "candy"); + this.pokemonCandyDarknessOverlay.setScale(0.5); + this.pokemonCandyDarknessOverlay.setOrigin(0, 0); + this.pokemonCandyDarknessOverlay.setTint(0x000000); + this.pokemonCandyDarknessOverlay.setAlpha(0.50); + this.pokemonCandyContainer.add(this.pokemonCandyDarknessOverlay); + + this.pokemonCandyCountText = addTextObject(9.5, 0, "x0", TextStyle.WINDOW_ALT, { fontSize: "56px" }); + this.pokemonCandyCountText.setOrigin(0, 0); + this.pokemonCandyContainer.add(this.pokemonCandyCountText); + + this.pokemonCandyContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, 30, 20), Phaser.Geom.Rectangle.Contains); + this.starterSelectContainer.add(this.pokemonCandyContainer); + + this.pokemonFormText = addTextObject(6, 42, "Form", TextStyle.WINDOW_ALT, { fontSize: "42px" }); + this.pokemonFormText.setOrigin(0, 0); + this.starterSelectContainer.add(this.pokemonFormText); + + this.pokemonCaughtHatchedContainer = globalScene.add.container(2, 25); + this.pokemonCaughtHatchedContainer.setScale(0.5); + this.starterSelectContainer.add(this.pokemonCaughtHatchedContainer); + + const pokemonCaughtIcon = globalScene.add.sprite(1, 0, "items", "pb"); + pokemonCaughtIcon.setOrigin(0, 0); + pokemonCaughtIcon.setScale(0.75); + this.pokemonCaughtHatchedContainer.add(pokemonCaughtIcon); + + this.pokemonCaughtCountText = addTextObject(24, 4, "0", TextStyle.SUMMARY_ALT); + this.pokemonCaughtCountText.setOrigin(0, 0); + this.pokemonCaughtHatchedContainer.add(this.pokemonCaughtCountText); + + this.pokemonHatchedIcon = globalScene.add.sprite(1, 14, "egg_icons"); + this.pokemonHatchedIcon.setOrigin(0.15, 0.2); + this.pokemonHatchedIcon.setScale(0.8); + this.pokemonCaughtHatchedContainer.add(this.pokemonHatchedIcon); + + this.pokemonShinyIcon = globalScene.add.sprite(14, 117, "shiny_icons"); + this.pokemonShinyIcon.setOrigin(0.15, 0.2); + this.pokemonShinyIcon.setScale(1); + this.pokemonCaughtHatchedContainer.add(this.pokemonShinyIcon); + + this.pokemonHatchedCountText = addTextObject(24, 19, "0", TextStyle.SUMMARY_ALT); + this.pokemonHatchedCountText.setOrigin(0, 0); + this.pokemonCaughtHatchedContainer.add(this.pokemonHatchedCountText); + + // The font size should be set per language + const instructionTextSize = textSettings.instructionTextSize; + + this.instructionsContainer = globalScene.add.container(4, 128); + this.instructionsContainer.setVisible(true); + this.starterSelectContainer.add(this.instructionsContainer); + + this.candyUpgradeIconElement = new Phaser.GameObjects.Sprite(globalScene, this.instructionRowX, this.instructionRowY, "keyboard", "C.png"); + this.candyUpgradeIconElement.setName("sprite-candyUpgrade-icon-element"); + this.candyUpgradeIconElement.setScale(0.675); + this.candyUpgradeIconElement.setOrigin(0.0, 0.0); + this.candyUpgradeLabel = addTextObject(this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("pokedexUiHandler:candyUpgrade"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.candyUpgradeLabel.setName("text-candyUpgrade-label"); + + // instruction rows that will be pushed into the container dynamically based on need + // creating new sprites since they will be added to the scene later + this.shinyIconElement = new Phaser.GameObjects.Sprite(globalScene, this.instructionRowX, this.instructionRowY, "keyboard", "R.png"); + this.shinyIconElement.setName("sprite-shiny-icon-element"); + this.shinyIconElement.setScale(0.675); + this.shinyIconElement.setOrigin(0.0, 0.0); + this.shinyLabel = addTextObject(this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("pokedexUiHandler:cycleShiny"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.shinyLabel.setName("text-shiny-label"); + + this.formIconElement = new Phaser.GameObjects.Sprite(globalScene, this.instructionRowX, this.instructionRowY, "keyboard", "F.png"); + this.formIconElement.setName("sprite-form-icon-element"); + this.formIconElement.setScale(0.675); + this.formIconElement.setOrigin(0.0, 0.0); + this.formLabel = addTextObject(this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("pokedexUiHandler:cycleForm"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.formLabel.setName("text-form-label"); + + this.genderIconElement = new Phaser.GameObjects.Sprite(globalScene, this.instructionRowX, this.instructionRowY, "keyboard", "G.png"); + this.genderIconElement.setName("sprite-gender-icon-element"); + this.genderIconElement.setScale(0.675); + this.genderIconElement.setOrigin(0.0, 0.0); + this.genderLabel = addTextObject(this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("pokedexUiHandler:cycleGender"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.genderLabel.setName("text-gender-label"); + + this.variantIconElement = new Phaser.GameObjects.Sprite(globalScene, this.instructionRowX, this.instructionRowY, "keyboard", "V.png"); + this.variantIconElement.setName("sprite-variant-icon-element"); + this.variantIconElement.setScale(0.675); + this.variantIconElement.setOrigin(0.0, 0.0); + this.variantLabel = addTextObject(this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY, i18next.t("pokedexUiHandler:cycleVariant"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.variantLabel.setName("text-variant-label"); + + this.showBackSpriteIconElement = new Phaser.GameObjects.Sprite(globalScene, 50, 7, "keyboard", "E.png"); + this.showBackSpriteIconElement.setName("show-backSprite-icon-element"); + this.showBackSpriteIconElement.setScale(0.675); + this.showBackSpriteIconElement.setOrigin(0.0, 0.0); + this.showBackSpriteLabel = addTextObject(60, 7, i18next.t("pokedexUiHandler:showBackSprite"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.showBackSpriteLabel.setName("show-backSprite-label"); + this.starterSelectContainer.add(this.showBackSpriteIconElement); + this.starterSelectContainer.add(this.showBackSpriteLabel); + + this.hideInstructions(); + + this.filterInstructionsContainer = globalScene.add.container(50, 5); + this.filterInstructionsContainer.setVisible(true); + this.starterSelectContainer.add(this.filterInstructionsContainer); + + this.starterSelectMessageBoxContainer = globalScene.add.container(0, globalScene.game.canvas.height / 6); + this.starterSelectMessageBoxContainer.setVisible(false); + this.starterSelectContainer.add(this.starterSelectMessageBoxContainer); + + this.starterSelectMessageBox = addWindow(1, -1, 318, 28); + this.starterSelectMessageBox.setOrigin(0, 1); + this.starterSelectMessageBoxContainer.add(this.starterSelectMessageBox); + + this.message = addTextObject(8, 8, "", TextStyle.WINDOW, { maxLines: 2 }); + this.message.setOrigin(0, 0); + this.starterSelectMessageBoxContainer.add(this.message); + + // arrow icon for the message box + this.initPromptSprite(this.starterSelectMessageBoxContainer); + + this.statsContainer = new StatsContainer(6, 16); + + globalScene.add.existing(this.statsContainer); + + this.statsContainer.setVisible(false); + + this.starterSelectContainer.add(this.statsContainer); + + + // Adding menu container + this.menuContainer = globalScene.add.container(-130, 0); + this.menuContainer.setName("menu"); + this.menuContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6), Phaser.Geom.Rectangle.Contains); + + this.bgmBar = new BgmBar(); + this.bgmBar.setup(); + ui.bgmBar = this.bgmBar; + this.menuContainer.add(this.bgmBar); + this.menuContainer.setVisible(false); + + this.menuOptions = Utils.getEnumKeys(MenuOptions).map(m => parseInt(MenuOptions[m]) as MenuOptions); + + this.optionSelectText = addTextObject(0, 0, this.menuOptions.map(o => `${i18next.t(`pokedexUiHandler:${MenuOptions[o]}`)}`).join("\n"), TextStyle.WINDOW, { maxLines: this.menuOptions.length }); + this.optionSelectText.setLineSpacing(12); + + this.menuDescriptions = [ + i18next.t("pokedexUiHandler:showBaseStats"), + i18next.t("pokedexUiHandler:showAbilities"), + i18next.t("pokedexUiHandler:showLevelMoves"), + i18next.t("pokedexUiHandler:showEggMoves"), + i18next.t("pokedexUiHandler:showTmMoves"), + i18next.t("pokedexUiHandler:showBiomes"), + i18next.t("pokedexUiHandler:showNatures"), + i18next.t("pokedexUiHandler:toggleIVs"), + i18next.t("pokedexUiHandler:showEvolutions") + ]; + + this.scale = getTextStyleOptions(TextStyle.WINDOW, globalScene.uiTheme).scale; + this.menuBg = addWindow( + (globalScene.game.canvas.width / 6 - 83), + 0, + this.optionSelectText.displayWidth + 19 + 24 * this.scale, + (globalScene.game.canvas.height / 6) - 2 + ); + this.menuBg.setOrigin(0, 0); + + this.optionSelectText.setPositionRelative(this.menuBg, 10 + 24 * this.scale, 6); + + this.menuContainer.add(this.menuBg); + + this.menuContainer.add(this.optionSelectText); + + ui.add(this.menuContainer); + + this.starterSelectContainer.add(this.menuContainer); + + + // adding base stats + this.baseStatsOverlay = new BaseStatsOverlay({ x: 317, y: 0, width:133 }); + this.menuContainer.add(this.baseStatsOverlay); + this.menuContainer.bringToTop(this.baseStatsOverlay); + + // add the info overlay last to be the top most ui element and prevent the IVs from overlaying this + const overlayScale = 1; + this.moveInfoOverlay = new MoveInfoOverlay({ + scale: overlayScale, + top: true, + x: 1, + y: globalScene.game.canvas.height / 6 - MoveInfoOverlay.getHeight(overlayScale) - 29, + }); + this.starterSelectContainer.add(this.moveInfoOverlay); + + this.infoOverlay = new PokedexInfoOverlay({ + scale: overlayScale, + x: 1, + y: globalScene.game.canvas.height / 6 - PokedexInfoOverlay.getHeight(overlayScale) - 29, + }); + this.starterSelectContainer.add(this.infoOverlay); + + // Filter bar sits above everything, except the message box + this.starterSelectContainer.bringToTop(this.starterSelectMessageBoxContainer); + } + + show(args: any[]): boolean { + + if (args.length >= 1 && args[0] === "refresh") { + return false; + } else { + this.species = args[0]; + this.formIndex = args[1] ?? 0; + this.savedStarterAttributes = args[2] ?? { shiny:false, female:true, variant:0, form:0 }; + this.starterSetup(); + } + + this.moveInfoOverlay.clear(); // clear this when removing a menu; the cancel button doesn't seem to trigger this automatically on controllers + this.infoOverlay.clear(); + + super.show(args); + + this.starterSelectContainer.setVisible(true); + this.getUi().bringToTop(this.starterSelectContainer); + + this.starterAttributes = this.initStarterPrefs(); + + this.menuOptions = Utils.getEnumKeys(MenuOptions).map(m => parseInt(MenuOptions[m]) as MenuOptions); + + this.menuContainer.setVisible(true); + + this.speciesStarterDexEntry = this.species ? globalScene.gameData.dexData[this.species.speciesId] : null; + this.setSpecies(); + this.updateInstructions(); + + this.setCursor(0); + + return true; + + } + + starterSetup(): void { + + this.evolutions = []; + this.prevolutions = []; + this.battleForms = []; + + const species = this.species; + const formIndex = this.formIndex ?? 0; + + this.starterId = this.getStarterSpeciesId(this.species.speciesId); + + const allEvolutions = pokemonEvolutions.hasOwnProperty(species.speciesId) ? pokemonEvolutions[species.speciesId] : []; + + if (species.forms.length > 0) { + const form = species.forms[formIndex]; + + // If this form has a specific set of moves, we get them. + this.levelMoves = (formIndex > 0 && pokemonFormLevelMoves.hasOwnProperty(species.speciesId) && pokemonFormLevelMoves[species.speciesId].hasOwnProperty(formIndex)) ? pokemonFormLevelMoves[species.speciesId][formIndex] : pokemonSpeciesLevelMoves[species.speciesId]; + this.ability1 = form.ability1; + this.ability2 = (form.ability2 === form.ability1) ? undefined : form.ability2; + this.abilityHidden = (form.abilityHidden === form.ability1) ? undefined : form.abilityHidden; + + this.evolutions = allEvolutions.filter(e => (e.preFormKey === form.formKey || e.preFormKey === null)); + this.baseStats = form.baseStats; + this.baseTotal = form.baseTotal; + + } else { + this.levelMoves = pokemonSpeciesLevelMoves[species.speciesId]; + this.ability1 = species.ability1; + this.ability2 = (species.ability2 === species.ability1) ? undefined : species.ability2; + this.abilityHidden = (species.abilityHidden === species.ability1) ? undefined : species.abilityHidden; + + this.evolutions = allEvolutions; + this.baseStats = species.baseStats; + this.baseTotal = species.baseTotal; + } + + this.eggMoves = speciesEggMoves[this.starterId] ?? []; + this.hasEggMoves = Array.from({ length: 4 }, (_, em) => (globalScene.gameData.starterData[this.starterId].eggMoves & (1 << em)) !== 0); + + const formKey = this.species?.forms.length > 0 ? this.species.forms[this.formIndex].formKey : ""; + this.tmMoves = speciesTmMoves[species.speciesId]?.filter(m => Array.isArray(m) ? (m[0] === formKey ? true : false ) : true) + .map(m => Array.isArray(m) ? m[1] : m).sort((a, b) => allMoves[a].name > allMoves[b].name ? 1 : -1) ?? []; + + const passiveId = starterPassiveAbilities.hasOwnProperty(species.speciesId) ? species.speciesId : + starterPassiveAbilities.hasOwnProperty(this.starterId) ? this.starterId : pokemonPrevolutions[this.starterId]; + const passives = starterPassiveAbilities[passiveId]; + this.passive = (this.formIndex in passives) ? passives[formIndex] : passives[0]; + + const starterData = globalScene.gameData.starterData[this.starterId]; + const abilityAttr = starterData.abilityAttr; + this.hasPassive = starterData.passiveAttr > 0; + + const hasAbility1 = abilityAttr & AbilityAttr.ABILITY_1; + const hasAbility2 = abilityAttr & AbilityAttr.ABILITY_2; + const hasHiddenAbility = abilityAttr & AbilityAttr.ABILITY_HIDDEN; + + this.hasAbilities = [ + hasAbility1, + hasAbility2, + hasHiddenAbility + ]; + + const allBiomes = catchableSpecies[species.speciesId] ?? []; + this.preBiomes = this.sanitizeBiomes( + (catchableSpecies[this.starterId] ?? []) + .filter(b => !allBiomes.some(bm => (b.biome === bm.biome && b.tier === bm.tier)) && !(b.biome === Biome.TOWN)), + this.starterId); + this.biomes = this.sanitizeBiomes(allBiomes, species.speciesId); + + const allFormChanges = pokemonFormChanges.hasOwnProperty(species.speciesId) ? pokemonFormChanges[species.speciesId] : []; + this.battleForms = allFormChanges.filter(f => (f.preFormKey === this.species.forms[this.formIndex].formKey)); + + const preSpecies = pokemonPrevolutions.hasOwnProperty(this.species.speciesId) ? allSpecies.find(sp => sp.speciesId === pokemonPrevolutions[this.species.speciesId]) : null; + if (preSpecies) { + const preEvolutions = pokemonEvolutions.hasOwnProperty(preSpecies.speciesId) ? pokemonEvolutions[preSpecies.speciesId] : []; + this.prevolutions = preEvolutions.filter( + e => e.speciesId === species.speciesId && ( + ( + (e.evoFormKey === "" || e.evoFormKey === null) && + ( + // This takes care of Cosplay Pikachu (Pichu is not shown) + (preSpecies.forms.some(form => form.formKey === species.forms[formIndex]?.formKey)) || + // This takes care of Gholdengo + (preSpecies.forms.length > 0 && species.forms.length === 0) || + // This takes care of everything else + (preSpecies.forms.length === 0 && (species.forms.length === 0 || species.forms[formIndex]?.formKey === "")) + ) + ) + // This takes care of Burmy, Shellos etc + || e.evoFormKey === species.forms[formIndex]?.formKey + ) + ); + } + } + + // Function to ensure that forms appear in the appropriate biome and tod + sanitizeBiomes(biomes: BiomeTierTod[], speciesId: number): BiomeTierTod[] { + + if (speciesId === Species.BURMY || speciesId === Species.WORMADAM) { + return biomes.filter(b => { + const formIndex = (() => { + switch (b.biome) { + case Biome.BEACH: + return 1; + case Biome.SLUM: + return 2; + default: + return 0; + } + })(); + return this.formIndex === formIndex; + }); + + } else if (speciesId === Species.ROTOM) { + return biomes.filter(b => { + const formIndex = (() => { + switch (b.biome) { + case Biome.VOLCANO: + return 1; + case Biome.SEA: + return 2; + case Biome.ICE_CAVE: + return 3; + case Biome.MOUNTAIN: + return 4; + case Biome.TALL_GRASS: + return 5; + default: + return 0; + } + })(); + return this.formIndex === formIndex; + }); + + } else if (speciesId === Species.LYCANROC) { + return biomes.filter(b => { + const formIndex = (() => { + switch (b.tod[0]) { + case TimeOfDay.DAY: + case TimeOfDay.DAWN: + return 0; + case TimeOfDay.DUSK: + return 2; + case TimeOfDay.NIGHT: + return 1; + default: + return 0; + } + })(); + return this.formIndex === formIndex; + }); + } + + return biomes; + } + + isCaught(otherSpecies?: PokemonSpecies): bigint { + if (globalScene.dexForDevs) { + return 255n; + } + + const species = otherSpecies ? otherSpecies : this.species; + const dexEntry = globalScene.gameData.dexData[species.speciesId]; + const starterDexEntry = globalScene.gameData.dexData[this.getStarterSpeciesId(species.speciesId)]; + + return (dexEntry?.caughtAttr ?? 0n) & (starterDexEntry?.caughtAttr ?? 0n) & species.getFullUnlocksData(); + } + /** + * Check whether a given form is caught for a given species. + * All forms that can be reached through a form change during battle are considered caught and show up in the dex as such. + * + * @param otherSpecies The species to check; defaults to current species + * @param otherFormIndex The form index of the form to check; defaults to current form + * @returns StarterAttributes for the species + */ + isFormCaught(otherSpecies?: PokemonSpecies, otherFormIndex?: number | undefined): boolean { + + if (globalScene.dexForDevs) { + return true; + } + const species = otherSpecies ? otherSpecies : this.species; + const formIndex = otherFormIndex !== undefined ? otherFormIndex : this.formIndex; + const caughtAttr = this.isCaught(species); + + const isFormCaught = (caughtAttr & globalScene.gameData.getFormAttr(formIndex ?? 0)) > 0n; + return isFormCaught; + } + + /** + * Get the starter attributes for the given PokemonSpecies, after sanitizing them. + * If somehow a preference is set for a form, variant, gender, ability or nature + * that wasn't actually unlocked or is invalid it will be cleared here + * + * @param species The species to get Starter Preferences for + * @returns StarterAttributes for the species + */ + initStarterPrefs(): StarterAttributes { + const starterAttributes : StarterAttributes | null = this.species ? { ...this.savedStarterAttributes } : null; + const caughtAttr = this.isCaught(); + + // no preferences or Pokemon wasn't caught, return empty attribute + if (!starterAttributes || !caughtAttr) { + return {}; + } + + const hasShiny = caughtAttr & DexAttr.SHINY; + const hasNonShiny = caughtAttr & DexAttr.NON_SHINY; + if (!hasShiny || (starterAttributes.shiny === undefined && hasNonShiny)) { + // shiny form wasn't unlocked, purging shiny and variant setting + starterAttributes.shiny = false; + starterAttributes.variant = 0; + } else if (!hasNonShiny || (starterAttributes.shiny === undefined && hasShiny)) { + starterAttributes.shiny = true; + starterAttributes.variant = 0; + } + + const unlockedVariants = [ + hasShiny && caughtAttr & DexAttr.DEFAULT_VARIANT, + hasShiny && caughtAttr & DexAttr.VARIANT_2, + hasShiny && caughtAttr & DexAttr.VARIANT_3 + ]; + if (starterAttributes.variant === undefined || isNaN(starterAttributes.variant) || starterAttributes.variant < 0) { + starterAttributes.variant = 0; + } else if (!unlockedVariants[starterAttributes.variant]) { + let highestValidIndex = -1; + for (let i = 0; i <= starterAttributes.variant && i < unlockedVariants.length; i++) { + if (unlockedVariants[i] !== 0n) { + highestValidIndex = i; + } + } + // Set to the highest valid index found or default to 0 + starterAttributes.variant = highestValidIndex !== -1 ? highestValidIndex : 0; + } + + if (starterAttributes.female !== undefined) { + if ((starterAttributes.female && !(caughtAttr & DexAttr.FEMALE)) || (!starterAttributes.female && !(caughtAttr & DexAttr.MALE))) { + starterAttributes.female = !starterAttributes.female; + } + } else { + if (caughtAttr & DexAttr.FEMALE) { + starterAttributes.female = true; + } else if (caughtAttr & DexAttr.MALE) { + starterAttributes.female = false; + } + } + + return starterAttributes; + } + + showText(text: string, delay?: number, callback?: Function, callbackDelay?: number, prompt?: boolean, promptDelay?: number, moveToTop?: boolean) { + super.showText(text, delay, callback, callbackDelay, prompt, promptDelay); + + const singleLine = text?.indexOf("\n") === -1; + + this.starterSelectMessageBox.setSize(318, singleLine ? 28 : 42); + + if (moveToTop) { + this.starterSelectMessageBox.setOrigin(0, 0); + this.starterSelectMessageBoxContainer.setY(0); + this.message.setY(4); + } else { + this.starterSelectMessageBoxContainer.setY(globalScene.game.canvas.height / 6); + this.starterSelectMessageBox.setOrigin(0, 1); + this.message.setY(singleLine ? -22 : -37); + } + + this.starterSelectMessageBoxContainer.setVisible(!!text?.length); + } + + /** + * Determines if 'Icon' based upgrade notifications should be shown + * @returns true if upgrade notifications are enabled and set to display an 'Icon' + */ + isUpgradeIconEnabled(): boolean { + return globalScene.candyUpgradeNotification !== 0 && globalScene.candyUpgradeDisplay === 0; + } + /** + * Determines if 'Animation' based upgrade notifications should be shown + * @returns true if upgrade notifications are enabled and set to display an 'Animation' + */ + isUpgradeAnimationEnabled(): boolean { + return globalScene.candyUpgradeNotification !== 0 && globalScene.candyUpgradeDisplay === 1; + } + + /** + * If the pokemon is an evolution, find speciesId of its starter. + * @param speciesId the id of the species to check + * @returns the id of the corresponding starter + */ + getStarterSpeciesId(speciesId): number { + if (speciesId === Species.PIKACHU) { + if ([ 0, 1, 8 ].includes(this.formIndex)) { + return Species.PICHU; + } else { + return Species.PIKACHU; + } + } + if (speciesStarterCosts.hasOwnProperty(speciesId)) { + return speciesId; + } else { + return pokemonStarters[speciesId]; + } + } + + getStarterSpecies(species): PokemonSpecies { + if (speciesStarterCosts.hasOwnProperty(species.speciesId)) { + return species; + } else { + return allSpecies.find(sp => sp.speciesId === pokemonStarters[species.speciesId]) ?? species; + } + } + + processInput(button: Button): boolean { + if (this.blockInput) { + return false; + } + + const ui = this.getUi(); + + let success = false; + let error = false; + + const isCaught = this.isCaught(); + const isFormCaught = this.isFormCaught(); + + if (this.blockInputOverlay) { + if (button === Button.CANCEL || button === Button.ACTION) { + this.blockInputOverlay = false; + this.baseStatsOverlay.clear(); + ui.showText(""); + return true; + } else if (button === Button.UP || button === Button.DOWN) { + this.blockInputOverlay = false; + this.baseStatsOverlay.clear(); + ui.showText(""); + } else { + return false; + } + } + + if (button === Button.SUBMIT) { + success = true; + } else if (button === Button.CANCEL) { + if (this.statsMode) { + this.toggleStatsMode(false); + success = true; + } else { + this.getUi().revertMode(); + success = true; + } + } else { + + const starterData = globalScene.gameData.starterData[this.starterId]; + // prepare persistent starter data to store changes + const starterAttributes = this.starterAttributes; + + if (button === Button.ACTION) { + + switch (this.cursor) { + + case MenuOptions.BASE_STATS: + + if (!isCaught || !isFormCaught) { + error = true; + } else { + + this.blockInput = true; + + ui.setMode(Mode.POKEDEX_PAGE, "refresh").then(() => { + ui.showText(i18next.t("pokedexUiHandler:showBaseStats"), null, () => { + + this.baseStatsOverlay.show(this.baseStats, this.baseTotal); + + this.blockInput = false; + this.blockInputOverlay = true; + + return true; + }); + success = true; + }); + } + break; + + case MenuOptions.LEVEL_MOVES: + + if (!isCaught || !isFormCaught) { + error = true; + } else { + + this.blockInput = true; + + ui.setMode(Mode.POKEDEX_PAGE, "refresh").then(() => { + ui.showText(i18next.t("pokedexUiHandler:showLevelMoves"), null, () => { + + this.moveInfoOverlay.show(allMoves[this.levelMoves[0][1]]); + + ui.setModeWithoutClear(Mode.OPTION_SELECT, { + options: this.levelMoves.map(m => { + const option: OptionSelectItem = { + label: String(m[0]).padEnd(4, " ") + allMoves[m[1]].name, + handler: () => { + return false; + }, + onHover: () => { + this.moveInfoOverlay.show(allMoves[m[1]]); + }, + }; + return option; + }).concat({ + label: i18next.t("menu:cancel"), + handler: () => { + this.moveInfoOverlay.clear(); + this.clearText(); + ui.setMode(Mode.POKEDEX_PAGE, "refresh"); + return true; + }, + onHover: () => { + this.moveInfoOverlay.clear(); + }, + }), + supportHover: true, + maxOptions: 8, + yOffset: 19 + }); + + this.blockInput = false; + }); + }); + success = true; + } + break; + + case MenuOptions.EGG_MOVES: + + + if (!isCaught || !isFormCaught) { + error = true; + } else { + + this.blockInput = true; + + ui.setMode(Mode.POKEDEX_PAGE, "refresh").then(() => { + + if (this.eggMoves.length === 0) { + ui.showText(i18next.t("pokedexUiHandler:noEggMoves")); + this.blockInput = false; + return true; + } + + ui.showText(i18next.t("pokedexUiHandler:showEggMoves"), null, () => { + + this.moveInfoOverlay.show(allMoves[this.eggMoves[0]]); + + ui.setModeWithoutClear(Mode.OPTION_SELECT, { + options: [ + { + label: i18next.t("pokedexUiHandler:common"), + skip: true, + style: TextStyle.MONEY_WINDOW, + handler: () => false, // Non-selectable, but handler is required + onHover: () => this.moveInfoOverlay.clear() // No hover behavior for titles + }, + ...this.eggMoves.slice(0, 3).map((m, i) => ({ + label: allMoves[m].name, + style: this.hasEggMoves[i] ? TextStyle.SETTINGS_VALUE : TextStyle.SHADOW_TEXT, + handler: () => false, + onHover: () => this.moveInfoOverlay.show(allMoves[m]) + })), + { + label: i18next.t("pokedexUiHandler:rare"), + skip: true, + style: TextStyle.MONEY_WINDOW, + handler: () => false, + onHover: () => this.moveInfoOverlay.clear() + }, + { + label: allMoves[this.eggMoves[3]].name, + style: this.hasEggMoves[3] ? TextStyle.SETTINGS_VALUE : TextStyle.SHADOW_TEXT, + handler: () => false, + onHover: () => this.moveInfoOverlay.show(allMoves[this.eggMoves[3]]) + }, + { + label: i18next.t("menu:cancel"), + handler: () => { + this.moveInfoOverlay.clear(); + this.clearText(); + ui.setMode(Mode.POKEDEX_PAGE, "refresh"); + return true; + }, + onHover: () => this.moveInfoOverlay.clear() + } + ], + supportHover: true, + maxOptions: 8, + yOffset: 19 + }); + + this.blockInput = false; + }); + }); + success = true; + } + break; + + case MenuOptions.TM_MOVES: + + if (!isCaught || !isFormCaught) { + error = true; + } else if (this.tmMoves.length < 1) { + ui.showText(i18next.t("pokedexUiHandler:noTmMoves")); + error = true; + } else { + this.blockInput = true; + + ui.setMode(Mode.POKEDEX_PAGE, "refresh").then(() => { + ui.showText(i18next.t("pokedexUiHandler:showTmMoves"), null, () => { + + this.moveInfoOverlay.show(allMoves[this.tmMoves[0]]); + + ui.setModeWithoutClear(Mode.OPTION_SELECT, { + options: this.tmMoves.map(m => { + const option: OptionSelectItem = { + label: allMoves[m].name, + handler: () => { + return false; + }, + onHover: () => { + this.moveInfoOverlay.show(allMoves[m]); + }, + }; + return option; + }).concat({ + label: i18next.t("menu:cancel"), + handler: () => { + this.moveInfoOverlay.clear(); + this.clearText(); + ui.setMode(Mode.POKEDEX_PAGE, "refresh"); + return true; + }, + onHover: () => { + this.moveInfoOverlay.clear(); + }, + }), + supportHover: true, + maxOptions: 8, + yOffset: 19 + }); + + this.blockInput = false; + }); + }); + success = true; + } + break; + + case MenuOptions.ABILITIES: + + if (!isCaught || !isFormCaught) { + error = true; + } else { + + this.blockInput = true; + + ui.setMode(Mode.POKEDEX_PAGE, "refresh").then(() => { + + ui.showText(i18next.t("pokedexUiHandler:showAbilities"), null, () => { + + this.infoOverlay.show(allAbilities[this.ability1].description); + + const options: any[] = []; + + if (this.ability1) { + options.push({ + label: allAbilities[this.ability1].name, + style: this.hasAbilities[0] > 0 ? TextStyle.SETTINGS_VALUE : TextStyle.SHADOW_TEXT, + handler: () => false, + onHover: () => this.infoOverlay.show(allAbilities[this.ability1].description) + }); + } + if (this.ability2) { + const ability = allAbilities[this.ability2]; + options.push({ + label: ability?.name, + style: this.hasAbilities[1] > 0 ? TextStyle.SETTINGS_VALUE : TextStyle.SHADOW_TEXT, + handler: () => false, + onHover: () => this.infoOverlay.show(ability?.description) + }); + } + + if (this.abilityHidden) { + options.push({ + label: i18next.t("pokedexUiHandler:hidden"), + skip: true, + style: TextStyle.MONEY_WINDOW, + handler: () => false, + onHover: () => this.infoOverlay.clear() + }); + const ability = allAbilities[this.abilityHidden]; + options.push({ + label: allAbilities[this.abilityHidden].name, + style: this.hasAbilities[2] > 0 ? TextStyle.SETTINGS_VALUE : TextStyle.SHADOW_TEXT, + handler: () => false, + onHover: () => this.infoOverlay.show(ability?.description) + }); + } + + if (this.passive) { + options.push({ + label: i18next.t("pokedexUiHandler:passive"), + skip: true, + style: TextStyle.MONEY_WINDOW, + handler: () => false, + onHover: () => this.infoOverlay.clear() + }); + options.push({ + label: allAbilities[this.passive].name, + style: this.hasPassive ? TextStyle.SETTINGS_VALUE : TextStyle.SHADOW_TEXT, + handler: () => false, + onHover: () => this.infoOverlay.show(allAbilities[this.passive].description) + }); + } + + options.push({ + label: i18next.t("menu:cancel"), + handler: () => { + this.infoOverlay.clear(); + this.clearText(); + ui.setMode(Mode.POKEDEX_PAGE, "refresh"); + return true; + }, + onHover: () => this.infoOverlay.clear() + }); + + ui.setModeWithoutClear(Mode.OPTION_SELECT, { + options: options, + supportHover: true, + maxOptions: 8, + yOffset: 19 + }); + + this.blockInput = false; + }); + }); + success = true; + } + break; + + case MenuOptions.BIOMES: + + if (!(isCaught || this.speciesStarterDexEntry?.seenAttr)) { + error = true; + } else { + this.blockInput = true; + + ui.setMode(Mode.POKEDEX_PAGE, "refresh").then(() => { + + if ((!this.biomes || this.biomes?.length === 0) && + (!this.preBiomes || this.preBiomes?.length === 0)) { + ui.showText(i18next.t("pokedexUiHandler:noBiomes")); + ui.playError(); + this.blockInput = false; + return true; + } + + const options: any[] = []; + + ui.showText(i18next.t("pokedexUiHandler:showBiomes"), null, () => { + + this.biomes.map(b => { + options.push({ + label: i18next.t(`biome:${Biome[b.biome].toUpperCase()}`) + " - " + + i18next.t(`biome:${BiomePoolTier[b.tier].toUpperCase()}`) + + ( b.tod.length === 1 && b.tod[0] === -1 ? "" : " (" + b.tod.map(tod => i18next.t(`biome:${TimeOfDay[tod].toUpperCase()}`)).join(", ") + ")"), + handler: () => false + }); + }); + + + if (this.preBiomes.length > 0) { + options.push({ + label: i18next.t("pokedexUiHandler:preBiomes"), + skip: true, + handler: () => false + }); + this.preBiomes.map(b => { + options.push({ + label: i18next.t(`biome:${Biome[b.biome].toUpperCase()}`) + " - " + + i18next.t(`biome:${BiomePoolTier[b.tier].toUpperCase()}`) + + ( b.tod.length === 1 && b.tod[0] === -1 ? "" : " (" + b.tod.map(tod => i18next.t(`biome:${TimeOfDay[tod].toUpperCase()}`)).join(", ") + ")"), + handler: () => false + }); + }); + } + + options.push({ + label: i18next.t("menu:cancel"), + handler: () => { + this.moveInfoOverlay.clear(); + this.clearText(); + ui.setMode(Mode.POKEDEX_PAGE, "refresh"); + return true; + }, + onHover: () => this.moveInfoOverlay.clear() + }); + + ui.setModeWithoutClear(Mode.OPTION_SELECT, { + options: options, + supportHover: true, + maxOptions: 8, + yOffset: 19 + }); + + this.blockInput = false; + }); + }); + success = true; + } + break; + + case MenuOptions.EVOLUTIONS: + + if (!isCaught || !isFormCaught) { + error = true; + } else { + + this.blockInput = true; + + ui.setMode(Mode.POKEDEX_PAGE, "refresh").then(() => { + + const options: any[] = []; + + if ((!this.prevolutions || this.prevolutions?.length === 0) && + (!this.evolutions || this.evolutions?.length === 0) && + (!this.battleForms || this.battleForms?.length === 0)) { + ui.showText(i18next.t("pokedexUiHandler:noEvolutions")); + ui.playError(); + this.blockInput = false; + return true; + } + + ui.showText(i18next.t("pokedexUiHandler:showEvolutions"), null, () => { + + if (this.prevolutions?.length > 0) { + options.push({ + label: i18next.t("pokedexUiHandler:prevolutions"), + style: TextStyle.MONEY_WINDOW, + skip: true, + handler: () => false + }); + this.prevolutions.map(pre => { + const preSpecies = allSpecies.find(species => species.speciesId === pokemonPrevolutions[this.species.speciesId]); + const preFormIndex: number = preSpecies?.forms.find(f => f.formKey === pre.preFormKey)?.formIndex ?? 0; + + const conditionText: string = pre.description; + + options.push({ + label: pre.preFormKey ? + (preSpecies ?? this.species).getFormNameToDisplay(preFormIndex, true) : + (preSpecies ?? this.species).getExpandedSpeciesName(), + handler: () => { + const newSpecies = allSpecies.find(species => species.speciesId === pokemonPrevolutions[pre.speciesId]); + // Attempts to find the formIndex of the prevolved species + const newFormKey = pre.preFormKey ? pre.preFormKey : (this.species.forms.length > 0 ? this.species.forms[this.formIndex].formKey : ""); + const matchingForm = newSpecies?.forms.find(form => form.formKey === newFormKey); + const newFormIndex = matchingForm ? matchingForm.formIndex : 0; + this.starterAttributes.form = newFormIndex; + this.savedStarterAttributes.form = newFormIndex; + this.moveInfoOverlay.clear(); + this.clearText(); + ui.setMode(Mode.POKEDEX_PAGE, newSpecies, newFormIndex, this.savedStarterAttributes); + return true; + }, + onHover: () => this.showText(conditionText) + }); + }); + } + + if (this.evolutions.length > 0) { + options.push({ + label: i18next.t("pokedexUiHandler:evolutions"), + style: TextStyle.MONEY_WINDOW, + skip: true, + handler: () => false + }); + this.evolutions.map(evo => { + const evoSpecies = allSpecies.find(species => species.speciesId === evo.speciesId); + const isCaughtEvo = this.isCaught(evoSpecies) ? true : false; + // Attempts to find the formIndex of the evolved species + const newFormKey = evo.evoFormKey ? evo.evoFormKey : (this.species.forms.length > 0 ? this.species.forms[this.formIndex].formKey : ""); + const matchingForm = evoSpecies?.forms.find(form => form.formKey === newFormKey); + const newFormIndex = matchingForm ? matchingForm.formIndex : 0; + const isFormCaughtEvo = this.isFormCaught(evoSpecies, newFormIndex); + + const conditionText: string = evo.description; + + options.push({ + label: evo.evoFormKey ? + (evoSpecies ?? this.species).getFormNameToDisplay(newFormIndex, true) : + (evoSpecies ?? this.species).getExpandedSpeciesName(), + style: isCaughtEvo && isFormCaughtEvo ? TextStyle.WINDOW : TextStyle.SHADOW_TEXT, + handler: () => { + this.starterAttributes.form = newFormIndex; + this.savedStarterAttributes.form = newFormIndex; + this.moveInfoOverlay.clear(); + this.clearText(); + ui.setMode(Mode.POKEDEX_PAGE, evoSpecies, newFormIndex, this.savedStarterAttributes); + return true; + }, + onHover: () => this.showText(conditionText) + }); + }); + } + + if (this.battleForms.length > 0) { + options.push({ + label: i18next.t("pokedexUiHandler:forms"), + style: TextStyle.MONEY_WINDOW, + skip: true, + handler: () => false + }); + this.battleForms.map(bf => { + const matchingForm = this.species?.forms.find(form => form.formKey === bf.formKey); + const newFormIndex = matchingForm ? matchingForm.formIndex : 0; + + let conditionText:string = ""; + if (bf.trigger) { + conditionText = bf.trigger.description; + } else { + conditionText = ""; + } + let label: string = this.species.getFormNameToDisplay(newFormIndex); + if (label === "") { + label = this.species.name; + } + const isFormCaught = this.isFormCaught(this.species, newFormIndex); + + if (conditionText) { + options.push({ + label: label, + style: isFormCaught ? TextStyle.WINDOW : TextStyle.SHADOW_TEXT, + handler: () => { + const newSpecies = this.species; + const newFormIndex = this.species.forms.find(f => f.formKey === bf.formKey)?.formIndex; + this.starterAttributes.form = newFormIndex; + this.savedStarterAttributes.form = newFormIndex; + this.moveInfoOverlay.clear(); + this.clearText(); + ui.setMode(Mode.POKEDEX_PAGE, newSpecies, newFormIndex, this.savedStarterAttributes); + return true; + }, + onHover: () => this.showText(conditionText) + }); + } + }); + } + + options.push({ + label: i18next.t("menu:cancel"), + handler: () => { + this.moveInfoOverlay.clear(); + this.clearText(); + ui.setMode(Mode.POKEDEX_PAGE, "refresh"); + return true; + }, + onHover: () => this.moveInfoOverlay.clear() + }); + + ui.setModeWithoutClear(Mode.OPTION_SELECT, { + options: options, + supportHover: true, + maxOptions: 8, + yOffset: 19 + }); + + this.blockInput = false; + }); + }); + success = true; + } + break; + + case MenuOptions.TOGGLE_IVS: + + if (!isCaught || !isFormCaught) { + error = true; + } else { + this.toggleStatsMode(); + ui.setMode(Mode.POKEDEX_PAGE, "refresh"); + success = true; + } + break; + + case MenuOptions.NATURES: + + if (!isCaught || !isFormCaught) { + error = true; + } else { + this.blockInput = true; + ui.setMode(Mode.POKEDEX_PAGE, "refresh").then(() => { + ui.showText(i18next.t("pokedexUiHandler:showNature"), null, () => { + const natures = globalScene.gameData.getNaturesForAttr(this.speciesStarterDexEntry?.natureAttr); + ui.setModeWithoutClear(Mode.OPTION_SELECT, { + options: natures.map((n: Nature, i: number) => { + const option: OptionSelectItem = { + label: getNatureName(n, true, true, true, globalScene.uiTheme), + handler: () => { + return false; + } + }; + return option; + }).concat({ + label: i18next.t("menu:cancel"), + handler: () => { + this.clearText(); + ui.setMode(Mode.POKEDEX_PAGE, "refresh"); + this.blockInput = false; + return true; + } + }), + maxOptions: 8, + yOffset: 19 + }); + }); + }); + success = true; + } + break; + } + + } else { + const props = globalScene.gameData.getSpeciesDexAttrProps(this.species, this.getCurrentDexProps(this.species.speciesId)); + switch (button) { + case Button.CYCLE_SHINY: + if (this.canCycleShiny) { + + if (!starterAttributes.shiny) { + // Change to shiny, we need to get the proper default variant + const newVariant = starterAttributes.variant ? starterAttributes.variant as Variant : 0; + this.setSpeciesDetails(this.species, { shiny: true, variant: newVariant }); + + globalScene.playSound("se/sparkle"); + // Set the variant label to the shiny tint + const tint = getVariantTint(newVariant); + this.pokemonShinyIcon.setFrame(getVariantIcon(newVariant)); + this.pokemonShinyIcon.setTint(tint); + this.pokemonShinyIcon.setVisible(true); + + starterAttributes.shiny = true; + this.savedStarterAttributes.shiny = starterAttributes.shiny; + } else { + let newVariant = props.variant; + do { + newVariant = (newVariant + 1) % 3; + if (newVariant === 0) { + if (this.isCaught() & DexAttr.DEFAULT_VARIANT) { + break; + } + } else if (newVariant === 1) { + if (this.isCaught() & DexAttr.VARIANT_2) { + break; + } + } else { + if (this.isCaught() & DexAttr.VARIANT_3) { + break; + } + } + } while (newVariant !== props.variant); + + starterAttributes.variant = newVariant; // store the selected variant + this.savedStarterAttributes.variant = starterAttributes.variant; + if (newVariant > props.variant) { + this.setSpeciesDetails(this.species, { variant: newVariant as Variant }); + // Cycle tint based on current sprite tint + const tint = getVariantTint(newVariant as Variant); + this.pokemonShinyIcon.setFrame(getVariantIcon(newVariant as Variant)); + this.pokemonShinyIcon.setTint(tint); + success = true; + } else { + this.setSpeciesDetails(this.species, { shiny: false, variant: 0 }); + this.pokemonShinyIcon.setVisible(false); + success = true; + + starterAttributes.shiny = false; + this.savedStarterAttributes.shiny = starterAttributes.shiny; + } + } + } + break; + case Button.CYCLE_FORM: + if (this.canCycleForm) { + const formCount = this.species.forms.length; + let newFormIndex = this.formIndex; + do { + newFormIndex = (newFormIndex + 1) % formCount; + if (this.species.forms[newFormIndex].isStarterSelectable || globalScene.dexForDevs) { // TODO: are those bangs correct? + break; + } + } while (newFormIndex !== props.formIndex || this.species.forms[newFormIndex].isUnobtainable); + starterAttributes.form = newFormIndex; // store the selected form + this.savedStarterAttributes.form = starterAttributes.form; + this.formIndex = newFormIndex; + this.starterSetup(); + this.setSpeciesDetails(this.species, { formIndex: newFormIndex }); + success = this.setCursor(this.cursor); + } + break; + case Button.CYCLE_GENDER: + if (this.canCycleGender) { + starterAttributes.female = !props.female; + this.savedStarterAttributes.female = starterAttributes.female; + this.setSpeciesDetails(this.species, { female: !props.female }); + success = true; + } + break; + case Button.STATS: + if (!isCaught || !isFormCaught) { + error = true; + } else { + const ui = this.getUi(); + ui.showText(""); + const options: any[] = []; // TODO: add proper type + + const passiveAttr = starterData.passiveAttr; + const candyCount = starterData.candyCount; + + if (!(passiveAttr & PassiveAttr.UNLOCKED)) { + const passiveCost = getPassiveCandyCount(speciesStarterCosts[this.starterId]); + options.push({ + label: `x${passiveCost} ${i18next.t("pokedexUiHandler:unlockPassive")} (${allAbilities[this.passive].name})`, + handler: () => { + if (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= passiveCost) { + starterData.passiveAttr |= PassiveAttr.UNLOCKED | PassiveAttr.ENABLED; + if (!Overrides.FREE_CANDY_UPGRADE_OVERRIDE) { + starterData.candyCount -= passiveCost; + } + this.pokemonCandyCountText.setText(`x${starterData.candyCount}`); + globalScene.gameData.saveSystem().then(success => { + if (!success) { + return globalScene.reset(true); + } + }); + this.setSpeciesDetails(this.species); + globalScene.playSound("se/buy"); + ui.setMode(Mode.POKEDEX_PAGE, "refresh"); + + return true; + } + return false; + }, + style: this.isPassiveAvailable() ? TextStyle.WINDOW : TextStyle.SHADOW_TEXT, + item: "candy", + itemArgs: this.isPassiveAvailable() ? starterColors[this.starterId] : [ "808080", "808080" ] + }); + } + + // Reduce cost option + const valueReduction = starterData.valueReduction; + if (valueReduction < valueReductionMax) { + const reductionCost = getValueReductionCandyCounts(speciesStarterCosts[this.starterId])[valueReduction]; + options.push({ + label: `x${reductionCost} ${i18next.t("pokedexUiHandler:reduceCost")}`, + handler: () => { + if (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= reductionCost) { + starterData.valueReduction++; + if (!Overrides.FREE_CANDY_UPGRADE_OVERRIDE) { + starterData.candyCount -= reductionCost; + } + this.pokemonCandyCountText.setText(`x${starterData.candyCount}`); + globalScene.gameData.saveSystem().then(success => { + if (!success) { + return globalScene.reset(true); + } + }); + ui.setMode(Mode.POKEDEX_PAGE, "refresh"); + globalScene.playSound("se/buy"); + + return true; + } + return false; + }, + style: this.isValueReductionAvailable() ? TextStyle.WINDOW : TextStyle.SHADOW_TEXT, + item: "candy", + itemArgs: this.isValueReductionAvailable() ? starterColors[this.starterId] : [ "808080", "808080" ] + }); + } + + // Same species egg menu option. + const sameSpeciesEggCost = getSameSpeciesEggCandyCounts(speciesStarterCosts[this.starterId]); + options.push({ + label: `x${sameSpeciesEggCost} ${i18next.t("pokedexUiHandler:sameSpeciesEgg")}`, + handler: () => { + if (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= sameSpeciesEggCost) { + if (globalScene.gameData.eggs.length >= 99 && !Overrides.UNLIMITED_EGG_COUNT_OVERRIDE) { + // Egg list full, show error message at the top of the screen and abort + this.showText(i18next.t("egg:tooManyEggs"), undefined, () => this.showText("", 0, () => this.tutorialActive = false), 2000, false, undefined, true); + return false; + } + if (!Overrides.FREE_CANDY_UPGRADE_OVERRIDE) { + starterData.candyCount -= sameSpeciesEggCost; + } + this.pokemonCandyCountText.setText(`x${starterData.candyCount}`); + + const egg = new Egg({ scene: globalScene, species: this.starterId, sourceType: EggSourceType.SAME_SPECIES_EGG }); + egg.addEggToGameData(); + + globalScene.gameData.saveSystem().then(success => { + if (!success) { + return globalScene.reset(true); + } + }); + ui.setMode(Mode.POKEDEX_PAGE, "refresh"); + globalScene.playSound("se/buy"); + + return true; + } + return false; + }, + style: this.isSameSpeciesEggAvailable() ? TextStyle.WINDOW : TextStyle.SHADOW_TEXT, + item: "candy", + itemArgs: this.isSameSpeciesEggAvailable() ? starterColors[this.starterId] : [ "808080", "808080" ] + }); + options.push({ + label: i18next.t("menu:cancel"), + handler: () => { + ui.setMode(Mode.POKEDEX_PAGE, "refresh"); + return true; + } + }); + ui.setModeWithoutClear(Mode.OPTION_SELECT, { + options: options, + yOffset: 47 + }); + success = true; + } + break; + case Button.CYCLE_ABILITY: + this.showBackSprite = !this.showBackSprite; + if (this.showBackSprite) { + this.showBackSpriteLabel.setText(i18next.t("pokedexUiHandler:showFrontSprite")); + } else { + this.showBackSpriteLabel.setText(i18next.t("pokedexUiHandler:showBackSprite")); + } + this.setSpeciesDetails(this.species, {}, true); + success = true; + break; + case Button.UP: + if (this.cursor) { + success = this.setCursor(this.cursor - 1); + } else { + success = this.setCursor(this.menuOptions.length - 1); + } + break; + case Button.DOWN: + if (this.cursor + 1 < this.menuOptions.length) { + success = this.setCursor(this.cursor + 1); + } else { + success = this.setCursor(0); + } + break; + case Button.LEFT: + this.blockInput = true; + ui.setModeWithoutClear(Mode.OPTION_SELECT).then(() => { + const index = allSpecies.findIndex(species => species.speciesId === this.species.speciesId); + const newIndex = index <= 0 ? allSpecies.length - 1 : index - 1; + const newSpecies = allSpecies[newIndex]; + const matchingForm = newSpecies?.forms.find(form => form.formKey === this.species?.forms[this.formIndex]?.formKey); + const newFormIndex = matchingForm ? matchingForm.formIndex : 0; + this.starterAttributes.form = newFormIndex; + this.savedStarterAttributes.form = newFormIndex; + this.moveInfoOverlay.clear(); + this.clearText(); + ui.setModeForceTransition(Mode.POKEDEX_PAGE, newSpecies, newFormIndex, this.savedStarterAttributes); + }); + this.blockInput = false; + break; + case Button.RIGHT: + ui.setModeWithoutClear(Mode.OPTION_SELECT).then(() => { + const index = allSpecies.findIndex(species => species.speciesId === this.species.speciesId); + const newIndex = index >= allSpecies.length - 1 ? 0 : index + 1; + const newSpecies = allSpecies[newIndex]; + const matchingForm = newSpecies?.forms.find(form => form.formKey === this.species?.forms[this.formIndex]?.formKey); + const newFormIndex = matchingForm ? matchingForm.formIndex : 0; + this.starterAttributes.form = newFormIndex; + this.savedStarterAttributes.form = newFormIndex; + this.moveInfoOverlay.clear(); + this.clearText(); + ui.setModeForceTransition(Mode.POKEDEX_PAGE, newSpecies, newFormIndex, this.savedStarterAttributes); + }); + break; + } + } + } + + if (success) { + ui.playSelect(); + } else if (error) { + ui.playError(); + } + + return success || error; + } + + updateButtonIcon(iconSetting, gamepadType, iconElement, controlLabel): void { + let iconPath; + // touch controls cannot be rebound as is, and are just emulating a keyboard event. + // Additionally, since keyboard controls can be rebound (and will be displayed when they are), we need to have special handling for the touch controls + if (gamepadType === "touch") { + gamepadType = "keyboard"; + switch (iconSetting) { + case SettingKeyboard.Button_Cycle_Shiny: + iconPath = "R.png"; + break; + case SettingKeyboard.Button_Cycle_Form: + iconPath = "F.png"; + break; + case SettingKeyboard.Button_Cycle_Gender: + iconPath = "G.png"; + break; + case SettingKeyboard.Button_Cycle_Ability: + iconPath = "E.png"; + break; + default: + break; + } + } else { + iconPath = globalScene.inputController?.getIconForLatestInputRecorded(iconSetting); + } + iconElement.setTexture(gamepadType, iconPath); + iconElement.setPosition(this.instructionRowX, this.instructionRowY); + controlLabel.setPosition(this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY); + iconElement.setVisible(true); + controlLabel.setVisible(true); + this.instructionsContainer.add([ iconElement, controlLabel ]); + this.instructionRowY += 8; + if (this.instructionRowY >= 24) { + this.instructionRowY = 8; + this.instructionRowX += 50; + } + } + + updateInstructions(): void { + this.instructionRowX = 0; + this.instructionRowY = 0; + this.filterInstructionRowX = 0; + this.filterInstructionRowY = 0; + this.hideInstructions(); + this.instructionsContainer.removeAll(); + this.filterInstructionsContainer.removeAll(); + let gamepadType; + if (globalScene.inputMethod === "gamepad") { + gamepadType = globalScene.inputController.getConfig(globalScene.inputController.selectedDevice[Device.GAMEPAD]).padType; + } else { + gamepadType = globalScene.inputMethod; + } + + if (!gamepadType) { + return; + } + + const isFormCaught = this.isFormCaught(); + + if (this.isCaught()) { + if (isFormCaught) { + this.updateButtonIcon(SettingKeyboard.Button_Stats, gamepadType, this.candyUpgradeIconElement, this.candyUpgradeLabel); + if (this.canCycleShiny) { + this.updateButtonIcon(SettingKeyboard.Button_Cycle_Shiny, gamepadType, this.shinyIconElement, this.shinyLabel); + } + if (this.canCycleGender) { + this.updateButtonIcon(SettingKeyboard.Button_Cycle_Gender, gamepadType, this.genderIconElement, this.genderLabel); + } + } else { + // Making space for "Uncaught" text + this.instructionRowY += 8; + } + if (this.canCycleForm) { + this.updateButtonIcon(SettingKeyboard.Button_Cycle_Form, gamepadType, this.formIconElement, this.formLabel); + } + } + } + + getValueLimit(): number { + const valueLimit = new NumberHolder(0); + switch (globalScene.gameMode.modeId) { + case GameModes.ENDLESS: + case GameModes.SPLICED_ENDLESS: + valueLimit.value = 15; + break; + default: + valueLimit.value = 10; + } + + Challenge.applyChallenges(globalScene.gameMode, Challenge.ChallengeType.STARTER_POINTS, valueLimit); + + return valueLimit.value; + } + + + setCursor(cursor: number): boolean { + const ret = super.setCursor(cursor); + + if (!this.cursorObj) { + this.cursorObj = globalScene.add.image(0, 0, "cursor"); + this.cursorObj.setOrigin(0, 0); + this.menuContainer.add(this.cursorObj); + } + + this.cursorObj.setScale(this.scale * 6); + this.cursorObj.setPositionRelative(this.menuBg, 7, 6 + (18 + this.cursor * 96) * this.scale); + + const ui = this.getUi(); + + const isFormCaught = this.isFormCaught(); + + if ((this.isCaught() && isFormCaught) || (this.speciesStarterDexEntry?.seenAttr && cursor === 5)) { + ui.showText(this.menuDescriptions[cursor]); + } else { + ui.showText(""); + } + + return ret; + } + + getFriendship(speciesId: number) { + let currentFriendship = globalScene.gameData.starterData[this.starterId].friendship; + if (!currentFriendship || currentFriendship === undefined) { + currentFriendship = 0; + } + + const friendshipCap = getStarterValueFriendshipCap(speciesStarterCosts[this.starterId]); + + return { currentFriendship, friendshipCap }; + } + + /** + * Determines if a passive upgrade is available for the current species + * @returns true if the user has enough candies and a passive has not been unlocked already + */ + isPassiveAvailable(): boolean { + // Get this species ID's starter data + const starterData = globalScene.gameData.starterData[this.starterId]; + + return starterData.candyCount >= getPassiveCandyCount(speciesStarterCosts[this.starterId]) + && !(starterData.passiveAttr & PassiveAttr.UNLOCKED); + } + + /** + * Determines if a value reduction upgrade is available for the current species + * @returns true if the user has enough candies and all value reductions have not been unlocked already + */ + isValueReductionAvailable(): boolean { + // Get this species ID's starter data + const starterData = globalScene.gameData.starterData[this.starterId]; + + return starterData.candyCount >= getValueReductionCandyCounts(speciesStarterCosts[this.starterId])[starterData.valueReduction] + && starterData.valueReduction < valueReductionMax; + } + + /** + * Determines if an same species egg can be bought for the current species + * @returns true if the user has enough candies + */ + isSameSpeciesEggAvailable(): boolean { + // Get this species ID's starter data + const starterData = globalScene.gameData.starterData[this.starterId]; + + return starterData.candyCount >= getSameSpeciesEggCandyCounts(speciesStarterCosts[this.starterId]); + } + + setSpecies() { + const species = this.species; + const starterAttributes : StarterAttributes | null = species ? { ...this.starterAttributes } : null; + + if (!species && globalScene.ui.getTooltip().visible) { + globalScene.ui.hideTooltip(); + } + + if (this.statsMode) { + if (this.isCaught()) { + this.statsContainer.setVisible(true); + this.showStats(); + } else { + this.statsContainer.setVisible(false); + //@ts-ignore + this.statsContainer.updateIvs(null); // TODO: resolve ts-ignore. what. how? huh? + } + } + + if (species && (this.speciesStarterDexEntry?.seenAttr || this.isCaught())) { + this.pokemonNumberText.setText(padInt(species.speciesId, 4)); + + if (this.isCaught()) { + + const defaultDexAttr = this.getCurrentDexProps(species.speciesId); + // Set default attributes if for some reason starterAttributes does not exist or attributes missing + const props: StarterAttributes = globalScene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); + if (starterAttributes?.variant && !isNaN(starterAttributes.variant)) { + if (props.shiny) { + props.variant = starterAttributes.variant as Variant; + } + } + props.form = starterAttributes?.form ?? props.form; + props.female = starterAttributes?.female ?? props.female; + + this.setSpeciesDetails(species, { + shiny: props.shiny, + formIndex: props.form, + female: props.female, + variant: props.variant ?? 0, + }); + } else { + this.pokemonGrowthRateText.setText(""); + this.pokemonGrowthRateLabelText.setVisible(false); + this.type1Icon.setVisible(true); + this.type2Icon.setVisible(true); + this.pokemonLuckLabelText.setVisible(false); + this.pokemonLuckText.setVisible(false); + this.pokemonShinyIcon.setVisible(false); + this.pokemonUncaughtText.setVisible(true); + this.pokemonCaughtHatchedContainer.setVisible(true); + this.pokemonCandyContainer.setVisible(false); + this.pokemonFormText.setVisible(false); + + const defaultDexAttr = globalScene.gameData.getSpeciesDefaultDexAttr(species, true, true); + const props = globalScene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); + + this.setSpeciesDetails(species, { + shiny: props.shiny, + formIndex: props.formIndex, + female: props.female, + variant: props.variant, + }); + this.pokemonSprite.setTint(0x808080); + } + } else { + this.pokemonNumberText.setText(species ? padInt(species.speciesId, 4) : ""); + this.pokemonNameText.setText(species ? "???" : ""); + this.pokemonGrowthRateText.setText(""); + this.pokemonGrowthRateLabelText.setVisible(false); + this.type1Icon.setVisible(false); + this.type2Icon.setVisible(false); + this.pokemonLuckLabelText.setVisible(false); + this.pokemonLuckText.setVisible(false); + this.pokemonShinyIcon.setVisible(false); + this.pokemonUncaughtText.setVisible(!!species); + this.pokemonCaughtHatchedContainer.setVisible(false); + this.pokemonCandyContainer.setVisible(false); + this.pokemonFormText.setVisible(false); + + this.setSpeciesDetails(species!, { // TODO: is this bang correct? + shiny: false, + formIndex: 0, + female: false, + variant: 0, + }); + this.pokemonSprite.setTint(0x000000); + } + } + + setSpeciesDetails(species: PokemonSpecies, options: SpeciesDetails = {}, forceUpdate?: boolean): void { + let { shiny, formIndex, female, variant } = options; + const oldProps = species ? this.starterAttributes : null; + + // We will only update the sprite if there is a change to form, shiny/variant + // or gender for species with gender sprite differences + const shouldUpdateSprite = (species?.genderDiffs && !isNullOrUndefined(female)) + || !isNullOrUndefined(formIndex) || !isNullOrUndefined(shiny) || !isNullOrUndefined(variant) || forceUpdate; + + if (this.activeTooltip === "CANDY") { + if (this.species && this.pokemonCandyContainer.visible) { + const { currentFriendship, friendshipCap } = this.getFriendship(this.species.speciesId); + globalScene.ui.editTooltip("", `${currentFriendship}/${friendshipCap}`); + } else { + globalScene.ui.hideTooltip(); + } + } + + if (species?.forms?.find(f => f.formKey === "female")) { + if (female !== undefined) { + formIndex = female ? 1 : 0; + } else if (formIndex !== undefined) { + female = formIndex === 1; + } + } + + if (species) { + // Only assign shiny, female, and variant if they are undefined + if (shiny === undefined) { + shiny = oldProps?.shiny ?? false; + } + if (female === undefined) { + female = oldProps?.female ?? false; + } + if (variant === undefined) { + variant = oldProps?.variant ?? 0; + } + if (formIndex === undefined) { + formIndex = oldProps?.form ?? 0; + } + } + + this.pokemonSprite.setVisible(false); + + if (this.assetLoadCancelled) { + this.assetLoadCancelled.value = true; + this.assetLoadCancelled = null; + } + + if (species) { + const dexEntry = globalScene.gameData.dexData[species.speciesId]; + + const caughtAttr = this.isCaught(species); + + if (!caughtAttr) { + const props = this.starterAttributes; + + if (shiny === undefined || shiny !== props.shiny) { + shiny = props.shiny; + } + if (formIndex === undefined || formIndex !== props.form) { + formIndex = props.form; + } + if (female === undefined || female !== props.female) { + female = props.female; + } + if (variant === undefined || variant !== props.variant) { + variant = props.variant; + } + } + + const isFormCaught = this.isFormCaught(); + const isFormSeen = dexEntry ? (dexEntry.seenAttr & globalScene.gameData.getFormAttr(formIndex ?? 0)) > 0n : false; + + this.shinyOverlay.setVisible(shiny ?? false); // TODO: is false the correct default? + this.pokemonNumberText.setColor(this.getTextColor(shiny ? TextStyle.SUMMARY_GOLD : TextStyle.SUMMARY, false)); + this.pokemonNumberText.setShadowColor(this.getTextColor(shiny ? TextStyle.SUMMARY_GOLD : TextStyle.SUMMARY, true)); + + const assetLoadCancelled = new BooleanHolder(false); + this.assetLoadCancelled = assetLoadCancelled; + + if (shouldUpdateSprite) { + const back = this.showBackSprite ? true : false; + species.loadAssets(female!, formIndex, shiny, variant as Variant, true, back).then(() => { // TODO: is this bang correct? + if (assetLoadCancelled.value) { + return; + } + this.assetLoadCancelled = null; + this.speciesLoaded.set(species.speciesId, true); + this.pokemonSprite.play(species.getSpriteKey(female!, formIndex, shiny, variant, back)); // TODO: is this bang correct? + this.pokemonSprite.setPipelineData("shiny", shiny); + this.pokemonSprite.setPipelineData("variant", variant); + this.pokemonSprite.setPipelineData("spriteKey", species.getSpriteKey(female!, formIndex, shiny, variant, back)); // TODO: is this bang correct? + this.pokemonSprite.setVisible(!this.statsMode); + }); + } else { + this.pokemonSprite.setVisible(!this.statsMode); + } + + const isNonShinyCaught = !!(caughtAttr & DexAttr.NON_SHINY); + const isShinyCaught = !!(caughtAttr & DexAttr.SHINY); + + this.canCycleShiny = isNonShinyCaught && isShinyCaught; + + const isMaleCaught = !!(caughtAttr & DexAttr.MALE); + const isFemaleCaught = !!(caughtAttr & DexAttr.FEMALE); + this.canCycleGender = isMaleCaught && isFemaleCaught; + + // If the dev option for the dex is selected, all forms can be cycled through + this.canCycleForm = globalScene.dexForDevs ? species.forms.length > 1 : + species.forms.filter(f => f.isStarterSelectable).filter(f => f).length > 1; + + if (caughtAttr && species.malePercent !== null) { + const gender = !female ? Gender.MALE : Gender.FEMALE; + this.pokemonGenderText.setText(getGenderSymbol(gender)); + this.pokemonGenderText.setColor(getGenderColor(gender)); + this.pokemonGenderText.setShadowColor(getGenderColor(gender, true)); + } else { + this.pokemonGenderText.setText(""); + } + + // Setting the name + if (isFormCaught || isFormSeen) { + this.pokemonNameText.setText(species.name); + } else { + this.pokemonNameText.setText(species ? "???" : ""); + } + + // Setting tint of the sprite + if (isFormCaught) { + this.species.loadAssets(female!, formIndex, shiny, variant as Variant, true).then(() => { + const crier = (this.species.forms && this.species.forms.length > 0) ? this.species.forms[formIndex ?? this.formIndex] : this.species; + crier.cry(); + }); + this.pokemonSprite.clearTint(); + } else if (isFormSeen) { + this.pokemonSprite.setTint(0x808080); + } else { + this.pokemonSprite.setTint(0); + } + + // Setting luck text and sparks + if (isFormCaught) { + const luck = globalScene.gameData.getDexAttrLuck(this.isCaught()); + this.pokemonLuckText.setVisible(!!luck); + this.pokemonLuckText.setText(luck.toString()); + this.pokemonLuckText.setTint(getVariantTint(Math.min(luck - 1, 2) as Variant)); + this.pokemonLuckLabelText.setVisible(this.pokemonLuckText.visible); + } else { + this.pokemonLuckText.setVisible(false); + this.pokemonLuckLabelText.setVisible(false); + } + + // Setting growth rate text + if (isFormCaught) { + let growthReadable = toReadableString(GrowthRate[species.growthRate]); + const growthAux = growthReadable.replace(" ", "_"); + if (i18next.exists("growth:" + growthAux)) { + growthReadable = i18next.t("growth:" + growthAux as any); + } + this.pokemonGrowthRateText.setText(growthReadable); + + this.pokemonGrowthRateText.setColor(getGrowthRateColor(species.growthRate)); + this.pokemonGrowthRateText.setShadowColor(getGrowthRateColor(species.growthRate, true)); + this.pokemonGrowthRateLabelText.setVisible(true); + } else { + this.pokemonGrowthRateText.setText(""); + this.pokemonGrowthRateLabelText.setVisible(false); + } + + // Caught and hatched + if (isFormCaught) { + const colorScheme = starterColors[this.starterId]; + + this.pokemonUncaughtText.setVisible(false); + this.pokemonCaughtCountText.setText(`${this.speciesStarterDexEntry?.caughtCount}`); + if (species.speciesId === Species.MANAPHY || species.speciesId === Species.PHIONE) { + this.pokemonHatchedIcon.setFrame("manaphy"); + } else { + this.pokemonHatchedIcon.setFrame(getEggTierForSpecies(species)); + } + this.pokemonHatchedCountText.setText(`${this.speciesStarterDexEntry?.hatchedCount}`); + + const defaultDexAttr = this.getCurrentDexProps(species.speciesId); + const defaultProps = globalScene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); + const variant = defaultProps.variant; + const tint = getVariantTint(variant); + this.pokemonShinyIcon.setFrame(getVariantIcon(variant)); + this.pokemonShinyIcon.setTint(tint); + this.pokemonShinyIcon.setVisible(defaultProps.shiny); + this.pokemonCaughtHatchedContainer.setVisible(true); + + this.pokemonCaughtHatchedContainer.setY(25); + this.pokemonCandyIcon.setTint(argbFromRgba(rgbHexToRgba(colorScheme[0]))); + this.pokemonCandyOverlayIcon.setTint(argbFromRgba(rgbHexToRgba(colorScheme[1]))); + this.pokemonCandyCountText.setText(`x${globalScene.gameData.starterData[this.starterId].candyCount}`); + this.pokemonCandyContainer.setVisible(true); + + if (pokemonPrevolutions.hasOwnProperty(species.speciesId)) { + this.pokemonShinyIcon.setFrame(getVariantIcon(variant)); + this.pokemonHatchedIcon.setVisible(false); + this.pokemonHatchedCountText.setVisible(false); + this.pokemonFormText.setY(36); + } else { + this.pokemonHatchedIcon.setVisible(true); + this.pokemonHatchedCountText.setVisible(true); + this.pokemonFormText.setY(42); + + const { currentFriendship, friendshipCap } = this.getFriendship(this.species.speciesId); + const candyCropY = 16 - (16 * (currentFriendship / friendshipCap)); + this.pokemonCandyDarknessOverlay.setCrop(0, 0, 16, candyCropY); + + this.pokemonCandyContainer.on("pointerover", () => { + globalScene.ui.showTooltip("", `${currentFriendship}/${friendshipCap}`, true); + this.activeTooltip = "CANDY"; + }); + this.pokemonCandyContainer.on("pointerout", () => { + globalScene.ui.hideTooltip(); + this.activeTooltip = undefined; + }); + + } + } else { + this.pokemonUncaughtText.setVisible(true); + this.pokemonCaughtHatchedContainer.setVisible(false); + this.pokemonCandyContainer.setVisible(false); + this.pokemonShinyIcon.setVisible(false); + } + + // Setting type icons and form text + if (isFormCaught || isFormSeen) { + const speciesForm = getPokemonSpeciesForm(species.speciesId, formIndex!); // TODO: is the bang correct? + this.setTypeIcons(speciesForm.type1, speciesForm.type2); + // TODO: change this once forms are refactored + if (normalForm.includes(species.speciesId) && !formIndex) { + this.pokemonFormText.setText(""); + } else { + this.pokemonFormText.setText(species.getFormNameToDisplay(formIndex)); + } + this.pokemonFormText.setVisible(true); + if (!isFormCaught) { + this.pokemonFormText.setY(18); + } + } else { + this.setTypeIcons(null, null); + this.pokemonFormText.setText(""); + this.pokemonFormText.setVisible(false); + } + } else { + this.shinyOverlay.setVisible(false); + this.pokemonNumberText.setColor(this.getTextColor(TextStyle.SUMMARY)); + this.pokemonNumberText.setShadowColor(this.getTextColor(TextStyle.SUMMARY, true)); + this.pokemonGenderText.setText(""); + this.setTypeIcons(null, null); + } + + this.updateInstructions(); + } + + setTypeIcons(type1: Type | null, type2: Type | null): void { + if (type1 !== null) { + this.type1Icon.setVisible(true); + this.type1Icon.setFrame(Type[type1].toLowerCase()); + } else { + this.type1Icon.setVisible(false); + } + if (type2 !== null) { + this.type2Icon.setVisible(true); + this.type2Icon.setFrame(Type[type2].toLowerCase()); + } else { + this.type2Icon.setVisible(false); + } + } + + + /** + * Creates a temporary dex attr props that will be used to display the correct shiny, variant, and form based on this.starterAttributes + * + * @param speciesId the id of the species to get props for + * @returns the dex props + */ + getCurrentDexProps(speciesId: number): bigint { + let props = 0n; + const species = allSpecies.find(sp => sp.speciesId === speciesId); + const caughtAttr = globalScene.gameData.dexData[speciesId].caughtAttr & globalScene.gameData.dexData[this.getStarterSpeciesId(speciesId)].caughtAttr & (species?.getFullUnlocksData() ?? 0n); + + /* this checks the gender of the pokemon; this works by checking a) that the starter preferences for the species exist, and if so, is it female. If so, it'll add DexAttr.FEMALE to our temp props + * It then checks b) if the caughtAttr for the pokemon is female and NOT male - this means that the ONLY gender we've gotten is female, and we need to add DexAttr.FEMALE to our temp props + * If neither of these pass, we add DexAttr.MALE to our temp props + */ + if (this.starterAttributes?.female || ((caughtAttr & DexAttr.FEMALE) > 0n && (caughtAttr & DexAttr.MALE) === 0n)) { + props += DexAttr.FEMALE; + } else { + props += DexAttr.MALE; + } + /* This part is very similar to above, but instead of for gender, it checks for shiny within starter preferences. + * If they're not there, it enables shiny state by default if any shiny was caught + */ + if (this.starterAttributes?.shiny || ((caughtAttr & DexAttr.SHINY) > 0n && this.starterAttributes?.shiny !== false)) { + props += DexAttr.SHINY; + if (this.starterAttributes?.variant !== undefined) { + props += BigInt(Math.pow(2, this.starterAttributes?.variant)) * DexAttr.DEFAULT_VARIANT; + } else { + /* This calculates the correct variant if there's no starter preferences for it. + * This gets the highest tier variant that you've caught and adds it to the temp props + */ + if ((caughtAttr & DexAttr.VARIANT_3) > 0) { + props += DexAttr.VARIANT_3; + } else if ((caughtAttr & DexAttr.VARIANT_2) > 0) { + props += DexAttr.VARIANT_2; + } else { + props += DexAttr.DEFAULT_VARIANT; + } + } + } else { + props += DexAttr.NON_SHINY; + props += DexAttr.DEFAULT_VARIANT; // we add the default variant here because non shiny versions are listed as default variant + } + if (this.starterAttributes?.form) { // this checks for the form of the pokemon + props += BigInt(Math.pow(2, this.starterAttributes?.form)) * DexAttr.DEFAULT_FORM; + } else { + // Get the first unlocked form + props += globalScene.gameData.getFormAttr(globalScene.gameData.getFormIndex(caughtAttr)); + } + + return props; + } + + toggleStatsMode(on?: boolean): void { + if (on === undefined) { + on = !this.statsMode; + } + if (on) { + this.showStats(); + this.statsMode = true; + this.pokemonSprite.setVisible(false); + } else { + this.statsMode = false; + this.statsContainer.setVisible(false); + this.pokemonSprite.setVisible(true); + //@ts-ignore + this.statsContainer.updateIvs(null); // TODO: resolve ts-ignore. !?!? + } + } + + showStats(): void { + if (!this.speciesStarterDexEntry) { + return; + } + + this.statsContainer.setVisible(true); + + this.statsContainer.updateIvs(this.speciesStarterDexEntry.ivs); + } + + clearText() { + this.starterSelectMessageBoxContainer.setVisible(false); + super.clearText(); + } + + hideInstructions(): void { + this.candyUpgradeIconElement.setVisible(false); + this.candyUpgradeLabel.setVisible(false); + this.shinyIconElement.setVisible(false); + this.shinyLabel.setVisible(false); + this.formIconElement.setVisible(false); + this.formLabel.setVisible(false); + this.genderIconElement.setVisible(false); + this.genderLabel.setVisible(false); + this.variantIconElement.setVisible(false); + this.variantLabel.setVisible(false); + } + + clear(): void { + super.clear(); + + this.cursor = -1; + this.hideInstructions(); + this.activeTooltip = undefined; + globalScene.ui.hideTooltip(); + + this.starterSelectContainer.setVisible(false); + this.blockInput = false; + + this.showBackSprite = false; + this.showBackSpriteLabel.setText(i18next.t("pokedexUiHandler:showBackSprite")); + + if (this.statsMode) { + this.toggleStatsMode(false); + } + } + + checkIconId(icon: Phaser.GameObjects.Sprite, species: PokemonSpecies, female: boolean, formIndex: number, shiny: boolean, variant: number) { + if (icon.frame.name !== species.getIconId(female, formIndex, shiny, variant)) { + console.log(`${species.name}'s icon ${icon.frame.name} does not match getIconId with female: ${female}, formIndex: ${formIndex}, shiny: ${shiny}, variant: ${variant}`); + icon.setTexture(species.getIconAtlasKey(formIndex, false, variant)); + icon.setFrame(species.getIconId(female, formIndex, false, variant)); + } + } +} diff --git a/src/ui/pokedex-scan-ui-handler.ts b/src/ui/pokedex-scan-ui-handler.ts new file mode 100644 index 00000000000..3920c866486 --- /dev/null +++ b/src/ui/pokedex-scan-ui-handler.ts @@ -0,0 +1,196 @@ +import type { InputFieldConfig } from "./form-modal-ui-handler"; +import { FormModalUiHandler } from "./form-modal-ui-handler"; +import type { ModalConfig } from "./modal-ui-handler"; +import type { PlayerPokemon } from "#app/field/pokemon"; +import type { OptionSelectItem } from "./abstact-option-select-ui-handler"; +import { isNullOrUndefined } from "#app/utils"; +import { Mode } from "./ui"; +import { FilterTextRow } from "./filter-text"; +import { allAbilities } from "#app/data/ability"; +import { allMoves } from "#app/data/move"; +import { allSpecies } from "#app/data/pokemon-species"; +import i18next from "i18next"; + +export default class PokedexScanUiHandler extends FormModalUiHandler { + + keys: string[]; + reducedKeys: string[]; + parallelKeys: string[]; + nameKeys: string[]; + moveKeys: string[]; + abilityKeys: string[]; + row: number; + + constructor(mode) { + super(mode); + } + + setup() { + super.setup(); + + this.nameKeys = allSpecies.map(a => a.name).filter((value, index, self) => self.indexOf(value) === index); + this.moveKeys = allMoves.map(a => a.name); + this.abilityKeys = allAbilities.map(a => a.name); + } + + getModalTitle(config?: ModalConfig): string { + return i18next.t("pokedexUiHandler:scanChooseOption"); + } + + getWidth(config?: ModalConfig): number { + return 300; + } + + getMargin(config?: ModalConfig): [number, number, number, number] { + return [ 0, 0, 48, 0 ]; + } + + getButtonLabels(config?: ModalConfig): string[] { + return [ i18next.t("pokedexUiHandler:scanSelect"), i18next.t("pokedexUiHandler:scanCancel") ]; + } + + getReadableErrorMessage(error: string): string { + const colonIndex = error?.indexOf(":"); + if (colonIndex > 0) { + error = error.slice(0, colonIndex); + } + + return super.getReadableErrorMessage(error); + } + + override getInputFieldConfigs(): InputFieldConfig[] { + switch (this.row) { + case FilterTextRow.NAME: { + return [{ label: i18next.t("pokedexUiHandler:scanLabelName") }]; + } + case FilterTextRow.MOVE_1: + case FilterTextRow.MOVE_2: { + return [{ label: i18next.t("pokedexUiHandler:scanLabelMove") }]; + } + case FilterTextRow.ABILITY_1:{ + return [{ label: i18next.t("pokedexUiHandler:scanLabelAbility") }]; + } + case FilterTextRow.ABILITY_2: { + return [{ label: i18next.t("pokedexUiHandler:scanLabelPassive") }]; + } + default: { + return [{ label: "" }]; + } + } + + } + + reduceKeys(): void { + switch (this.row) { + case FilterTextRow.NAME: { + this.reducedKeys = this.nameKeys; + break; + } + case FilterTextRow.MOVE_1: + case FilterTextRow.MOVE_2: { + this.reducedKeys = this.moveKeys; + break; + } + case FilterTextRow.ABILITY_1: + case FilterTextRow.ABILITY_2: { + this.reducedKeys = this.abilityKeys; + break; + } + default: { + this.reducedKeys = this.keys; + } + } + } + + + // args[2] is an index of FilterTextRow + show(args: any[]): boolean { + this.row = args[2]; + const ui = this.getUi(); + const hasTitle = !!this.getModalTitle(); + this.updateFields(this.getInputFieldConfigs(), hasTitle); + this.updateContainer(args[0] as ModalConfig); + const input = this.inputs[0]; + input.setMaxLength(255); + + this.reduceKeys(); + + setTimeout(() => { + input.setFocus(); // Focus after a short delay to avoid unwanted input + }, 50); + + input.on("keydown", (inputObject, evt: KeyboardEvent) => { + if ([ "escape", "space" ].some((v) => v === evt.key.toLowerCase() || v === evt.code.toLowerCase()) && ui.getMode() === Mode.AUTO_COMPLETE) { + // Delete autocomplete list and recovery focus. + inputObject.on("blur", () => inputObject.node.focus(), { once: true }); + ui.revertMode(); + } + }); + + input.on("textchange", (inputObject, evt: InputEvent) => { + // Delete autocomplete. + if (ui.getMode() === Mode.AUTO_COMPLETE) { + ui.revertMode(); + } + + let options: OptionSelectItem[] = []; + const filteredKeys = this.reducedKeys.filter((command) => command.toLowerCase().includes(inputObject.text.toLowerCase())); + if (inputObject.text !== "" && filteredKeys.length > 0) { + options = filteredKeys.slice(0).map((value) => { + return { + label: value, + handler: () => { + if (!isNullOrUndefined(evt.data) || evt.inputType?.toLowerCase() === "deletecontentbackward") { + inputObject.setText(value); + } + ui.revertMode(); + return true; + } + }; + }); + } + + if (options.length > 0) { + const modalOpts = { + options: options, + maxOptions: 5, + modalContainer: this.modalContainer + }; + ui.setOverlayMode(Mode.AUTO_COMPLETE, modalOpts); + } + + }); + + if (super.show(args)) { + const config = args[0] as ModalConfig; + this.inputs[0].resize(1150, 116); + this.inputContainers[0].list[0].width = 200; + if (args[1] && typeof (args[1] as PlayerPokemon).getNameToRender === "function") { + this.inputs[0].text = (args[1] as PlayerPokemon).getNameToRender(); + } else { + this.inputs[0].text = args[1]; + } + this.submitAction = (_) => { + if (ui.getMode() === Mode.POKEDEX_SCAN) { + this.sanitizeInputs(); + const outputName = this.reducedKeys.includes(this.inputs[0].text) ? this.inputs[0].text : ""; + const sanitizedName = btoa(unescape(encodeURIComponent(outputName))); + config.buttonActions[0](sanitizedName); + return true; + } + return false; + }; + return true; + } + return false; + } + + clear(): void { + super.clear(); + + // Clearing the labels so they don't appear again and overlap + this.formLabels.forEach(label => { + label.destroy(); + }); + } +} diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts new file mode 100644 index 00000000000..5180d7bd956 --- /dev/null +++ b/src/ui/pokedex-ui-handler.ts @@ -0,0 +1,2142 @@ +import type { Variant } from "#app/data/variant"; +import { getVariantTint, getVariantIcon } from "#app/data/variant"; +import { argbFromRgba } from "@material/material-color-utilities"; +import i18next from "i18next"; +import { starterColors } from "#app/battle-scene"; +import { speciesEggMoves } from "#app/data/balance/egg-moves"; +import { pokemonFormLevelMoves, pokemonSpeciesLevelMoves } from "#app/data/balance/pokemon-level-moves"; +import type { PokemonForm } from "#app/data/pokemon-species"; +import type PokemonSpecies from "#app/data/pokemon-species"; +import { allSpecies, getPokemonSpeciesForm, getPokerusStarters, normalForm } from "#app/data/pokemon-species"; +import { getStarterValueFriendshipCap, speciesStarterCosts, POKERUS_STARTER_COUNT } from "#app/data/balance/starters"; +import { catchableSpecies } from "#app/data/balance/biomes"; +import { Type } from "#enums/type"; +import type { DexAttrProps, DexEntry, StarterAttributes, StarterPreferences } from "#app/system/game-data"; +import { AbilityAttr, DexAttr, StarterPrefs } from "#app/system/game-data"; +import MessageUiHandler from "#app/ui/message-ui-handler"; +import PokemonIconAnimHandler, { PokemonIconAnimMode } from "#app/ui/pokemon-icon-anim-handler"; +import { TextStyle, addTextObject } from "#app/ui/text"; +import { Mode } from "#app/ui/ui"; +import { SettingKeyboard } from "#app/system/settings/settings-keyboard"; +import { Passive as PassiveAttr } from "#enums/passive"; +import type { Species } from "#enums/species"; +import { Button } from "#enums/buttons"; +import { DropDown, DropDownLabel, DropDownOption, DropDownState, DropDownType, SortCriteria } from "#app/ui/dropdown"; +import { PokedexMonContainer } from "#app/ui/pokedex-mon-container"; +import { DropDownColumn, FilterBar } from "#app/ui/filter-bar"; +import { ScrollBar } from "#app/ui/scroll-bar"; +import { Abilities } from "#enums/abilities"; +import { getPassiveCandyCount, getValueReductionCandyCounts, getSameSpeciesEggCandyCounts } from "#app/data/balance/starters"; +import { BooleanHolder, fixedInt, getLocalizedSpriteKey, padInt, randIntRange, rgbHexToRgba } from "#app/utils"; +import type { Nature } from "#enums/nature"; +import { addWindow } from "./ui-theme"; +import type { OptionSelectConfig } from "./abstact-option-select-ui-handler"; +import { FilterText, FilterTextRow } from "./filter-text"; +import { allAbilities } from "#app/data/ability"; +import type { PassiveAbilities } from "#app/data/balance/passives"; +import { starterPassiveAbilities } from "#app/data/balance/passives"; +import { allMoves } from "#app/data/move"; +import { speciesTmMoves } from "#app/data/balance/tms"; +import { pokemonStarters } from "#app/data/balance/pokemon-evolutions"; +import { Biome } from "#enums/biome"; +import { globalScene } from "#app/global-scene"; + +interface LanguageSetting { + starterInfoTextSize: string, + instructionTextSize: string, + starterInfoXPos?: number, + starterInfoYOffset?: number +} + +const languageSettings: { [key: string]: LanguageSetting } = { + "en":{ + starterInfoTextSize: "56px", + instructionTextSize: "38px", + }, + "de":{ + starterInfoTextSize: "48px", + instructionTextSize: "35px", + starterInfoXPos: 33, + }, + "es-ES":{ + starterInfoTextSize: "56px", + instructionTextSize: "35px", + }, + "fr":{ + starterInfoTextSize: "54px", + instructionTextSize: "38px", + }, + "it":{ + starterInfoTextSize: "56px", + instructionTextSize: "38px", + }, + "pt_BR":{ + starterInfoTextSize: "47px", + instructionTextSize: "38px", + starterInfoXPos: 33, + }, + "zh":{ + starterInfoTextSize: "47px", + instructionTextSize: "38px", + starterInfoYOffset: 1, + starterInfoXPos: 24, + }, + "pt":{ + starterInfoTextSize: "48px", + instructionTextSize: "42px", + starterInfoXPos: 33, + }, + "ko":{ + starterInfoTextSize: "52px", + instructionTextSize: "38px", + }, + "ja":{ + starterInfoTextSize: "51px", + instructionTextSize: "38px", + }, + "ca-ES":{ + starterInfoTextSize: "56px", + instructionTextSize: "38px", + }, +}; + + +enum FilterTextOptions{ + NAME, + MOVE_1, + MOVE_2, + ABILITY_1, + ABILITY_2, +} + + +const valueReductionMax = 2; + +// Position of UI elements +const filterBarHeight = 17; +const speciesContainerX = 143; + +/** + * Calculates the starter position for a Pokemon of a given UI index + * @param index UI index to calculate the starter position of + * @returns An interface with an x and y property + */ +function calcStarterPosition(index: number, scrollCursor:number = 0): {x: number, y: number} { + const yOffset = 13; + const height = 17; + const x = (index % 9) * 18; + const y = yOffset + (Math.floor(index / 9) - scrollCursor) * height; + + return { x: x, y: y }; +} + +interface SpeciesDetails { + shiny?: boolean, + formIndex?: number + female?: boolean, + variant?: Variant, + abilityIndex?: number, + natureIndex?: number, +} + +export default class PokedexUiHandler extends MessageUiHandler { + private starterSelectContainer: Phaser.GameObjects.Container; + private starterSelectScrollBar: ScrollBar; + private filterBarContainer: Phaser.GameObjects.Container; + private filterBar: FilterBar; + private pokemonContainers: PokedexMonContainer[] = []; + private filteredPokemonContainers: PokedexMonContainer[] = []; + private validPokemonContainers: PokedexMonContainer[] = []; + private pokemonNumberText: Phaser.GameObjects.Text; + private pokemonSprite: Phaser.GameObjects.Sprite; + private pokemonNameText: Phaser.GameObjects.Text; + private pokemonFormText: Phaser.GameObjects.Text; + private type1Icon: Phaser.GameObjects.Sprite; + private type2Icon: Phaser.GameObjects.Sprite; + + private starterSelectMessageBox: Phaser.GameObjects.NineSlice; + private starterSelectMessageBoxContainer: Phaser.GameObjects.Container; + + private filterMode: boolean; + private filterBarCursor: number = 0; + private scrollCursor: number; + + private allSpecies: PokemonSpecies[] = []; + private lastSpecies: PokemonSpecies; + private speciesLoaded: Map = new Map(); + private pokerusSpecies: PokemonSpecies[] = []; + private speciesStarterDexEntry: DexEntry | null; + + private assetLoadCancelled: BooleanHolder | null; + public cursorObj: Phaser.GameObjects.Image; + private pokerusCursorObjs: Phaser.GameObjects.Image[]; + + private iconAnimHandler: PokemonIconAnimHandler; + + private starterPreferences: StarterPreferences; + + protected blockInput: boolean = false; + + // for text filters + private readonly textPadding = 8; + private readonly defaultMessageBoxWidth = 220; + private readonly defaultWordWrapWidth = 1224; + private menuMessageBoxContainer: Phaser.GameObjects.Container; + private menuMessageBox: Phaser.GameObjects.NineSlice; + private dialogueMessageBox: Phaser.GameObjects.NineSlice; + protected manageDataConfig: OptionSelectConfig; + private filterTextOptions: FilterTextOptions[]; + protected optionSelectText: Phaser.GameObjects.Text; + protected scale: number = 0.1666666667; + private menuBg: Phaser.GameObjects.NineSlice; + + private filterTextContainer: Phaser.GameObjects.Container; + private filterText: FilterText; + private filterTextMode: boolean; + private filterTextCursor: number = 0; + + private showDecorations: boolean = false; + private goFilterIconElement1: Phaser.GameObjects.Sprite; + private goFilterIconElement2: Phaser.GameObjects.Sprite; + private goFilterLabel: Phaser.GameObjects.Text; + private toggleDecorationsIconElement: Phaser.GameObjects.Sprite; + private toggleDecorationsLabel: Phaser.GameObjects.Text; + + private formTrayContainer: Phaser.GameObjects.Container; + private trayBg: Phaser.GameObjects.NineSlice; + private trayForms: PokemonForm[]; + private trayContainers: PokedexMonContainer[] = []; + private trayNumIcons: number; + private trayRows: number; + private trayColumns: number; + private trayCursorObj: Phaser.GameObjects.Image; + private trayCursor: number = 0; + private showingTray: boolean = false; + private showFormTrayIconElement: Phaser.GameObjects.Sprite; + private showFormTrayLabel: Phaser.GameObjects.Text; + private canShowFormTray: boolean; + + constructor() { + super(Mode.POKEDEX); + } + + setup() { + const ui = this.getUi(); + const currentLanguage = i18next.resolvedLanguage ?? "en"; + const langSettingKey = Object.keys(languageSettings).find(lang => currentLanguage.includes(lang)) ?? "en"; + const textSettings = languageSettings[langSettingKey]; + + this.starterSelectContainer = globalScene.add.container(0, -globalScene.game.canvas.height / 6); + this.starterSelectContainer.setVisible(false); + ui.add(this.starterSelectContainer); + + const bgColor = globalScene.add.rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6, 0x006860); + bgColor.setOrigin(0, 0); + this.starterSelectContainer.add(bgColor); + + const pokemonContainerWindow = addWindow(speciesContainerX, filterBarHeight + 1, 175, 161); + const pokemonContainerBg = globalScene.add.image(speciesContainerX + 1, filterBarHeight + 2, "starter_container_bg"); + pokemonContainerBg.setOrigin(0, 0); + this.starterSelectContainer.add(pokemonContainerBg); + this.starterSelectContainer.add(pokemonContainerWindow); + + + // Create and initialise filter text fields + this.filterTextContainer = globalScene.add.container(0, 0); + this.filterText = new FilterText(1, filterBarHeight + 2, 140, 100, this.updateStarters); + + this.filterText.addFilter(FilterTextRow.NAME, i18next.t("filterText:nameField")); + this.filterText.addFilter(FilterTextRow.MOVE_1, i18next.t("filterText:move1Field")); + this.filterText.addFilter(FilterTextRow.MOVE_2, i18next.t("filterText:move2Field")); + this.filterText.addFilter(FilterTextRow.ABILITY_1, i18next.t("filterText:ability1Field")); + this.filterText.addFilter(FilterTextRow.ABILITY_2, i18next.t("filterText:ability2Field")); + + this.filterTextContainer.add(this.filterText); + this.starterSelectContainer.add(this.filterTextContainer); + + + // Create and initialise filter bar + this.filterBarContainer = globalScene.add.container(0, 0); + this.filterBar = new FilterBar(speciesContainerX, 1, 175, filterBarHeight, 2, 0, 6); + + // gen filter + const genOptions: DropDownOption[] = [ + new DropDownOption(1, new DropDownLabel(i18next.t("pokedexUiHandler:gen1"))), + new DropDownOption(2, new DropDownLabel(i18next.t("pokedexUiHandler:gen2"))), + new DropDownOption(3, new DropDownLabel(i18next.t("pokedexUiHandler:gen3"))), + new DropDownOption(4, new DropDownLabel(i18next.t("pokedexUiHandler:gen4"))), + new DropDownOption(5, new DropDownLabel(i18next.t("pokedexUiHandler:gen5"))), + new DropDownOption(6, new DropDownLabel(i18next.t("pokedexUiHandler:gen6"))), + new DropDownOption(7, new DropDownLabel(i18next.t("pokedexUiHandler:gen7"))), + new DropDownOption(8, new DropDownLabel(i18next.t("pokedexUiHandler:gen8"))), + new DropDownOption(9, new DropDownLabel(i18next.t("pokedexUiHandler:gen9"))), + ]; + const genDropDown: DropDown = new DropDown(0, 0, genOptions, this.updateStarters, DropDownType.HYBRID); + this.filterBar.addFilter(DropDownColumn.GEN, i18next.t("filterBar:genFilter"), genDropDown); + + // type filter + const typeKeys = Object.keys(Type).filter(v => isNaN(Number(v))); + const typeOptions: DropDownOption[] = []; + typeKeys.forEach((type, index) => { + if (index === 0 || index === 19) { + return; + } + const typeSprite = globalScene.add.sprite(0, 0, getLocalizedSpriteKey("types")); + typeSprite.setScale(0.5); + typeSprite.setFrame(type.toLowerCase()); + typeOptions.push(new DropDownOption( index, new DropDownLabel("", typeSprite))); + }); + this.filterBar.addFilter(DropDownColumn.TYPES, i18next.t("filterBar:typeFilter"), new DropDown(0, 0, typeOptions, this.updateStarters, DropDownType.HYBRID, 0.5)); + + // biome filter, making an entry in the dropdown for each biome + const biomeOptions = Object.values(Biome) + .filter((value) => typeof value === "number") // Filter numeric values from the enum + .map((biomeValue, index) => + new DropDownOption( index, new DropDownLabel(i18next.t(`biome:${Biome[biomeValue].toUpperCase()}`))) + ); + biomeOptions.push(new DropDownOption( biomeOptions.length, new DropDownLabel(i18next.t("filterBar:uncatchable")))); + const biomeDropDown: DropDown = new DropDown(0, 0, biomeOptions, this.updateStarters, DropDownType.HYBRID); + this.filterBar.addFilter(DropDownColumn.BIOME, i18next.t("filterBar:biomeFilter"), biomeDropDown); + + // caught filter + const shiny1Sprite = globalScene.add.sprite(0, 0, "shiny_icons"); + shiny1Sprite.setOrigin(0.15, 0.2); + shiny1Sprite.setScale(0.6); + shiny1Sprite.setFrame(getVariantIcon(0)); + shiny1Sprite.setTint(getVariantTint(0)); + const shiny2Sprite = globalScene.add.sprite(0, 0, "shiny_icons"); + shiny2Sprite.setOrigin(0.15, 0.2); + shiny2Sprite.setScale(0.6); + shiny2Sprite.setFrame(getVariantIcon(1)); + shiny2Sprite.setTint(getVariantTint(1)); + const shiny3Sprite = globalScene.add.sprite(0, 0, "shiny_icons"); + shiny3Sprite.setOrigin(0.15, 0.2); + shiny3Sprite.setScale(0.6); + shiny3Sprite.setFrame(getVariantIcon(2)); + shiny3Sprite.setTint(getVariantTint(2)); + + const caughtOptions = [ + new DropDownOption("SHINY3", new DropDownLabel("", shiny3Sprite)), + new DropDownOption("SHINY2", new DropDownLabel("", shiny2Sprite)), + new DropDownOption("SHINY", new DropDownLabel("", shiny1Sprite)), + new DropDownOption("NORMAL", new DropDownLabel(i18next.t("filterBar:normal"))), + new DropDownOption("UNCAUGHT", new DropDownLabel(i18next.t("filterBar:uncaught"))) + ]; + + this.filterBar.addFilter(DropDownColumn.CAUGHT, i18next.t("filterBar:caughtFilter"), new DropDown(0, 0, caughtOptions, this.updateStarters, DropDownType.HYBRID)); + + // unlocks filter + const passiveLabels = [ + new DropDownLabel(i18next.t("filterBar:passive"), undefined, DropDownState.OFF), + new DropDownLabel(i18next.t("filterBar:passiveUnlocked"), undefined, DropDownState.ON), + new DropDownLabel(i18next.t("filterBar:passiveUnlockable"), undefined, DropDownState.UNLOCKABLE), + new DropDownLabel(i18next.t("filterBar:passiveLocked"), undefined, DropDownState.EXCLUDE), + ]; + + const costReductionLabels = [ + new DropDownLabel(i18next.t("filterBar:costReduction"), undefined, DropDownState.OFF), + new DropDownLabel(i18next.t("filterBar:costReductionUnlocked"), undefined, DropDownState.ON), + new DropDownLabel(i18next.t("filterBar:costReductionUnlockedOne"), undefined, DropDownState.ONE), + new DropDownLabel(i18next.t("filterBar:costReductionUnlockedTwo"), undefined, DropDownState.TWO), + new DropDownLabel(i18next.t("filterBar:costReductionUnlockable"), undefined, DropDownState.UNLOCKABLE), + new DropDownLabel(i18next.t("filterBar:costReductionLocked"), undefined, DropDownState.EXCLUDE), + ]; + + const unlocksOptions = [ + new DropDownOption("PASSIVE", passiveLabels), + new DropDownOption("COST_REDUCTION", costReductionLabels), + ]; + + this.filterBar.addFilter(DropDownColumn.UNLOCKS, i18next.t("filterBar:unlocksFilter"), new DropDown(0, 0, unlocksOptions, this.updateStarters, DropDownType.RADIAL)); + + // misc filter + const starters = [ + new DropDownLabel(i18next.t("filterBar:starter"), undefined, DropDownState.OFF), + new DropDownLabel(i18next.t("filterBar:isStarter"), undefined, DropDownState.ON), + new DropDownLabel(i18next.t("filterBar:notStarter"), undefined, DropDownState.EXCLUDE), + ]; + const favoriteLabels = [ + new DropDownLabel(i18next.t("filterBar:favorite"), undefined, DropDownState.OFF), + new DropDownLabel(i18next.t("filterBar:isFavorite"), undefined, DropDownState.ON), + new DropDownLabel(i18next.t("filterBar:notFavorite"), undefined, DropDownState.EXCLUDE), + ]; + const winLabels = [ + new DropDownLabel(i18next.t("filterBar:ribbon"), undefined, DropDownState.OFF), + new DropDownLabel(i18next.t("filterBar:hasWon"), undefined, DropDownState.ON), + new DropDownLabel(i18next.t("filterBar:hasNotWon"), undefined, DropDownState.EXCLUDE), + ]; + const hiddenAbilityLabels = [ + new DropDownLabel(i18next.t("filterBar:hiddenAbility"), undefined, DropDownState.OFF), + new DropDownLabel(i18next.t("filterBar:hasHiddenAbility"), undefined, DropDownState.ON), + new DropDownLabel(i18next.t("filterBar:noHiddenAbility"), undefined, DropDownState.EXCLUDE), + ]; + const eggLabels = [ + new DropDownLabel(i18next.t("filterBar:egg"), undefined, DropDownState.OFF), + new DropDownLabel(i18next.t("filterBar:eggPurchasable"), undefined, DropDownState.ON), + ]; + const pokerusLabels = [ + new DropDownLabel(i18next.t("filterBar:pokerus"), undefined, DropDownState.OFF), + new DropDownLabel(i18next.t("filterBar:hasPokerus"), undefined, DropDownState.ON), + ]; + const miscOptions = [ + new DropDownOption("STARTER", starters), + new DropDownOption("FAVORITE", favoriteLabels), + new DropDownOption("WIN", winLabels), + new DropDownOption("HIDDEN_ABILITY", hiddenAbilityLabels), + new DropDownOption("EGG", eggLabels), + new DropDownOption("POKERUS", pokerusLabels), + ]; + this.filterBar.addFilter(DropDownColumn.MISC, i18next.t("filterBar:miscFilter"), new DropDown(0, 0, miscOptions, this.updateStarters, DropDownType.RADIAL)); + + // sort filter + const sortOptions = [ + new DropDownOption(SortCriteria.NUMBER, new DropDownLabel(i18next.t("filterBar:sortByNumber"), undefined, DropDownState.ON)), + new DropDownOption(SortCriteria.COST, new DropDownLabel(i18next.t("filterBar:sortByCost"))), + new DropDownOption(SortCriteria.CANDY, new DropDownLabel(i18next.t("filterBar:sortByCandies"))), + new DropDownOption(SortCriteria.IV, new DropDownLabel(i18next.t("filterBar:sortByIVs"))), + new DropDownOption(SortCriteria.NAME, new DropDownLabel(i18next.t("filterBar:sortByName"))), + new DropDownOption(SortCriteria.CAUGHT, new DropDownLabel(i18next.t("filterBar:sortByNumCaught"))), + new DropDownOption(SortCriteria.HATCHED, new DropDownLabel(i18next.t("filterBar:sortByNumHatched"))) + ]; + this.filterBar.addFilter(DropDownColumn.SORT, i18next.t("filterBar:sortFilter"), new DropDown(0, 0, sortOptions, this.updateStarters, DropDownType.SINGLE)); + this.filterBarContainer.add(this.filterBar); + + this.starterSelectContainer.add(this.filterBarContainer); + + // Offset the generation filter dropdown to avoid covering the filtered pokemon + this.filterBar.offsetHybridFilters(); + + if (!globalScene.uiTheme) { + pokemonContainerWindow.setVisible(false); + } + + this.iconAnimHandler = new PokemonIconAnimHandler(); + this.iconAnimHandler.setup(); + + this.pokemonNumberText = addTextObject(6, 141, "", TextStyle.SUMMARY); + this.pokemonNumberText.setOrigin(0, 0); + this.starterSelectContainer.add(this.pokemonNumberText); + + this.pokemonNameText = addTextObject(6, 128, "", TextStyle.SUMMARY); + this.pokemonNameText.setOrigin(0, 0); + this.starterSelectContainer.add(this.pokemonNameText); + + this.pokemonFormText = addTextObject(6, 121, "", TextStyle.PARTY, { fontSize: textSettings.instructionTextSize }); + this.pokemonFormText.setOrigin(0, 0); + this.starterSelectContainer.add(this.pokemonFormText); + + const starterBoxContainer = globalScene.add.container(speciesContainerX + 6, 9); //115 + + this.starterSelectScrollBar = new ScrollBar(161, 12, 5, pokemonContainerWindow.height - 6, 9); + + starterBoxContainer.add(this.starterSelectScrollBar); + + this.pokerusCursorObjs = new Array(POKERUS_STARTER_COUNT).fill(null).map(() => { + const cursorObj = globalScene.add.image(0, 0, "select_cursor_pokerus"); + cursorObj.setVisible(false); + cursorObj.setOrigin(0, 0); + starterBoxContainer.add(cursorObj); + return cursorObj; + }); + + this.cursorObj = globalScene.add.image(0, 0, "select_cursor"); + this.cursorObj.setOrigin(0, 0); + starterBoxContainer.add(this.cursorObj); + + for (const species of allSpecies) { + this.speciesLoaded.set(species.speciesId, false); + this.allSpecies.push(species); + + const pokemonContainer = new PokedexMonContainer(species).setVisible(false); + this.iconAnimHandler.addOrUpdate(pokemonContainer.icon, PokemonIconAnimMode.NONE); + this.pokemonContainers.push(pokemonContainer); + starterBoxContainer.add(pokemonContainer); + } + + // Tray to display forms + this.formTrayContainer = globalScene.add.container(0, 0); + + this.trayBg = addWindow(0, 0, 0, 0); + this.trayBg.setOrigin(0, 0); + this.formTrayContainer.add(this.trayBg); + + this.trayCursorObj = globalScene.add.image(0, 0, "select_cursor"); + this.trayCursorObj.setOrigin(0, 0); + this.formTrayContainer.add(this.trayCursorObj); + starterBoxContainer.add(this.formTrayContainer); + starterBoxContainer.bringToTop(this.formTrayContainer); + this.formTrayContainer.setVisible(false); + + this.starterSelectContainer.add(starterBoxContainer); + + this.pokemonSprite = globalScene.add.sprite(96, 143, "pkmn__sub"); + this.pokemonSprite.setPipeline(globalScene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true }); + this.starterSelectContainer.add(this.pokemonSprite); + + this.type1Icon = globalScene.add.sprite(10, 158, getLocalizedSpriteKey("types")); + this.type1Icon.setScale(0.5); + this.type1Icon.setOrigin(0, 0); + this.starterSelectContainer.add(this.type1Icon); + + this.type2Icon = globalScene.add.sprite(28, 158, getLocalizedSpriteKey("types")); + this.type2Icon.setScale(0.5); + this.type2Icon.setOrigin(0, 0); + this.starterSelectContainer.add(this.type2Icon); + + this.starterSelectMessageBoxContainer = globalScene.add.container(0, globalScene.game.canvas.height / 6); + this.starterSelectMessageBoxContainer.setVisible(false); + this.starterSelectContainer.add(this.starterSelectMessageBoxContainer); + + this.starterSelectMessageBox = addWindow(1, -1, 318, 28); + this.starterSelectMessageBox.setOrigin(0, 1); + this.starterSelectMessageBoxContainer.add(this.starterSelectMessageBox); + + // Instruction for "C" button to toggle showDecorations + const instructionTextSize = textSettings.instructionTextSize; + + this.goFilterIconElement1 = new Phaser.GameObjects.Sprite(globalScene, 10, 2, "keyboard", "C.png"); + this.goFilterIconElement1.setName("sprite-goFilter1-icon-element"); + this.goFilterIconElement1.setScale(0.675); + this.goFilterIconElement1.setOrigin(0.0, 0.0); + this.goFilterIconElement2 = new Phaser.GameObjects.Sprite(globalScene, 20, 2, "keyboard", "V.png"); + this.goFilterIconElement2.setName("sprite-goFilter2-icon-element"); + this.goFilterIconElement2.setScale(0.675); + this.goFilterIconElement2.setOrigin(0.0, 0.0); + this.goFilterLabel = addTextObject(30, 2, i18next.t("pokedexUiHandler:goFilters"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.goFilterLabel.setName("text-goFilter-label"); + this.starterSelectContainer.add(this.goFilterIconElement1); + this.starterSelectContainer.add(this.goFilterIconElement2); + this.starterSelectContainer.add(this.goFilterLabel); + + this.toggleDecorationsIconElement = new Phaser.GameObjects.Sprite(globalScene, 10, 10, "keyboard", "R.png"); + this.toggleDecorationsIconElement.setName("sprite-toggleDecorations-icon-element"); + this.toggleDecorationsIconElement.setScale(0.675); + this.toggleDecorationsIconElement.setOrigin(0.0, 0.0); + this.toggleDecorationsLabel = addTextObject(20, 10, i18next.t("pokedexUiHandler:toggleDecorations"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.toggleDecorationsLabel.setName("text-toggleDecorations-label"); + this.starterSelectContainer.add(this.toggleDecorationsIconElement); + this.starterSelectContainer.add(this.toggleDecorationsLabel); + + this.showFormTrayIconElement = new Phaser.GameObjects.Sprite(globalScene, 6, 168, "keyboard", "F.png"); + this.showFormTrayIconElement.setName("sprite-showFormTray-icon-element"); + this.showFormTrayIconElement.setScale(0.675); + this.showFormTrayIconElement.setOrigin(0.0, 0.0); + this.showFormTrayLabel = addTextObject(16, 168, i18next.t("pokedexUiHandler:showForms"), TextStyle.PARTY, { fontSize: instructionTextSize }); + this.showFormTrayLabel.setName("text-showFormTray-label"); + this.showFormTrayIconElement.setVisible(false); + this.showFormTrayLabel.setVisible(false); + this.starterSelectContainer.add(this.showFormTrayIconElement); + this.starterSelectContainer.add(this.showFormTrayLabel); + + this.message = addTextObject(8, 8, "", TextStyle.WINDOW, { maxLines: 2 }); + this.message.setOrigin(0, 0); + this.starterSelectMessageBoxContainer.add(this.message); + + // arrow icon for the message box + this.initPromptSprite(this.starterSelectMessageBoxContainer); + + // Filter bar sits above everything, except the tutorial overlay and message box + this.starterSelectContainer.bringToTop(this.filterBarContainer); + this.initTutorialOverlay(this.starterSelectContainer); + this.starterSelectContainer.bringToTop(this.starterSelectMessageBoxContainer); + this.starterSelectContainer.bringToTop(this.pokemonNameText); + this.starterSelectContainer.bringToTop(this.pokemonFormText); + } + + show(args: any[]): boolean { + + if (!this.starterPreferences) { + this.starterPreferences = StarterPrefs.load(); + } + + this.pokerusSpecies = getPokerusStarters(); + + // When calling with "refresh", we do not reset the cursor and filters + if (args.length >= 1 && args[0] === "refresh") { + return false; + } + + super.show(args); + + this.starterSelectContainer.setVisible(true); + + this.getUi().bringToTop(this.starterSelectContainer); + + // Making caught pokemon visible icons, etc + this.allSpecies.forEach((species, s) => { + const icon = this.pokemonContainers[s].icon; + const dexEntry = globalScene.gameData.dexData[species.speciesId]; + + this.starterPreferences[species.speciesId] = this.initStarterPrefs(species); + + if ((dexEntry.caughtAttr & species.getFullUnlocksData()) || globalScene.dexForDevs) { + icon.clearTint(); + } else if (dexEntry.seenAttr) { + icon.setTint(0x808080); + } + + this.setUpgradeAnimation(icon, species); + }); + + this.resetFilters(); + this.updateStarters(); + + this.setFilterMode(false); + this.filterBarCursor = 0; + this.setFilterTextMode(false); + this.filterTextCursor = 0; + this.setCursor(0); + + this.filterTextContainer.setVisible(true); + + return true; + } + + /** + * Get the starter attributes for the given PokemonSpecies, after sanitizing them. + * If somehow a preference is set for a form, variant, gender, ability or nature + * that wasn't actually unlocked or is invalid it will be cleared here + * + * @param species The species to get Starter Preferences for + * @returns StarterAttributes for the species + */ + initStarterPrefs(species: PokemonSpecies): StarterAttributes { + const starterAttributes = this.starterPreferences[species.speciesId]; + const dexEntry = globalScene.gameData.dexData[species.speciesId]; + const starterData = globalScene.gameData.starterData[species.speciesId]; + + // no preferences or Pokemon wasn't caught, return empty attribute + if (!starterAttributes || !dexEntry.caughtAttr) { + return {}; + } + + const caughtAttr = dexEntry.caughtAttr & species.getFullUnlocksData(); + + const hasShiny = caughtAttr & DexAttr.SHINY; + const hasNonShiny = caughtAttr & DexAttr.NON_SHINY; + if (starterAttributes.shiny && !hasShiny) { + // shiny form wasn't unlocked, purging shiny and variant setting + delete starterAttributes.shiny; + delete starterAttributes.variant; + } else if (starterAttributes.shiny === false && !hasNonShiny) { + // non shiny form wasn't unlocked, purging shiny setting + delete starterAttributes.shiny; + } + + if (starterAttributes.variant !== undefined) { + const unlockedVariants = [ + hasShiny && caughtAttr & DexAttr.DEFAULT_VARIANT, + hasShiny && caughtAttr & DexAttr.VARIANT_2, + hasShiny && caughtAttr & DexAttr.VARIANT_3 + ]; + if (isNaN(starterAttributes.variant) || starterAttributes.variant < 0 || !unlockedVariants[starterAttributes.variant]) { + // variant value is invalid or requested variant wasn't unlocked, purging setting + delete starterAttributes.variant; + } + } + + if (starterAttributes.female !== undefined) { + if (!(starterAttributes.female ? caughtAttr & DexAttr.FEMALE : caughtAttr & DexAttr.MALE)) { + // requested gender wasn't unlocked, purging setting + delete starterAttributes.female; + } + } + + if (starterAttributes.ability !== undefined) { + const speciesHasSingleAbility = species.ability2 === species.ability1; + const abilityAttr = starterData.abilityAttr; + const hasAbility1 = abilityAttr & AbilityAttr.ABILITY_1; + const hasAbility2 = abilityAttr & AbilityAttr.ABILITY_2; + const hasHiddenAbility = abilityAttr & AbilityAttr.ABILITY_HIDDEN; + // Due to a past bug it is possible that some Pokemon with a single ability have the ability2 flag + // In this case, we only count ability2 as valid if ability1 was not unlocked, otherwise we ignore it + const unlockedAbilities = [ + hasAbility1, + speciesHasSingleAbility ? hasAbility2 && !hasAbility1 : hasAbility2, + hasHiddenAbility + ]; + if (!unlockedAbilities[starterAttributes.ability]) { + // requested ability wasn't unlocked, purging setting + delete starterAttributes.ability; + } + } + + const selectedForm = starterAttributes.form; + if (selectedForm !== undefined && (!species.forms[selectedForm]?.isStarterSelectable || !(caughtAttr & globalScene.gameData.getFormAttr(selectedForm)))) { + // requested form wasn't unlocked/isn't a starter form, purging setting + delete starterAttributes.form; + } + + if (starterAttributes.nature !== undefined) { + const unlockedNatures = globalScene.gameData.getNaturesForAttr(dexEntry.natureAttr); + if (unlockedNatures.indexOf(starterAttributes.nature as unknown as Nature) < 0) { + // requested nature wasn't unlocked, purging setting + delete starterAttributes.nature; + } + } + + return starterAttributes; + } + + /** + * Set the selections for all filters to their default starting value + */ + resetFilters() : void { + this.filterBar.setValsToDefault(); + this.filterText.setValsToDefault(); + } + + showText(text: string, delay?: number, callback?: Function, callbackDelay?: number, prompt?: boolean, promptDelay?: number, moveToTop?: boolean) { + super.showText(text, delay, callback, callbackDelay, prompt, promptDelay); + + const singleLine = text?.indexOf("\n") === -1; + + this.starterSelectMessageBox.setSize(318, singleLine ? 28 : 42); + + if (moveToTop) { + this.starterSelectMessageBox.setOrigin(0, 0); + this.starterSelectMessageBoxContainer.setY(0); + this.message.setY(4); + } else { + this.starterSelectMessageBoxContainer.setY(globalScene.game.canvas.height / 6); + this.starterSelectMessageBox.setOrigin(0, 1); + this.message.setY(singleLine ? -22 : -37); + } + + this.starterSelectMessageBoxContainer.setVisible(!!text?.length); + } + + /** + * Determines if 'Icon' based upgrade notifications should be shown + * @returns true if upgrade notifications are enabled and set to display an 'Icon' + */ + isUpgradeIconEnabled(): boolean { + return globalScene.candyUpgradeNotification !== 0 && globalScene.candyUpgradeDisplay === 0; + } + /** + * Determines if 'Animation' based upgrade notifications should be shown + * @returns true if upgrade notifications are enabled and set to display an 'Animation' + */ + isUpgradeAnimationEnabled(): boolean { + return globalScene.candyUpgradeNotification !== 0 && globalScene.candyUpgradeDisplay === 1; + } + + getStarterSpeciesId(speciesId): number { + if (speciesStarterCosts.hasOwnProperty(speciesId)) { + return speciesId; + } else { + return pokemonStarters[speciesId]; + } + } + + /** + * Determines if a passive upgrade is available for the given species ID + * @param speciesId The ID of the species to check the passive of + * @returns true if the user has enough candies and a passive has not been unlocked already + */ + isPassiveAvailable(speciesId: number): boolean { + // Get this species ID's starter data + const starterData = globalScene.gameData.starterData[this.getStarterSpeciesId(speciesId)]; + + return starterData.candyCount >= getPassiveCandyCount(speciesStarterCosts[this.getStarterSpeciesId(speciesId)]) + && !(starterData.passiveAttr & PassiveAttr.UNLOCKED); + } + + /** + * Determines if a value reduction upgrade is available for the given species ID + * @param speciesId The ID of the species to check the value reduction of + * @returns true if the user has enough candies and all value reductions have not been unlocked already + */ + isValueReductionAvailable(speciesId: number): boolean { + // Get this species ID's starter data + const starterData = globalScene.gameData.starterData[this.getStarterSpeciesId(speciesId)]; + + return starterData.candyCount >= getValueReductionCandyCounts(speciesStarterCosts[this.getStarterSpeciesId(speciesId)])[starterData.valueReduction] + && starterData.valueReduction < valueReductionMax; + } + + /** + * Determines if an same species egg can be bought for the given species ID + * @param speciesId The ID of the species to check the value reduction of + * @returns true if the user has enough candies + */ + isSameSpeciesEggAvailable(speciesId: number): boolean { + // Get this species ID's starter data + const starterData = globalScene.gameData.starterData[this.getStarterSpeciesId(speciesId)]; + + return starterData.candyCount >= getSameSpeciesEggCandyCounts(speciesStarterCosts[this.getStarterSpeciesId(speciesId)]); + } + + /** + * Sets a bounce animation if enabled and the Pokemon has an upgrade + * @param icon {@linkcode Phaser.GameObjects.GameObject} to animate + * @param species {@linkcode PokemonSpecies} of the icon used to check for upgrades + * @param startPaused Should this animation be paused after it is added? + */ + setUpgradeAnimation(icon: Phaser.GameObjects.Sprite, species: PokemonSpecies, startPaused: boolean = false): void { + globalScene.tweens.killTweensOf(icon); + // Skip animations if they are disabled + if (globalScene.candyUpgradeDisplay === 0 || species.speciesId !== species.getRootSpeciesId(false)) { + return; + } + + icon.y = 2; + + const tweenChain: Phaser.Types.Tweens.TweenChainBuilderConfig = { + targets: icon, + loop: -1, + // Make the initial bounce a little randomly delayed + delay: randIntRange(0, 50) * 5, + loopDelay: 1000, + tweens: [ + { + targets: icon, + y: 2 - 5, + duration: fixedInt(125), + ease: "Cubic.easeOut", + yoyo: true + }, + { + targets: icon, + y: 2 - 3, + duration: fixedInt(150), + ease: "Cubic.easeOut", + yoyo: true + } + ], }; + + const isPassiveAvailable = this.isPassiveAvailable(species.speciesId); + const isValueReductionAvailable = this.isValueReductionAvailable(species.speciesId); + const isSameSpeciesEggAvailable = this.isSameSpeciesEggAvailable(species.speciesId); + + // 'Passives Only' mode + if (globalScene.candyUpgradeNotification === 1) { + if (isPassiveAvailable) { + globalScene.tweens.chain(tweenChain).paused = startPaused; + } + // 'On' mode + } else if (globalScene.candyUpgradeNotification === 2) { + if (isPassiveAvailable || isValueReductionAvailable || isSameSpeciesEggAvailable) { + globalScene.tweens.chain(tweenChain).paused = startPaused; + } + } + } + + /** + * Sets the visibility of a Candy Upgrade Icon + */ + setUpgradeIcon(starter: PokedexMonContainer): void { + const species = starter.species; + const slotVisible = !!species?.speciesId; + + if (!species || globalScene.candyUpgradeNotification === 0 || species.speciesId !== species.getRootSpeciesId(false)) { + starter.candyUpgradeIcon.setVisible(false); + starter.candyUpgradeOverlayIcon.setVisible(false); + return; + } + + const isPassiveAvailable = this.isPassiveAvailable(species.speciesId); + const isValueReductionAvailable = this.isValueReductionAvailable(species.speciesId); + const isSameSpeciesEggAvailable = this.isSameSpeciesEggAvailable(species.speciesId); + + // 'Passive Only' mode + if (globalScene.candyUpgradeNotification === 1) { + starter.candyUpgradeIcon.setVisible(slotVisible && isPassiveAvailable); + starter.candyUpgradeOverlayIcon.setVisible(slotVisible && starter.candyUpgradeIcon.visible); + + // 'On' mode + } else if (globalScene.candyUpgradeNotification === 2) { + starter.candyUpgradeIcon.setVisible( + slotVisible && ( isPassiveAvailable || isValueReductionAvailable || isSameSpeciesEggAvailable )); + starter.candyUpgradeOverlayIcon.setVisible(slotVisible && starter.candyUpgradeIcon.visible); + } + } + + /** + * Update the display of candy upgrade icons or animations for the given PokedexMonContainer + * @param pokemonContainer the container for the Pokemon to update + */ + updateCandyUpgradeDisplay(pokemonContainer: PokedexMonContainer) { + if (this.isUpgradeIconEnabled() ) { + this.setUpgradeIcon(pokemonContainer); + } + if (this.isUpgradeAnimationEnabled()) { + this.setUpgradeAnimation(pokemonContainer.icon, this.lastSpecies, true); + } + } + + processInput(button: Button): boolean { + if (this.blockInput) { + return false; + } + + const maxColumns = 9; + const numberOfStarters = this.filteredPokemonContainers.length; + const numOfRows = Math.ceil(numberOfStarters / maxColumns); + const currentRow = Math.floor(this.cursor / maxColumns); + const onScreenFirstIndex = this.scrollCursor * maxColumns; // this is first index on the screen + + // TODO: use the above to let the cursor go to the correct position when switching back. + + const ui = this.getUi(); + + let success = false; + let error = false; + + if (button === Button.SUBMIT) { + error = true; + } else if (button === Button.CANCEL) { + if (this.filterMode && this.filterBar.openDropDown) { + // CANCEL with a filter menu open > close it + this.filterBar.toggleDropDown(this.filterBarCursor); + + // if there are possible pokemon go the first one of the list + if (numberOfStarters > 0) { + this.setFilterMode(false); + this.scrollCursor = 0; + this.updateScroll(); + this.setCursor(0); + } + success = true; + + } else if (this.filterTextMode && !(this.filterText.getValue(this.filterTextCursor) === this.filterText.defaultText)) { + this.filterText.resetSelection(this.filterTextCursor); + success = true; + } else if (this.showingTray) { + success = this.closeFormTray(); + } else { + this.tryExit(); + success = true; + } + } else if (button === Button.STATS) { + if (!this.filterMode && !this.showingTray) { + this.cursorObj.setVisible(false); + this.setSpecies(null); + this.filterText.cursorObj.setVisible(false); + this.filterTextMode = false; + this.filterBarCursor = 0; + this.setFilterMode(true); + } else { + error = true; + } + } else if (button === Button.V) { + if (!this.filterTextMode && !this.showingTray) { + this.cursorObj.setVisible(false); + this.setSpecies(null); + this.filterBar.cursorObj.setVisible(false); + this.filterMode = false; + this.filterTextCursor = 0; + this.setFilterTextMode(true); + } else { + error = true; + } + } else if (button === Button.CYCLE_SHINY) { + if (!this.showingTray) { + this.showDecorations = !this.showDecorations; + this.updateScroll(); + success = true; + } else { + error = true; + } + } else if (this.filterMode) { + switch (button) { + case Button.LEFT: + if (this.filterBarCursor > 0) { + success = this.setCursor(this.filterBarCursor - 1); + } else { + success = this.setCursor(this.filterBar.numFilters - 1); + } + break; + case Button.RIGHT: + if (this.filterBarCursor < this.filterBar.numFilters - 1) { + success = this.setCursor(this.filterBarCursor + 1); + } else { + success = this.setCursor(0); + } + break; + case Button.UP: + if (this.filterBar.openDropDown) { + success = this.filterBar.decDropDownCursor(); + } else if (numberOfStarters > 0) { + // UP from filter bar to bottom of Pokemon list + this.setFilterMode(false); + this.scrollCursor = Math.max(0, numOfRows - 9); + this.updateScroll(); + const proportion = this.filterBarCursor / Math.max(1, this.filterBar.numFilters - 1); + const targetCol = Math.min(8, proportion < 0.5 ? Math.floor(proportion * 8) : Math.ceil(proportion * 8)); + if (numberOfStarters % 9 > targetCol) { + this.setCursor(numberOfStarters - (numberOfStarters) % 9 + targetCol); + } else { + this.setCursor(Math.max(numberOfStarters - (numberOfStarters) % 9 + targetCol - 9, 0)); + } + success = true; + } + break; + case Button.DOWN: + if (this.filterBar.openDropDown) { + success = this.filterBar.incDropDownCursor(); + } else if (numberOfStarters > 0) { + // DOWN from filter bar to top of Pokemon list + this.setFilterMode(false); + this.scrollCursor = 0; + this.updateScroll(); + const proportion = this.filterBarCursor / Math.max(1, this.filterBar.numFilters - 1); + const targetCol = Math.min(8, proportion < 0.5 ? Math.floor(proportion * 8) : Math.ceil(proportion * 8)); + this.setCursor(Math.min(targetCol, numberOfStarters)); + success = true; + } + break; + case Button.ACTION: + if (!this.filterBar.openDropDown) { + this.filterBar.toggleDropDown(this.filterBarCursor); + } else { + this.filterBar.toggleOptionState(); + } + success = true; + break; + } + } else if (this.filterTextMode) { + switch (button) { + case Button.LEFT: + // LEFT from filter bar, move to right of Pokemon list + if (numberOfStarters > 0) { + this.setFilterTextMode(false); + const rowIndex = this.filterTextCursor; + this.setCursor(onScreenFirstIndex + (rowIndex < numOfRows - 1 ? (rowIndex + 1) * maxColumns - 1 : numberOfStarters - 1)); + success = true; + } + break; + case Button.RIGHT: + // RIGHT from filter bar, move to left of Pokemon list + if (numberOfStarters > 0) { + this.setFilterTextMode(false); + const rowIndex = this.filterTextCursor; + this.setCursor(onScreenFirstIndex + (rowIndex < numOfRows ? rowIndex * maxColumns : (numOfRows - 1) * maxColumns)); + success = true; + } + break; + case Button.UP: + if (this.filterTextCursor > 0) { + success = this.setCursor(this.filterTextCursor - 1); + } else { + success = this.setCursor(this.filterText.numFilters - 1); + } + break; + case Button.DOWN: + if (this.filterTextCursor < this.filterText.numFilters - 1) { + success = this.setCursor(this.filterTextCursor + 1); + } else { + success = this.setCursor(0); + } + break; + case Button.ACTION: + this.filterText.startSearch(this.filterTextCursor, this.getUi()); + success = true; + break; + } + } else if (this.showingTray) { + if (button === Button.ACTION) { + const formIndex = this.trayForms[this.trayCursor].formIndex; + ui.setOverlayMode(Mode.POKEDEX_PAGE, this.lastSpecies, formIndex, { form: formIndex }); + success = true; + } else { + const numberOfForms = this.trayContainers.length; + const numOfRows = Math.ceil(numberOfForms / maxColumns); + const currentRow = Math.floor(this.trayCursor / maxColumns); + switch (button) { + case Button.UP: + if (currentRow > 0) { + success = this.setTrayCursor(this.trayCursor - 9); + } else { + const targetCol = this.trayCursor; + if (numberOfForms % 9 > targetCol) { + success = this.setTrayCursor(numberOfForms - (numberOfForms) % 9 + targetCol); + } else { + success = this.setTrayCursor(Math.max(numberOfForms - (numberOfForms) % 9 + targetCol - 9, 0)); + } + } + break; + case Button.DOWN: + if (currentRow < numOfRows - 1) { + success = this.setTrayCursor(this.trayCursor + 9); + } else { + success = this.setTrayCursor(this.trayCursor % 9); + } + break; + case Button.LEFT: + if (this.trayCursor % 9 !== 0) { + success = this.setTrayCursor(this.trayCursor - 1); + } else { + success = this.setTrayCursor(currentRow < numOfRows - 1 ? (currentRow + 1) * maxColumns - 1 : numberOfForms - 1); + } + break; + case Button.RIGHT: + if (this.trayCursor % 9 < (currentRow < numOfRows - 1 ? 8 : (numberOfForms - 1) % 9)) { + success = this.setTrayCursor(this.trayCursor + 1); + } else { + success = this.setTrayCursor(currentRow * 9); + } + break; + case Button.CYCLE_FORM: + success = this.closeFormTray(); + break; + } + } + } else { + if (button === Button.ACTION) { + ui.setOverlayMode(Mode.POKEDEX_PAGE, this.lastSpecies, 0); + success = true; + } else { + switch (button) { + case Button.UP: + if (currentRow > 0) { + if (this.scrollCursor > 0 && currentRow - this.scrollCursor === 0) { + this.scrollCursor--; + this.updateScroll(); + } + success = this.setCursor(this.cursor - 9); + } else { + this.filterBarCursor = this.filterBar.getNearestFilter(this.filteredPokemonContainers[this.cursor]); + this.setFilterMode(true); + success = true; + } + break; + case Button.DOWN: + if (currentRow < numOfRows - 1) { // not last row + if (currentRow - this.scrollCursor === 8) { // last row of visible pokemon + this.scrollCursor++; + } + success = this.setCursor(this.cursor + 9); + this.updateScroll(); + } else if (numOfRows > 1) { + // DOWN from last row of pokemon > Wrap around to first row + this.scrollCursor = 0; + this.updateScroll(); + success = this.setCursor(this.cursor % 9); + } else { + // DOWN from single row of pokemon > Go to filters + this.filterBarCursor = this.filterBar.getNearestFilter(this.filteredPokemonContainers[this.cursor]); + this.setFilterMode(true); + success = true; + } + break; + case Button.LEFT: + if (this.cursor % 9 !== 0) { + success = this.setCursor(this.cursor - 1); + } else { + // LEFT from filtered pokemon, on the left edge + this.filterTextCursor = this.filterText.getNearestFilter(this.filteredPokemonContainers[this.cursor]); + this.setFilterTextMode(true); + success = true; + } + break; + case Button.RIGHT: + // is not right edge + if (this.cursor % 9 < (currentRow < numOfRows - 1 ? 8 : (numberOfStarters - 1) % 9)) { + success = this.setCursor(this.cursor + 1); + } else { + // RIGHT from filtered pokemon, on the right edge + this.filterTextCursor = this.filterText.getNearestFilter(this.filteredPokemonContainers[this.cursor]); + this.setFilterTextMode(true); + success = true; + } + break; + case Button.CYCLE_FORM: + const species = this.filteredPokemonContainers[this.cursor].species; + if (this.canShowFormTray) { + success = this.openFormTray(species); + } + break; + } + } + } + + if (success) { + ui.playSelect(); + } else if (error) { + ui.playError(); + } + + return success || error; + } + + updateButtonIcon(iconSetting, gamepadType, iconElement, controlLabel): void { + let iconPath; + // touch controls cannot be rebound as is, and are just emulating a keyboard event. + // Additionally, since keyboard controls can be rebound (and will be displayed when they are), we need to have special handling for the touch controls + if (gamepadType === "touch") { + gamepadType = "keyboard"; + switch (iconSetting) { + case SettingKeyboard.Button_Cycle_Shiny: + iconPath = "R.png"; + break; + case SettingKeyboard.Button_Cycle_Variant: + iconPath = "V.png"; + break; + case SettingKeyboard.Button_Cycle_Form: + iconPath = "F.png"; + break; + case SettingKeyboard.Button_Stats: + iconPath = "C.png"; + break; + default: + break; + } + } else { + iconPath = globalScene.inputController?.getIconForLatestInputRecorded(iconSetting); + } + iconElement.setTexture(gamepadType, iconPath); + iconElement.setVisible(true); + controlLabel.setVisible(true); + } + + updateFilterButtonIcon(iconSetting, gamepadType, iconElement, controlLabel): void { + let iconPath; + // touch controls cannot be rebound as is, and are just emulating a keyboard event. + // Additionally, since keyboard controls can be rebound (and will be displayed when they are), we need to have special handling for the touch controls + if (gamepadType === "touch") { + gamepadType = "keyboard"; + iconPath = "C.png"; + } else { + iconPath = globalScene.inputController?.getIconForLatestInputRecorded(iconSetting); + } + iconElement.setTexture(gamepadType, iconPath); + iconElement.setVisible(true); + controlLabel.setVisible(true); + } + + getSanitizedProps(props: DexAttrProps): DexAttrProps { + const sanitizedProps: DexAttrProps = { + shiny: false, + female: props.female, + variant: 0, + formIndex: 0, + }; + return sanitizedProps; + } + + // Returns true if one of the forms has the requested move + hasFormLevelMove(form: PokemonForm, selectedMove: string): boolean { + if (!pokemonFormLevelMoves.hasOwnProperty(form.speciesId) || !pokemonFormLevelMoves[form.speciesId].hasOwnProperty(form.formIndex)) { + return false; + } else { + const levelMoves = pokemonFormLevelMoves[form.speciesId][form.formIndex].map(m => allMoves[m[1]].name); + return levelMoves.includes(selectedMove); + } + } + + updateStarters = () => { + this.scrollCursor = 0; + this.filteredPokemonContainers = []; + this.validPokemonContainers = []; + + this.pokerusCursorObjs.forEach(cursor => cursor.setVisible(false)); + + this.filterBar.updateFilterLabels(); + this.filterText.updateFilterLabels(); + + this.validPokemonContainers = this.pokemonContainers; + + // this updates icons for previously saved pokemon + for (let i = 0; i < this.validPokemonContainers.length; i++) { + const currentFilteredContainer = this.validPokemonContainers[i]; + const starterSprite = currentFilteredContainer.icon as Phaser.GameObjects.Sprite; + + const currentDexAttr = this.getCurrentDexProps(currentFilteredContainer.species.speciesId); + const props = this.getSanitizedProps(globalScene.gameData.getSpeciesDexAttrProps(currentFilteredContainer.species, currentDexAttr)); + + starterSprite.setTexture(currentFilteredContainer.species.getIconAtlasKey(props.formIndex, props.shiny, props.variant), currentFilteredContainer.species.getIconId(props.female!, props.formIndex, props.shiny, props.variant)); + currentFilteredContainer.checkIconId(props.female, props.formIndex, props.shiny, props.variant); + } + + // filter + this.validPokemonContainers.forEach(container => { + container.setVisible(false); + + const starterId = this.getStarterSpeciesId(container.species.speciesId); + + container.cost = globalScene.gameData.getSpeciesStarterValue(starterId); + + // First, ensure you have the caught attributes for the species else default to bigint 0 + // TODO: This might be removed depending on how accessible we want the pokedex function to be + const caughtAttr = (globalScene.gameData.dexData[container.species.speciesId]?.caughtAttr || BigInt(0)) & + (globalScene.gameData.dexData[this.getStarterSpeciesId(container.species.speciesId)]?.caughtAttr || BigInt(0)) & + container.species.getFullUnlocksData(); + const starterData = globalScene.gameData.starterData[starterId]; + const isStarterProgressable = speciesEggMoves.hasOwnProperty(starterId); + + // Name filter + const selectedName = this.filterText.getValue(FilterTextRow.NAME); + const fitsName = container.species.name === selectedName || selectedName === this.filterText.defaultText; + + // Move filter + // TODO: There can be fringe cases where the two moves belong to mutually exclusive forms, these must be handled separately (Pikachu); + // On the other hand, in some cases it is possible to switch between different forms and combine (Deoxys) + const levelMoves = pokemonSpeciesLevelMoves[container.species.speciesId].map(m => allMoves[m[1]].name); + // This always gets egg moves from the starter + const eggMoves = speciesEggMoves[starterId]?.map(m => allMoves[m].name) ?? []; + const tmMoves = speciesTmMoves[starterId]?.map(m => allMoves[Array.isArray(m) ? m[1] : m].name) ?? []; + const selectedMove1 = this.filterText.getValue(FilterTextRow.MOVE_1); + const selectedMove2 = this.filterText.getValue(FilterTextRow.MOVE_2); + + const fitsFormMove1 = container.species.forms.some(form => this.hasFormLevelMove(form, selectedMove1)); + const fitsFormMove2 = container.species.forms.some(form => this.hasFormLevelMove(form, selectedMove2)); + const fitsLevelMove1 = levelMoves.includes(selectedMove1) || fitsFormMove1; + const fitsEggMove1 = eggMoves.includes(selectedMove1); + const fitsTmMove1 = tmMoves.includes(selectedMove1); + const fitsLevelMove2 = levelMoves.includes(selectedMove2) || fitsFormMove2; + const fitsEggMove2 = eggMoves.includes(selectedMove2); + const fitsTmMove2 = tmMoves.includes(selectedMove2); + const fitsMove1 = fitsLevelMove1 || fitsEggMove1 || fitsTmMove1 || selectedMove1 === this.filterText.defaultText; + const fitsMove2 = fitsLevelMove2 || fitsEggMove2 || fitsTmMove2 || selectedMove2 === this.filterText.defaultText; + const fitsMoves = fitsMove1 && fitsMove2; + + container.eggMove1Icon.setVisible(false); + container.tmMove1Icon.setVisible(false); + container.eggMove2Icon.setVisible(false); + container.tmMove2Icon.setVisible(false); + if (fitsEggMove1 && !fitsLevelMove1) { + container.eggMove1Icon.setVisible(true); + const em1 = eggMoves.findIndex(name => name === selectedMove1); + if ((starterData.eggMoves & (1 << em1)) === 0) { + container.eggMove1Icon.setTint(0x808080); + } else { + container.eggMove1Icon.clearTint(); + } + } else if (fitsTmMove1 && !fitsLevelMove1) { + container.tmMove1Icon.setVisible(true); + } + if (fitsEggMove2 && !fitsLevelMove2) { + container.eggMove2Icon.setVisible(true); + const em2 = eggMoves.findIndex(name => name === selectedMove2); + if ((starterData.eggMoves & (1 << em2)) === 0) { + container.eggMove2Icon.setTint(0x808080); + } else { + container.eggMove2Icon.clearTint(); + } + } else if (fitsTmMove2 && !fitsLevelMove2) { + container.tmMove2Icon.setVisible(true); + } + + // Ability filter + const abilities = [ container.species.ability1, container.species.ability2, container.species.abilityHidden ].map(a => allAbilities[a].name); + const passives = starterPassiveAbilities[starterId] ?? {} as PassiveAbilities; + + const selectedAbility1 = this.filterText.getValue(FilterTextRow.ABILITY_1); + const fitsFormAbility1 = container.species.forms.some(form => [ form.ability1, form.ability2, form.abilityHidden ].map(a => allAbilities[a].name).includes(selectedAbility1)); + const fitsAbility1 = abilities.includes(selectedAbility1) || fitsFormAbility1 || selectedAbility1 === this.filterText.defaultText; + const fitsPassive1 = Object.values(passives).some(p => allAbilities[p].name === selectedAbility1); + + const selectedAbility2 = this.filterText.getValue(FilterTextRow.ABILITY_2); + const fitsFormAbility2 = container.species.forms.some(form => [ form.ability1, form.ability2, form.abilityHidden ].map(a => allAbilities[a].name).includes(selectedAbility2)); + const fitsAbility2 = abilities.includes(selectedAbility2) || fitsFormAbility2 || selectedAbility2 === this.filterText.defaultText; + const fitsPassive2 = Object.values(passives).some(p => allAbilities[p].name === selectedAbility2); + + // If both fields have been set to the same ability, show both ability and passive + const fitsAbilities = (fitsAbility1 && (fitsPassive2 || selectedAbility2 === this.filterText.defaultText)) || + (fitsAbility2 && (fitsPassive1 || selectedAbility1 === this.filterText.defaultText)); + + container.passive1Icon.setVisible(false); + container.passive2Icon.setVisible(false); + if (fitsPassive1 || fitsPassive2) { + if (fitsPassive1) { + if (starterData.passiveAttr > 0) { + container.passive1Icon.clearTint(); + container.passive1OverlayIcon.clearTint(); + } else { + container.passive1Icon.setTint(0x808080); + container.passive1OverlayIcon.setTint(0x808080); + } + container.passive1Icon.setVisible(true); + } else { + if (starterData.passiveAttr > 0) { + container.passive2Icon.clearTint(); + container.passive2OverlayIcon.clearTint(); + } else { + container.passive2Icon.setTint(0x808080); + container.passive2OverlayIcon.setTint(0x808080); + } + container.passive2Icon.setVisible(true); + } + } + + // Gen filter + const fitsGen = this.filterBar.getVals(DropDownColumn.GEN).includes(container.species.generation); + + // Type filter + const fitsType = this.filterBar.getVals(DropDownColumn.TYPES).some(type => container.species.isOfType((type as number) - 1)); + + // Biome filter + const indexToBiome = new Map( + Object.values(Biome) + .map((value, index) => (typeof value === "string" ? [ index, value ] : undefined)) + .filter((entry): entry is [number, string] => entry !== undefined) + ); + indexToBiome.set(35, "Uncatchable"); + + // We get biomes for both the mon and its starters to ensure that evolutions get the correct filters. + // TODO: We might also need to do it the other way around. + const biomes = catchableSpecies[container.species.speciesId].concat(catchableSpecies[starterId]).map(b => Biome[b.biome]); + if (biomes.length === 0) { + biomes.push("Uncatchable"); + } + const showNoBiome = (biomes.length === 0 && this.filterBar.getVals(DropDownColumn.BIOME).length === 36) ? true : false; + const fitsBiome = this.filterBar.getVals(DropDownColumn.BIOME).some(item => biomes.includes(indexToBiome.get(item) ?? "")) || showNoBiome; + + + // Caught / Shiny filter + const isNonShinyCaught = !!(caughtAttr & DexAttr.NON_SHINY); + const isShinyCaught = !!(caughtAttr & DexAttr.SHINY); + const isVariant1Caught = isShinyCaught && !!(caughtAttr & DexAttr.DEFAULT_VARIANT); + const isVariant2Caught = isShinyCaught && !!(caughtAttr & DexAttr.VARIANT_2); + const isVariant3Caught = isShinyCaught && !!(caughtAttr & DexAttr.VARIANT_3); + const isUncaught = !isNonShinyCaught && !isVariant1Caught && !isVariant2Caught && !isVariant3Caught; + const fitsCaught = this.filterBar.getVals(DropDownColumn.CAUGHT).some(caught => { + if (caught === "SHINY3") { + return isVariant3Caught; + } else if (caught === "SHINY2") { + return isVariant2Caught && !isVariant3Caught; + } else if (caught === "SHINY") { + return isVariant1Caught && !isVariant2Caught && !isVariant3Caught; + } else if (caught === "NORMAL") { + return isNonShinyCaught && !isVariant1Caught && !isVariant2Caught && !isVariant3Caught; + } else if (caught === "UNCAUGHT") { + return isUncaught; + } + }); + + // Passive Filter + const isPassiveUnlocked = starterData.passiveAttr > 0; + const isPassiveUnlockable = this.isPassiveAvailable(container.species.speciesId) && !isPassiveUnlocked; + const fitsPassive = this.filterBar.getVals(DropDownColumn.UNLOCKS).some(unlocks => { + if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.ON) { + return isPassiveUnlocked; + } else if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.EXCLUDE) { + return isStarterProgressable && !isPassiveUnlocked; + } else if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.UNLOCKABLE) { + return isPassiveUnlockable; + } else if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.OFF) { + return true; + } + }); + + // Cost Reduction Filter + const isCostReducedByOne = starterData.valueReduction === 1; + const isCostReducedByTwo = starterData.valueReduction === 2; + const isCostReductionUnlockable = this.isValueReductionAvailable(container.species.speciesId); + const fitsCostReduction = this.filterBar.getVals(DropDownColumn.UNLOCKS).some(unlocks => { + if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.ON) { + return isCostReducedByOne || isCostReducedByTwo; + } else if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.ONE) { + return isCostReducedByOne; + } else if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.TWO) { + return isCostReducedByTwo; + } else if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.EXCLUDE) { + return isStarterProgressable && !(isCostReducedByOne || isCostReducedByTwo); + } else if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.UNLOCKABLE) { + return isCostReductionUnlockable; + } else if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.OFF) { + return true; + } + }); + + // Starter Filter + const isStarter = this.getStarterSpeciesId(container.species.speciesId) === container.species.speciesId; + const fitsStarter = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { + if (misc.val === "STARTER" && misc.state === DropDownState.ON) { + return isStarter; + } + if (misc.val === "STARTER" && misc.state === DropDownState.EXCLUDE) { + return !isStarter; + } + if (misc.val === "STARTER" && misc.state === DropDownState.OFF) { + return true; + } + }); + + // Favorite Filter + const isFavorite = this.starterPreferences[container.species.speciesId]?.favorite ?? false; + const fitsFavorite = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { + if (misc.val === "FAVORITE" && misc.state === DropDownState.ON) { + return isFavorite; + } + if (misc.val === "FAVORITE" && misc.state === DropDownState.EXCLUDE) { + return !isFavorite; + } + if (misc.val === "FAVORITE" && misc.state === DropDownState.OFF) { + return true; + } + }); + + // Ribbon / Classic Win Filter + const hasWon = starterData.classicWinCount > 0; + const hasNotWon = starterData.classicWinCount === 0; + const isUndefined = starterData.classicWinCount === undefined; + const fitsWin = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { + if (misc.val === "WIN" && misc.state === DropDownState.ON) { + return hasWon; + } else if (misc.val === "WIN" && misc.state === DropDownState.EXCLUDE) { + return hasNotWon || isUndefined; + } else if (misc.val === "WIN" && misc.state === DropDownState.OFF) { + return true; + } + }); + + // HA Filter + const speciesHasHiddenAbility = container.species.abilityHidden !== container.species.ability1 && container.species.abilityHidden !== Abilities.NONE; + const hasHA = starterData.abilityAttr & AbilityAttr.ABILITY_HIDDEN; + const fitsHA = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { + if (misc.val === "HIDDEN_ABILITY" && misc.state === DropDownState.ON) { + return hasHA; + } else if (misc.val === "HIDDEN_ABILITY" && misc.state === DropDownState.EXCLUDE) { + return speciesHasHiddenAbility && !hasHA; + } else if (misc.val === "HIDDEN_ABILITY" && misc.state === DropDownState.OFF) { + return true; + } + }); + + // Egg Purchasable Filter + const isEggPurchasable = this.isSameSpeciesEggAvailable(container.species.speciesId); + const fitsEgg = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { + if (misc.val === "EGG" && misc.state === DropDownState.ON) { + return isEggPurchasable; + } else if (misc.val === "EGG" && misc.state === DropDownState.EXCLUDE) { + return isStarterProgressable && !isEggPurchasable; + } else if (misc.val === "EGG" && misc.state === DropDownState.OFF) { + return true; + } + }); + + // Pokerus Filter + const fitsPokerus = this.filterBar.getVals(DropDownColumn.MISC).some(misc => { + if (misc.val === "POKERUS" && misc.state === DropDownState.ON) { + return this.pokerusSpecies.includes(container.species); + } else if (misc.val === "POKERUS" && misc.state === DropDownState.EXCLUDE) { + return !this.pokerusSpecies.includes(container.species); + } else if (misc.val === "POKERUS" && misc.state === DropDownState.OFF) { + return true; + } + }); + + if (fitsName && fitsAbilities && fitsMoves && fitsGen && fitsBiome && fitsType && fitsCaught && fitsPassive && fitsCostReduction && fitsStarter && fitsFavorite && fitsWin && fitsHA && fitsEgg && fitsPokerus) { + this.filteredPokemonContainers.push(container); + } + }); + + this.starterSelectScrollBar.setTotalRows(Math.max(Math.ceil(this.filteredPokemonContainers.length / 9), 1)); + this.starterSelectScrollBar.setScrollCursor(0); + + // sort + const sort = this.filterBar.getVals(DropDownColumn.SORT)[0]; + this.filteredPokemonContainers.sort((a, b) => { + switch (sort.val) { + default: + break; + case SortCriteria.NUMBER: + return (a.species.speciesId - b.species.speciesId) * -sort.dir; + case SortCriteria.COST: + return (a.cost - b.cost) * -sort.dir; + case SortCriteria.CANDY: + const candyCountA = globalScene.gameData.starterData[a.species.speciesId].candyCount; + const candyCountB = globalScene.gameData.starterData[b.species.speciesId].candyCount; + return (candyCountA - candyCountB) * -sort.dir; + case SortCriteria.IV: + const avgIVsA = globalScene.gameData.dexData[a.species.speciesId].ivs.reduce((a, b) => a + b, 0) / globalScene.gameData.dexData[a.species.speciesId].ivs.length; + const avgIVsB = globalScene.gameData.dexData[b.species.speciesId].ivs.reduce((a, b) => a + b, 0) / globalScene.gameData.dexData[b.species.speciesId].ivs.length; + return (avgIVsA - avgIVsB) * -sort.dir; + case SortCriteria.NAME: + return a.species.name.localeCompare(b.species.name) * -sort.dir; + case SortCriteria.CAUGHT: + return (globalScene.gameData.dexData[a.species.speciesId].caughtCount - globalScene.gameData.dexData[b.species.speciesId].caughtCount) * -sort.dir; + case SortCriteria.HATCHED: + return (globalScene.gameData.dexData[this.getStarterSpeciesId(a.species.speciesId)].hatchedCount - globalScene.gameData.dexData[this.getStarterSpeciesId(b.species.speciesId)].hatchedCount) * -sort.dir; + } + return 0; + }); + + this.updateScroll(); + }; + + updateScroll = () => { + const maxColumns = 9; + const maxRows = 9; + const onScreenFirstIndex = this.scrollCursor * maxColumns; + const onScreenLastIndex = Math.min(this.filteredPokemonContainers.length - 1, onScreenFirstIndex + maxRows * maxColumns - 1); + + this.starterSelectScrollBar.setScrollCursor(this.scrollCursor); + + this.pokerusCursorObjs.forEach(cursorObj => cursorObj.setVisible(false)); + + let pokerusCursorIndex = 0; + this.filteredPokemonContainers.forEach((container, i) => { + const pos = calcStarterPosition(i, this.scrollCursor); + container.setPosition(pos.x, pos.y); + if (i < onScreenFirstIndex || i > onScreenLastIndex) { + container.setVisible(false); + return; + } else { + container.setVisible(true); + + if (this.showDecorations) { + + if (this.pokerusSpecies.includes(container.species)) { + this.pokerusCursorObjs[pokerusCursorIndex].setPosition(pos.x - 1, pos.y + 1); + this.pokerusCursorObjs[pokerusCursorIndex].setVisible(true); + pokerusCursorIndex++; + } + + const speciesId = container.species.speciesId; + const caughtAttr = globalScene.gameData.dexData[speciesId].caughtAttr & globalScene.gameData.dexData[this.getStarterSpeciesId(speciesId)].caughtAttr & container.species.getFullUnlocksData(); + this.updateStarterValueLabel(container); + + container.label.setVisible(true); + const speciesVariants = speciesId && caughtAttr & DexAttr.SHINY + ? [ DexAttr.DEFAULT_VARIANT, DexAttr.VARIANT_2, DexAttr.VARIANT_3 ].filter(v => !!(caughtAttr & v)) + : []; + for (let v = 0; v < 3; v++) { + const hasVariant = speciesVariants.length > v; + container.shinyIcons[v].setVisible(hasVariant); + if (hasVariant) { + container.shinyIcons[v].setTint(getVariantTint(speciesVariants[v] === DexAttr.DEFAULT_VARIANT ? 0 : speciesVariants[v] === DexAttr.VARIANT_2 ? 1 : 2)); + } + } + + container.starterPassiveBgs.setVisible(!!globalScene.gameData.starterData[this.getStarterSpeciesId(speciesId)].passiveAttr); + container.hiddenAbilityIcon.setVisible(!!caughtAttr && !!(globalScene.gameData.starterData[this.getStarterSpeciesId(speciesId)].abilityAttr & 4)); + container.classicWinIcon.setVisible(globalScene.gameData.starterData[this.getStarterSpeciesId(speciesId)].classicWinCount > 0); + container.favoriteIcon.setVisible(this.starterPreferences[speciesId]?.favorite ?? false); + + // 'Candy Icon' mode + if (globalScene.candyUpgradeDisplay === 0) { + + if (!starterColors[this.getStarterSpeciesId(speciesId)]) { + // Default to white if no colors are found + starterColors[this.getStarterSpeciesId(speciesId)] = [ "ffffff", "ffffff" ]; + } + + // Set the candy colors + container.candyUpgradeIcon.setTint(argbFromRgba(rgbHexToRgba(starterColors[this.getStarterSpeciesId(speciesId)][0]))); + container.candyUpgradeOverlayIcon.setTint(argbFromRgba(rgbHexToRgba(starterColors[this.getStarterSpeciesId(speciesId)][1]))); + + } else if (globalScene.candyUpgradeDisplay === 1) { + container.candyUpgradeIcon.setVisible(false); + container.candyUpgradeOverlayIcon.setVisible(false); + } + } else { + container.label.setVisible(false); + for (let v = 0; v < 3; v++) { + container.shinyIcons[v].setVisible(false); + } + container.starterPassiveBgs.setVisible(false); + container.hiddenAbilityIcon.setVisible(false); + container.classicWinIcon.setVisible(false); + container.favoriteIcon.setVisible(false); + + container.candyUpgradeIcon.setVisible(false); + container.candyUpgradeOverlayIcon.setVisible(false); + } + } + }); + }; + + setCursor(cursor: number): boolean { + let changed = false; + + if (this.filterMode) { + changed = this.filterBarCursor !== cursor; + this.filterBarCursor = cursor; + this.filterBar.setCursor(cursor); + } else if (this.filterTextMode) { + changed = this.filterTextCursor !== cursor; + this.filterTextCursor = cursor; + this.filterText.setCursor(cursor); + } else { + cursor = Math.max(Math.min(this.filteredPokemonContainers.length - 1, cursor), 0); + changed = super.setCursor(cursor); + + const pos = calcStarterPosition(cursor, this.scrollCursor); + this.cursorObj.setPosition(pos.x - 1, pos.y + 1); + + const species = this.filteredPokemonContainers[cursor]?.species; + + if (species) { + this.setSpecies(species); + } + } + + return changed; + } + + setFilterMode(filterMode: boolean): boolean { + this.cursorObj.setVisible(!filterMode); + this.filterBar.cursorObj.setVisible(filterMode); + this.pokemonSprite.setVisible(false); + this.showFormTrayIconElement.setVisible(false); + this.showFormTrayLabel.setVisible(false); + + if (filterMode !== this.filterMode) { + this.filterMode = filterMode; + this.setCursor(filterMode ? this.filterBarCursor : this.cursor); + if (filterMode) { + this.setSpecies(null); + } + return true; + } + return false; + } + + setFilterTextMode(filterTextMode: boolean): boolean { + this.cursorObj.setVisible(!filterTextMode); + this.filterText.cursorObj.setVisible(filterTextMode); + this.pokemonSprite.setVisible(false); + this.showFormTrayIconElement.setVisible(false); + this.showFormTrayLabel.setVisible(false); + + if (filterTextMode !== this.filterTextMode) { + this.filterTextMode = filterTextMode; + this.setCursor(filterTextMode ? this.filterTextCursor : this.cursor); + if (filterTextMode) { + this.setSpecies(null); + } + return true; + } + return false; + } + + openFormTray(species: PokemonSpecies): boolean { + + this.trayForms = species.forms.filter(f => !f.isUnobtainable); + + this.trayNumIcons = this.trayForms.length; + this.trayRows = Math.floor(this.trayNumIcons / 9) + (this.trayNumIcons % 9 === 0 ? 0 : 1); + this.trayColumns = Math.min(this.trayNumIcons, 9); + + const maxColumns = 9; + const onScreenFirstIndex = this.scrollCursor * maxColumns; + const boxCursor = this.cursor - onScreenFirstIndex; + const boxCursorY = Math.floor(boxCursor / maxColumns); + const boxCursorX = boxCursor - boxCursorY * 9; + const spaceBelow = 9 - 1 - boxCursorY; + const spaceRight = 9 - boxCursorX; + const boxPos = calcStarterPosition(this.cursor, this.scrollCursor); + const goUp = this.trayRows <= spaceBelow - 1 ? 0 : 1; + const goLeft = this.trayColumns <= spaceRight ? 0 : 1; + + this.trayBg.setSize(13 + this.trayColumns * 17, 8 + this.trayRows * 18); + this.formTrayContainer.setX( + (goLeft ? boxPos.x - 18 * (this.trayColumns - spaceRight) : boxPos.x) - 3 + ); + this.formTrayContainer.setY( + goUp ? boxPos.y - this.trayBg.height : boxPos.y + 17 + ); + + const dexEntry = globalScene.gameData.dexData[species.speciesId]; + const dexAttr = this.getCurrentDexProps(species.speciesId); + const props = this.getSanitizedProps(globalScene.gameData.getSpeciesDexAttrProps(this.lastSpecies, dexAttr)); + + this.trayContainers = []; + this.trayForms.map((f, index) => { + const isFormCaught = dexEntry ? (dexEntry.caughtAttr & species.getFullUnlocksData() & globalScene.gameData.getFormAttr(f.formIndex ?? 0)) > 0n : false; + const isFormSeen = dexEntry ? (dexEntry.seenAttr & globalScene.gameData.getFormAttr(f.formIndex ?? 0)) > 0n : false; + const formContainer = new PokedexMonContainer(species, { formIndex: f.formIndex, female: props.female, shiny: props.shiny, variant: props.variant }); + this.iconAnimHandler.addOrUpdate(formContainer.icon, PokemonIconAnimMode.NONE); + // Setting tint, for all saves some caught forms may only show up as seen + if (isFormCaught || globalScene.dexForDevs) { + formContainer.icon.clearTint(); + } else if (isFormSeen) { + formContainer.icon.setTint(0x808080); + } + formContainer.setPosition(5 + (index % 9) * 18, 4 + Math.floor(index / 9) * 17); + this.formTrayContainer.add(formContainer); + this.trayContainers.push(formContainer); + }); + + this.showingTray = true; + + this.setTrayCursor(0); + + this.formTrayContainer.setVisible(true); + + this.showFormTrayIconElement.setVisible(false); + this.showFormTrayLabel.setVisible(false); + + return true; + } + + closeFormTray(): boolean { + + this.trayContainers.forEach(obj => { + this.formTrayContainer.remove(obj, true); // Removes from container and destroys it + }); + + this.trayContainers = []; + this.formTrayContainer.setVisible(false); + this.showingTray = false; + + this.setSpeciesDetails(this.lastSpecies); + return true; + } + + setTrayCursor(cursor: number): boolean { + if (!this.showingTray) { + return false; + } + + cursor = Phaser.Math.Clamp(this.trayContainers.length - 1, cursor, 0); + const changed = this.trayCursor !== cursor; + if (changed) { + this.trayCursor = cursor; + } + + this.trayCursorObj.setPosition(5 + (cursor % 9) * 18, 4 + Math.floor(cursor / 9) * 17); + + const species = this.lastSpecies; + const formIndex = this.trayForms[cursor].formIndex; + + this.setSpeciesDetails(species, { formIndex: formIndex }); + + return changed; + } + + getFriendship(speciesId: number) { + let currentFriendship = globalScene.gameData.starterData[this.getStarterSpeciesId(speciesId)].friendship; + if (!currentFriendship || currentFriendship === undefined) { + currentFriendship = 0; + } + + const friendshipCap = getStarterValueFriendshipCap(speciesStarterCosts[speciesId]); + + return { currentFriendship, friendshipCap }; + } + + setSpecies(species: PokemonSpecies | null) { + + this.speciesStarterDexEntry = species ? globalScene.gameData.dexData[species.speciesId] : null; + + if (!species && globalScene.ui.getTooltip().visible) { + globalScene.ui.hideTooltip(); + } + + if (this.lastSpecies) { + const dexAttr = this.getCurrentDexProps(this.lastSpecies.speciesId); + const props = this.getSanitizedProps(globalScene.gameData.getSpeciesDexAttrProps(this.lastSpecies, dexAttr)); + const speciesIndex = this.allSpecies.indexOf(this.lastSpecies); + const lastSpeciesIcon = this.pokemonContainers[speciesIndex].icon; + this.checkIconId(lastSpeciesIcon, this.lastSpecies, props.female, props.formIndex, props.shiny, props.variant); + this.iconAnimHandler.addOrUpdate(lastSpeciesIcon, PokemonIconAnimMode.NONE); + + // Resume the animation for the previously selected species + const icon = this.pokemonContainers[speciesIndex].icon; + globalScene.tweens.getTweensOf(icon).forEach(tween => tween.resume()); + } + + this.lastSpecies = species!; // TODO: is this bang correct? + + if (species && (this.speciesStarterDexEntry?.seenAttr || this.speciesStarterDexEntry?.caughtAttr || globalScene.dexForDevs)) { + + this.pokemonNumberText.setText(i18next.t("pokedexUiHandler:pokemonNumber") + padInt(species.speciesId, 4)); + + this.pokemonNameText.setText(species.name); + + if (this.speciesStarterDexEntry?.caughtAttr || globalScene.dexForDevs) { + + // Pause the animation when the species is selected + const speciesIndex = this.allSpecies.indexOf(species); + const icon = this.pokemonContainers[speciesIndex].icon; + + if (this.isUpgradeAnimationEnabled()) { + globalScene.tweens.getTweensOf(icon).forEach(tween => tween.pause()); + // Reset the position of the icon + icon.x = -2; + icon.y = 2; + } + + // Initiates the small up and down idle animation + this.iconAnimHandler.addOrUpdate(icon, PokemonIconAnimMode.PASSIVE); + + const speciesForm = getPokemonSpeciesForm(species.speciesId, 0); + this.setTypeIcons(speciesForm.type1, speciesForm.type2); + + this.setSpeciesDetails(species, {}); + + this.pokemonSprite.clearTint(); + + this.type1Icon.clearTint(); + this.type2Icon.clearTint(); + } else { + this.type1Icon.setVisible(true); + this.type2Icon.setVisible(true); + + this.setSpeciesDetails(species); + this.pokemonSprite.setTint(0x808080); + } + } else { + this.pokemonNumberText.setText(species ? i18next.t("pokedexUiHandler:pokemonNumber") + padInt(species.speciesId, 4) : ""); + this.pokemonNameText.setText(species ? "???" : ""); + this.pokemonFormText.setText(""); + this.type1Icon.setVisible(false); + this.type2Icon.setVisible(false); + if (species) { + this.pokemonSprite.setTint(0x000000); + this.setSpeciesDetails(species, {}); + } + } + } + + setSpeciesDetails(species: PokemonSpecies, options: SpeciesDetails = {}): void { + let { shiny, formIndex, female, variant } = options; + + // We will only update the sprite if there is a change to form, shiny/variant + // or gender for species with gender sprite differences + const shouldUpdateSprite = true; + + if (species?.forms?.find(f => f.formKey === "female")) { + if (female !== undefined) { + formIndex = female ? 1 : 0; + } else if (formIndex !== undefined) { + female = formIndex === 1; + } + } + + this.pokemonSprite.setVisible(false); + + if (this.assetLoadCancelled) { + this.assetLoadCancelled.value = true; + this.assetLoadCancelled = null; + } + + if (species) { + const dexEntry = globalScene.gameData.dexData[species.speciesId]; + const caughtAttr = dexEntry.caughtAttr & globalScene.gameData.dexData[this.getStarterSpeciesId(species.speciesId)].caughtAttr & species.getFullUnlocksData(); + + if (!caughtAttr) { + const props = this.getSanitizedProps(globalScene.gameData.getSpeciesDexAttrProps(species, this.getCurrentDexProps(species.speciesId))); + + if (shiny === undefined) { + shiny = props.shiny; + } + if (formIndex === undefined) { + formIndex = props.formIndex; + } + if (female === undefined) { + female = props.female; + } + if (variant === undefined) { + variant = props.variant; + } + } + + const isFormCaught = dexEntry ? (caughtAttr & globalScene.gameData.getFormAttr(formIndex ?? 0)) > 0n : false; + const isFormSeen = dexEntry ? (dexEntry.seenAttr & globalScene.gameData.getFormAttr(formIndex ?? 0)) > 0n : false; + + const assetLoadCancelled = new BooleanHolder(false); + this.assetLoadCancelled = assetLoadCancelled; + + if (shouldUpdateSprite) { + species.loadAssets(female!, formIndex, shiny, variant, true).then(() => { // TODO: is this bang correct? + if (assetLoadCancelled.value) { + return; + } + this.assetLoadCancelled = null; + this.speciesLoaded.set(species.speciesId, true); + this.pokemonSprite.play(species.getSpriteKey(female!, formIndex, shiny, variant)); // TODO: is this bang correct? + this.pokemonSprite.setPipelineData("shiny", shiny); + this.pokemonSprite.setPipelineData("variant", variant); + this.pokemonSprite.setPipelineData("spriteKey", species.getSpriteKey(female!, formIndex, shiny, variant)); // TODO: is this bang correct? + this.pokemonSprite.setVisible(true); + }); + } else { + this.pokemonSprite.setVisible(!(this.filterMode || this.filterTextMode)); + } + + if (isFormCaught || globalScene.dexForDevs) { + this.pokemonSprite.clearTint(); + } else if (isFormSeen) { + this.pokemonSprite.setTint(0x808080); + } else { + this.pokemonSprite.setTint(0); + } + + if (isFormCaught || isFormSeen || globalScene.dexForDevs) { + // TODO: change this once forms are refactored + if (normalForm.includes(species.speciesId) && !formIndex) { + this.pokemonFormText.setText(""); + } else { + this.pokemonFormText.setText(species.getFormNameToDisplay(formIndex, false)); + } + } else { + this.pokemonFormText.setText(""); + } + + if (isFormCaught || isFormSeen || globalScene.dexForDevs) { + const speciesForm = getPokemonSpeciesForm(species.speciesId, formIndex ?? 0); // TODO: always selecting the first form + this.setTypeIcons(speciesForm.type1, speciesForm.type2); + } else { + this.setTypeIcons(null, null); + } + + if (species?.forms?.filter(f => !f.isUnobtainable).length > 1) { + if (!this.showingTray) { + this.showFormTrayIconElement.setVisible(true); + this.showFormTrayLabel.setVisible(true); + } + this.canShowFormTray = true; + } else { + this.showFormTrayIconElement.setVisible(false); + this.showFormTrayLabel.setVisible(false); + this.canShowFormTray = false; + } + + } else { + this.setTypeIcons(null, null); + } + + } + + setTypeIcons(type1: Type | null, type2: Type | null): void { + if (type1 !== null) { + this.type1Icon.setVisible(true); + this.type1Icon.setFrame(Type[type1].toLowerCase()); + } else { + this.type1Icon.setVisible(false); + } + if (type2 !== null) { + this.type2Icon.setVisible(true); + this.type2Icon.setFrame(Type[type2].toLowerCase()); + } else { + this.type2Icon.setVisible(false); + } + } + + updateStarterValueLabel(starter: PokedexMonContainer): void { + const speciesId = starter.species.speciesId; + const baseStarterValue = speciesStarterCosts[speciesId]; + const starterValue = globalScene.gameData.getSpeciesStarterValue(this.getStarterSpeciesId(speciesId)); + starter.cost = starterValue; + let valueStr = starterValue.toString(); + if (valueStr.startsWith("0.")) { + valueStr = valueStr.slice(1); + } + starter.label.setText(valueStr); + let textStyle: TextStyle; + switch (baseStarterValue - starterValue) { + case 0: + textStyle = TextStyle.WINDOW; + break; + case 1: + case 0.5: + textStyle = TextStyle.SUMMARY_BLUE; + break; + default: + textStyle = TextStyle.SUMMARY_GOLD; + break; + } + if (baseStarterValue - starterValue > 0) { + starter.label.setColor(this.getTextColor(textStyle)); + starter.label.setShadowColor(this.getTextColor(textStyle, true)); + } + } + + tryExit(): boolean { + this.blockInput = true; + const ui = this.getUi(); + + const cancel = () => { + ui.setMode(Mode.POKEDEX, "refresh"); + this.clearText(); + this.blockInput = false; + }; + ui.showText(i18next.t("pokedexUiHandler:confirmExit"), null, () => { + ui.setModeWithoutClear(Mode.CONFIRM, () => { + ui.setMode(Mode.POKEDEX, "refresh"); + this.clearText(); + this.clear(); + ui.revertMode(); + }, cancel, null, null, 19); + }); + + return true; + } + + + /** + * Creates a temporary dex attr props that will be used to + * display the correct shiny, variant, and form based on the StarterPreferences + * + * @param speciesId the id of the species to get props for + * @returns the dex props + */ + getCurrentDexProps(speciesId: number): bigint { + let props = 0n; + const species = allSpecies.find(sp => sp.speciesId === speciesId); + const caughtAttr = globalScene.gameData.dexData[speciesId].caughtAttr & globalScene.gameData.dexData[this.getStarterSpeciesId(speciesId)].caughtAttr & (species?.getFullUnlocksData() ?? 0n); + + /* this checks the gender of the pokemon; this works by checking a) that the starter preferences for the species exist, and if so, is it female. If so, it'll add DexAttr.FEMALE to our temp props + * It then checks b) if the caughtAttr for the pokemon is female and NOT male - this means that the ONLY gender we've gotten is female, and we need to add DexAttr.FEMALE to our temp props + * If neither of these pass, we add DexAttr.MALE to our temp props + */ + if (this.starterPreferences[speciesId]?.female || ((caughtAttr & DexAttr.FEMALE) > 0n && (caughtAttr & DexAttr.MALE) === 0n)) { + props += DexAttr.FEMALE; + } else { + props += DexAttr.MALE; + } + /* This part is very similar to above, but instead of for gender, it checks for shiny within starter preferences. + * If they're not there, it enables shiny state by default if any shiny was caught + */ + if (this.starterPreferences[speciesId]?.shiny || ((caughtAttr & DexAttr.SHINY) > 0n && this.starterPreferences[speciesId]?.shiny !== false)) { + props += DexAttr.SHINY; + if (this.starterPreferences[speciesId]?.variant !== undefined) { + props += BigInt(Math.pow(2, this.starterPreferences[speciesId]?.variant)) * DexAttr.DEFAULT_VARIANT; + } else { + /* This calculates the correct variant if there's no starter preferences for it. + * This gets the highest tier variant that you've caught and adds it to the temp props + */ + if ((caughtAttr & DexAttr.VARIANT_3) > 0) { + props += DexAttr.VARIANT_3; + } else if ((caughtAttr & DexAttr.VARIANT_2) > 0) { + props += DexAttr.VARIANT_2; + } else { + props += DexAttr.DEFAULT_VARIANT; + } + } + } else { + props += DexAttr.NON_SHINY; + props += DexAttr.DEFAULT_VARIANT; // we add the default variant here because non shiny versions are listed as default variant + } + if (this.starterPreferences[speciesId]?.form) { // this checks for the form of the pokemon + props += BigInt(Math.pow(2, this.starterPreferences[speciesId]?.form)) * DexAttr.DEFAULT_FORM; + } else { + // Get the first unlocked form + props += globalScene.gameData.getFormAttr(globalScene.gameData.getFormIndex(caughtAttr)); + } + + return props; + } + + override destroy(): void { + this.pokemonContainers = []; + } + + clearText() { + this.starterSelectMessageBoxContainer.setVisible(false); + super.clearText(); + } + + clear(): void { + super.clear(); + + this.cursor = -1; + globalScene.ui.hideTooltip(); + + this.starterSelectContainer.setVisible(false); + this.blockInput = false; + } + + checkIconId(icon: Phaser.GameObjects.Sprite, species: PokemonSpecies, female: boolean, formIndex: number, shiny: boolean, variant: number) { + if (icon.frame.name !== species.getIconId(female, formIndex, shiny, variant)) { + console.log(`${species.name}'s icon ${icon.frame.name} does not match getIconId with female: ${female}, formIndex: ${formIndex}, shiny: ${shiny}, variant: ${variant}`); + icon.setTexture(species.getIconAtlasKey(formIndex, false, variant)); + icon.setFrame(species.getIconId(female, formIndex, false, variant)); + } + } +} diff --git a/src/ui/pokemon-info-container.ts b/src/ui/pokemon-info-container.ts index 554cea39731..eda5ac3f580 100644 --- a/src/ui/pokemon-info-container.ts +++ b/src/ui/pokemon-info-container.ts @@ -13,7 +13,6 @@ import ConfirmUiHandler from "./confirm-ui-handler"; import { StatsContainer } from "./stats-container"; import { TextStyle, addBBCodeTextObject, addTextObject, getTextColor } from "./text"; import { addWindow } from "./ui-theme"; -import { Species } from "#enums/species"; interface LanguageSetting { infoContainerTextSize: string; @@ -218,23 +217,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { this.pokemonGenderText.setVisible(false); } - const formKey = (pokemon.species?.forms?.[pokemon.formIndex!]?.formKey); - const formText = Utils.capitalizeString(formKey, "-", false, false) || ""; - const speciesName = Utils.capitalizeString(Species[pokemon.species.speciesId], "_", true, false); - - let formName = ""; - if (pokemon.species.speciesId === Species.ARCEUS) { - formName = i18next.t(`pokemonInfo:Type.${formText?.toUpperCase()}`); - } else { - const i18key = `pokemonForm:${speciesName}${formText}`; - if (i18next.exists(i18key)) { - formName = i18next.t(i18key); - } else { - const rootSpeciesName = Utils.capitalizeString(Species[pokemon.species.getRootSpeciesId()], "_", true, false); - const i18RootKey = `pokemonForm:${rootSpeciesName}${formText}`; - formName = i18next.exists(i18RootKey) ? i18next.t(i18RootKey) : formText; - } - } + const formName = pokemon.species.getFormNameToDisplay(pokemon.formIndex); if (formName) { this.pokemonFormLabelText.setVisible(true); diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 938779dfee6..65c159c62a8 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -53,7 +53,7 @@ import { EncounterPhase } from "#app/phases/encounter-phase"; import { TitlePhase } from "#app/phases/title-phase"; import { Abilities } from "#enums/abilities"; import { getPassiveCandyCount, getValueReductionCandyCounts, getSameSpeciesEggCandyCounts } from "#app/data/balance/starters"; -import { BooleanHolder, capitalizeString, fixedInt, getLocalizedSpriteKey, isNullOrUndefined, NumberHolder, padInt, randIntRange, rgbHexToRgba, toReadableString } from "#app/utils"; +import { BooleanHolder, fixedInt, getLocalizedSpriteKey, isNullOrUndefined, NumberHolder, padInt, randIntRange, rgbHexToRgba, toReadableString } from "#app/utils"; import type { Nature } from "#enums/nature"; import { PLAYER_PARTY_MAX_SIZE } from "#app/constants"; @@ -1970,6 +1970,21 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } }); } + options.push({ + label: i18next.t("menuUiHandler:POKEDEX"), + handler: () => { + ui.setMode(Mode.STARTER_SELECT).then(() => { + const attributes = { + shiny: starterAttributes.shiny, + variant: starterAttributes.variant, + form: starterAttributes.form, + female: starterAttributes.female + }; + ui.setOverlayMode(Mode.POKEDEX_PAGE, this.lastSpecies, starterAttributes.form, attributes); + }); + return true; + } + }); options.push({ label: i18next.t("menu:cancel"), handler: () => { @@ -3393,15 +3408,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { }) as StarterMoveset; const speciesForm = getPokemonSpeciesForm(species.speciesId, formIndex!); // TODO: is the bang correct? - const formText = capitalizeString(species?.forms[formIndex!]?.formKey, "-", false, false); // TODO: is the bang correct? - - const speciesName = capitalizeString(Species[species.speciesId], "_", true, false); - - if (species.speciesId === Species.ARCEUS) { - this.pokemonFormText.setText(i18next.t(`pokemonInfo:Type.${formText?.toUpperCase()}`)); - } else { - this.pokemonFormText.setText(formText ? i18next.t(`pokemonForm:${speciesName}${formText}`) : ""); - } + const formText = species.getFormNameToDisplay(formIndex); + this.pokemonFormText.setText(formText); this.setTypeIcons(speciesForm.type1, speciesForm.type2); } else { diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts index 3305b3f7aa2..cf5d40bc006 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -96,6 +96,9 @@ export default class SummaryUiHandler extends UiHandler { private friendshipText: Phaser.GameObjects.Text; private friendshipIcon: Phaser.GameObjects.Sprite; private friendshipOverlay: Phaser.GameObjects.Sprite; + private permStatsContainer: Phaser.GameObjects.Container; + private ivContainer: Phaser.GameObjects.Container; + private statsContainer: Phaser.GameObjects.Container; private descriptionScrollTween: Phaser.Tweens.Tween | null; private moveCursorBlinkTimer: Phaser.Time.TimerEvent | null; @@ -534,6 +537,10 @@ export default class SummaryUiHandler extends UiHandler { this.passiveContainer.nameText?.setVisible(!this.passiveContainer.descriptionText?.visible); this.passiveContainer.descriptionText?.setVisible(!this.passiveContainer.descriptionText.visible); this.passiveContainer.labelImage.setVisible(!this.passiveContainer.labelImage.visible); + } else if (this.cursor === Page.STATS) { + //Show IVs + this.permStatsContainer.setVisible(!this.permStatsContainer.visible); + this.ivContainer.setVisible(!this.ivContainer.visible); } } else if (button === Button.CANCEL) { if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE) { @@ -877,8 +884,13 @@ export default class SummaryUiHandler extends UiHandler { profileContainer.add(memoText); break; case Page.STATS: - const statsContainer = globalScene.add.container(0, -pageBg.height); - pageContainer.add(statsContainer); + this.statsContainer = globalScene.add.container(0, -pageBg.height); + pageContainer.add(this.statsContainer); + this.permStatsContainer = globalScene.add.container(27, 56); + this.statsContainer.add(this.permStatsContainer); + this.ivContainer = globalScene.add.container(27, 56); + this.statsContainer.add(this.ivContainer); + this.statsContainer.setVisible(true); PERMANENT_STATS.forEach((stat, s) => { const statName = i18next.t(getStatKey(stat)); @@ -887,18 +899,27 @@ export default class SummaryUiHandler extends UiHandler { const natureStatMultiplier = getNatureStatMultiplier(this.pokemon?.getNature()!, s); // TODO: is this bang correct? - const statLabel = addTextObject(27 + 115 * colIndex + (colIndex === 1 ? 5 : 0), 56 + 16 * rowIndex, statName, natureStatMultiplier === 1 ? TextStyle.SUMMARY : natureStatMultiplier > 1 ? TextStyle.SUMMARY_PINK : TextStyle.SUMMARY_BLUE); + const statLabel = addTextObject(115 * colIndex + (colIndex === 1 ? 5 : 0), 16 * rowIndex, statName, natureStatMultiplier === 1 ? TextStyle.SUMMARY : natureStatMultiplier > 1 ? TextStyle.SUMMARY_PINK : TextStyle.SUMMARY_BLUE); + const ivLabel = addTextObject(115 * colIndex + (colIndex === 1 ? 5 : 0), 16 * rowIndex, statName, this.pokemon?.ivs[stat] === 31 ? TextStyle.SUMMARY_GOLD : TextStyle.SUMMARY); + statLabel.setOrigin(0.5, 0); - statsContainer.add(statLabel); + ivLabel.setOrigin(0.5, 0); + this.permStatsContainer.add(statLabel); + this.ivContainer.add(ivLabel); const statValueText = stat !== Stat.HP ? Utils.formatStat(this.pokemon?.getStat(stat)!) // TODO: is this bang correct? : `${Utils.formatStat(this.pokemon?.hp!, true)}/${Utils.formatStat(this.pokemon?.getMaxHp()!, true)}`; // TODO: are those bangs correct? + const ivText = `${this.pokemon?.ivs[stat]}/31`; - const statValue = addTextObject(120 + 88 * colIndex, 56 + 16 * rowIndex, statValueText, TextStyle.WINDOW_ALT); + const statValue = addTextObject(93 + 88 * colIndex, 16 * rowIndex, statValueText, TextStyle.WINDOW_ALT); statValue.setOrigin(1, 0); - statsContainer.add(statValue); + this.permStatsContainer.add(statValue); + const ivValue = addTextObject(93 + 88 * colIndex, 16 * rowIndex, ivText, TextStyle.WINDOW_ALT); + ivValue.setOrigin(1, 0); + this.ivContainer.add(ivValue); }); + this.ivContainer.setVisible(false); const itemModifiers = (globalScene.findModifiers(m => m instanceof PokemonHeldItemModifier && m.pokemonId === this.pokemon?.id, this.playerParty) as PokemonHeldItemModifier[]) @@ -908,7 +929,7 @@ export default class SummaryUiHandler extends UiHandler { const icon = item.getIcon(true); icon.setPosition((i % 17) * 12 + 3, 14 * Math.floor(i / 17) + 15); - statsContainer.add(icon); + this.statsContainer.add(icon); icon.setInteractive(new Phaser.Geom.Rectangle(0, 0, 32, 32), Phaser.Geom.Rectangle.Contains); icon.on("pointerover", () => globalScene.ui.showTooltip(item.type.name, item.type.getDescription(), true)); @@ -924,26 +945,26 @@ export default class SummaryUiHandler extends UiHandler { const expLabel = addTextObject(6, 112, i18next.t("pokemonSummary:expPoints"), TextStyle.SUMMARY); expLabel.setOrigin(0, 0); - statsContainer.add(expLabel); + this.statsContainer.add(expLabel); const nextLvExpLabel = addTextObject(6, 128, i18next.t("pokemonSummary:nextLv"), TextStyle.SUMMARY); nextLvExpLabel.setOrigin(0, 0); - statsContainer.add(nextLvExpLabel); + this.statsContainer.add(nextLvExpLabel); const expText = addTextObject(208, 112, pkmExp.toString(), TextStyle.WINDOW_ALT); expText.setOrigin(1, 0); - statsContainer.add(expText); + this.statsContainer.add(expText); const nextLvExp = pkmLvl < globalScene.getMaxExpLevel() ? getLevelTotalExp(pkmLvl + 1, pkmSpeciesGrowthRate) - pkmExp : 0; const nextLvExpText = addTextObject(208, 128, nextLvExp.toString(), TextStyle.WINDOW_ALT); nextLvExpText.setOrigin(1, 0); - statsContainer.add(nextLvExpText); + this.statsContainer.add(nextLvExpText); const expOverlay = globalScene.add.image(140, 145, "summary_stats_overlay_exp"); expOverlay.setOrigin(0, 0); - statsContainer.add(expOverlay); + this.statsContainer.add(expOverlay); const expMaskRect = globalScene.make.graphics({}); expMaskRect.setScale(6); @@ -954,6 +975,11 @@ export default class SummaryUiHandler extends UiHandler { const expMask = expMaskRect.createGeometryMask(); expOverlay.setMask(expMask); + this.abilityPrompt = globalScene.add.image(0, 0, !globalScene.inputController?.gamepadSupport ? "summary_profile_prompt_z" : "summary_profile_prompt_a"); + this.abilityPrompt.setPosition(8, 47); + this.abilityPrompt.setVisible(true); + this.abilityPrompt.setOrigin(0, 0); + this.statsContainer.add(this.abilityPrompt); break; case Page.MOVES: this.movesContainer = globalScene.add.container(5, -pageBg.height + 26); diff --git a/src/ui/text.ts b/src/ui/text.ts index fc48c4ea86e..19b0eddb494 100644 --- a/src/ui/text.ts +++ b/src/ui/text.ts @@ -42,6 +42,7 @@ export enum TextStyle { PERFECT_IV, ME_OPTION_DEFAULT, // Default style for choices in ME ME_OPTION_SPECIAL, // Style for choices with special requirements in ME + SHADOW_TEXT // To obscure unavailable options } export interface TextStyleOptions { @@ -359,6 +360,12 @@ export function getTextColor(textStyle: TextStyle, shadow?: boolean, uiTheme: Ui return !shadow ? "#f8b050" : "#c07800"; // Gold } return !shadow ? "#78c850" : "#306850"; // Green + // Leaving the logic in place, in case someone wants to pick an even darker hue for the shadow down the line + case TextStyle.SHADOW_TEXT: + if (isLegacyTheme) { + return !shadow ? "#d0d0c8" : "#d0d0c8"; + } + return !shadow ? "#6b5a73" : "#6b5a73"; } } diff --git a/src/ui/title-ui-handler.ts b/src/ui/title-ui-handler.ts index 538f78e877e..0d69eae0efc 100644 --- a/src/ui/title-ui-handler.ts +++ b/src/ui/title-ui-handler.ts @@ -1,7 +1,7 @@ import OptionSelectUiHandler from "./settings/option-select-ui-handler"; import { Mode } from "./ui"; import * as Utils from "../utils"; -import { TextStyle, addTextObject, getTextStyleOptions } from "./text"; +import { TextStyle, addTextObject } from "./text"; import { getSplashMessages } from "../data/splash-messages"; import i18next from "i18next"; import { TimedEventDisplay } from "#app/timed-event-manager"; @@ -47,8 +47,8 @@ export default class TitleUiHandler extends OptionSelectUiHandler { } this.playerCountLabel = addTextObject( - (globalScene.game.canvas.width / 6) - 2, - (globalScene.game.canvas.height / 6) - 13 - 576 * getTextStyleOptions(TextStyle.WINDOW, globalScene.uiTheme).scale, + // Actual y position will be determined after the title menu has been populated with options + (globalScene.game.canvas.width / 6) - 2, 0, `? ${i18next.t("menu:playersOnline")}`, TextStyle.MESSAGE, { fontSize: "54px" } @@ -96,6 +96,9 @@ export default class TitleUiHandler extends OptionSelectUiHandler { const ret = super.show(args); if (ret) { + // Moving player count to top of the menu + this.playerCountLabel.setY((globalScene.game.canvas.height / 6) - 13 - this.getWindowHeight()); + this.splashMessage = Utils.randItem(getSplashMessages()); this.splashMessageText.setText(i18next.t(this.splashMessage, { count: TitleUiHandler.BATTLES_WON_FALLBACK })); diff --git a/src/ui/ui.ts b/src/ui/ui.ts index 72147e8ccb1..7fbd10b4668 100644 --- a/src/ui/ui.ts +++ b/src/ui/ui.ts @@ -23,6 +23,7 @@ import OptionSelectUiHandler from "./settings/option-select-ui-handler"; import EggHatchSceneHandler from "./egg-hatch-scene-handler"; import EggListUiHandler from "./egg-list-ui-handler"; import EggGachaUiHandler from "./egg-gacha-ui-handler"; +import PokedexUiHandler from "./pokedex-ui-handler"; import { addWindow } from "./ui-theme"; import LoginFormUiHandler from "./login-form-ui-handler"; import RegistrationFormUiHandler from "./registration-form-ui-handler"; @@ -53,6 +54,8 @@ import TestDialogueUiHandler from "#app/ui/test-dialogue-ui-handler"; import AutoCompleteUiHandler from "./autocomplete-ui-handler"; import { Device } from "#enums/devices"; import MysteryEncounterUiHandler from "./mystery-encounter-ui-handler"; +import PokedexScanUiHandler from "./pokedex-scan-ui-handler"; +import PokedexPageUiHandler from "./pokedex-page-ui-handler"; import { NavigationManager } from "./settings/navigationMenu"; export enum Mode { @@ -85,6 +88,9 @@ export enum Mode { GAME_STATS, EGG_LIST, EGG_GACHA, + POKEDEX, + POKEDEX_SCAN, + POKEDEX_PAGE, LOGIN_FORM, REGISTRATION_FORM, LOADING, @@ -109,6 +115,8 @@ const transitionModes = [ Mode.EGG_HATCH_SCENE, Mode.EGG_LIST, Mode.EGG_GACHA, + Mode.POKEDEX, + Mode.POKEDEX_PAGE, Mode.CHALLENGE_SELECT, Mode.RUN_HISTORY, ]; @@ -128,6 +136,7 @@ const noTransitionModes = [ Mode.SETTINGS_KEYBOARD, Mode.ACHIEVEMENTS, Mode.GAME_STATS, + Mode.POKEDEX_SCAN, Mode.LOGIN_FORM, Mode.REGISTRATION_FORM, Mode.LOADING, @@ -193,6 +202,9 @@ export default class UI extends Phaser.GameObjects.Container { new GameStatsUiHandler(), new EggListUiHandler(), new EggGachaUiHandler(), + new PokedexUiHandler(), + new PokedexScanUiHandler(Mode.TEST_DIALOGUE), + new PokedexPageUiHandler(), new LoginFormUiHandler(), new RegistrationFormUiHandler(), new LoadingModalUiHandler(), @@ -563,6 +575,7 @@ export default class UI extends Phaser.GameObjects.Container { revertMode(): Promise { return new Promise(resolve => { + if (!this?.modeChain?.length) { return resolve(false); }